
Scanner de alta fidelidade para php2shell (CVE-2026-109618 e CVE-2026-109619)
Uma ferramenta de linha de comando para detectar CVE-2026-109618 e CVE-2026-109619 em aplicações PHP.
O scanner envia uma requisição de controle multipart mínima seguida de até três sondas multipart elaboradas. As sondas usam chaves de array PHP aninhadas em 62 níveis de profundidade e aumentam de 1 MiB para 20 MiB, correspondendo à lógica de detecção usada pelo scanner interno da Assetnote.
Um alvo é reportado como vulnerável quando a sonda produz um erro de esgotamento de memória do PHP, um HTTP 500 vazio diferencial, uma falha de worker do PHP-FPM, ou uma versão de PHP anunciada conhecida por não estar corrigida. Respostas 5xx iniciais, status comuns de rejeição de requisição e respostas HTTP 500 não vazias sem a assinatura de erro fatal do PHP não são tratados como sinais de crash.
O scanner testa /index.php por padrão. Um caminho fornecido na URL é preservado, e --path ou --path-file podem testar caminhos personalizados. Alvos phpMyAdmin são automaticamente retestados em /show_config_errors.php. Redirecionamentos não são seguidos.
O modo padrão --sapi auto aplica ambas as regras de veredito mod_php e PHP-FPM, correspondendo ao comportamento combinado dos postmodules da Assetnote. Use --sapi mod_php ou --sapi fpm para restringir a detecção a um SAPI conhecido.
Cada caminho testado pode receber uma requisição de controle de 42 bytes e três sondas totalizando cerca de 29 MiB. A sondagem para assim que o veredito é determinado, e URLs de entrada duplicadas são escaneadas uma única vez.
pip install -r requirements.txt
Escaneie um único host:
python3 scanner.py -u https://example.com
Escaneie uma lista de hosts:
python3 scanner.py -l hosts.txt
Escaneie com múltiplas threads e salve os resultados:
python3 scanner.py -l hosts.txt -t 20 -o results.json
Verificar com cabeçalhos personalizados:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
Exibir um caminho personalizado:
python3 scanner.py -u https://example.com --path /phpinfo.php
python3 scanner.py -u https://example.com --path /index.php --path /admin.php
python3 scanner.py -u https://example.com --path-file paths.txt
Use apenas as regras de veredito do PHP-FPM:
python3 scanner.py -u https://example.com --sapi fpm
-u, --url Single URL to check
-l, --list File containing hosts (one per line)
-t, --threads Number of concurrent threads (default: 10)
--timeout Request timeout in seconds (default: 60)
-o, --output Output file for results (JSON)
--all-results Save all results, not just vulnerable hosts
-k, --insecure Disable TLS certificate verification
-H, --header Custom header (can be used multiple times)
-v, --verbose Show verdict reasons and response snippets
-q, --quiet Only output vulnerable hosts
--no-color Disable colored output
--sapi Verdict rules: auto, mod_php, or fpm (default: auto)
--path Custom path to test (can be used multiple times)
--path-file File containing paths to test (one per line)
A primeira descoberta original do php2shell é atribuída à equipe Calif. Você pode ler o relatório deles aqui: https://calif.io/php2shell/.
O scanner foi criado pela Assetnote Security Research Team usando a lógica desenvolvida para a Plataforma de Exposição do Searchlight.
Os resultados são impressos no terminal. Ao usar -o, os hosts vulneráveis são salvos em um arquivo JSON com o motivo do veredito e evidências de requisição/resposta HTTP redigidas.
Em configurações específicas do PHP, o scanner pode reportar um falso positivo quando sua sonda multipart excede o memory_limit do PHP. Versões corrigidas e vulneráveis podem então retornar a mesma resposta HTTP 500 vazia.
Isso foi reproduzido no PHP 8.4.27 corrigido com valores de memory_limit de 2M a 32M, e no PHP 8.3.36 em 128M quando max_multipart_body_parts está definido como 2785 ou superior. O limite exato pode variar entre builds.
Quando o PHP não divulga sua versão, o scanner não consegue distinguir esse OOM seguro pós-correção do comportamento vulnerável pré-correção. Portanto, os resultados devem ser verificados em relação à versão do PHP instalada e a quaisquer backports do fornecedor