
Scanner não destrutivo para CVE-2026-109618 / CVE-2026-109619 (RCE no núcleo do PHP). Reconhecimento de subdomínios via crt.sh + subfinder, banner grabbing robusto, detecção baseada em versão.
Scanner não destrutivo (com sonda opt-in) para CVE-2026-109618 (RCE via
corrupção de OOM) e CVE-2026-109619 (RCE via estado global obsoleto) — bugs
do núcleo do PHP corrigidos em 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
✅ Verificado contra os avisos oficiais do php-src (2026-10-21, Crítico). Os IDs CVE e a tabela de versões corrigidas abaixo correspondem exatamente ao upstream.
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| Ramo | Afetadas | Corrigidas |
|---|---|---|
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.5 | < 8.5.12 | 8.5.12 |
| < 8.2 | EOL — sem patch upstream | verificar backport da distro/OSV |
| Modo | O que faz |
|---|---|
LOCAL | php -r para versão exata do runtime, SAPI, memory_limit, post_max_size |
REMOTE | Fingerprint de versão via cabeçalhos X-Powered-By / Server e phpinfo() exposto |
PRESENCE | Detecção de PHP sem versão (PHPSESSID, referências .php, redirecionamentos) |
BANNER | Captura robusta de banner via raw-socket — HEAD/GET/OPTIONS + sonda malformada, http/https, divulgação em página de erro |
RECON | Enumeração de subdomínios via crt.sh (Certificate Transparency) com fallback/mesclagem em subfinder, depois varredura em fan-out resolvendo hosts |
PROBE | (opt-in) Requisições multipart grandes para observar instabilidade do worker — pode causar DoS |
git clone https://github.com/JoasASantos/php2shell-scanner.git
cd php2shell-scanner
# stdlib only — no pip deps.
# Optional recon fallback: ProjectDiscovery subfinder
# brew install subfinder (or: go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest)
# Local runtime check
python3 php2shell_scan.py --local
# Single remote target, look for exposed phpinfo()
python3 php2shell_scan.py https://example.com --phpinfo-paths
# Subdomain recon (crt.sh + subfinder) then scan, 10 threads, JSON out
python3 php2shell_scan.py example.com --recon --threads 10 -o out.json
# Recon only, no scanning
python3 php2shell_scan.py example.com --recon-only
# Target list + forced robust banner grab
python3 php2shell_scan.py -f targets.txt --banner
# OPT-IN load probe (authorized use only — DoS risk)
python3 php2shell_scan.py https://example.com --probe --probe-count 5
| Flag | Significado |
|---|---|
--local | Varredura local via o binário php |
--recon | Expande cada domínio em subdomínios (crt.sh + subfinder), depois varre os hosts que resolvem |
--recon-only | Apenas enumera subdomínios, sem varredura |
--banner | Força a captura robusta de banner via raw-socket em cada alvo |
--phpinfo-paths | Sonda caminhos comuns de phpinfo() expostos |
--deep-version | Técnicas extras de versão: easter eggs do PHP + arquivos que vazam versão (composer.json, .env, …) |
--origin-scan | Alcança a origem PHP por trás do Cloudflare/WAF — requisição direta ao IP com o cabeçalho Host real |
--shodan-key | Chave de API do Shodan para inteligência de origem (ou env SHODAN_API_KEY); implica --origin-scan |
--censys-id / --censys-secret | Credenciais de API do Censys (ou env CENSYS_API_ID / CENSYS_API_SECRET); implicam --origin-scan |
--probe | Sonda de carga multipart — risco de DoS, apenas autorizado |
--probe-count N | Número de requisições de sonda (padrão 5) |
--threads N / --timeout N | Concorrência / timeout por requisição |
--insecure | Não valida TLS |
-o FILE / --csv FILE | Salva relatório JSON / CSV |
Além da verificação de versão, cada alvo é enriquecido com sinais passivos (de respostas normais) que refinam o veredito e reduzem falsos positivos:
fpm, mod_php) reutilizam
estado da requisição → expostos a CVE-2026-109619; cgi simples muito menos.ubuntu, +deb, .el8…) — backport pode corrigir sem
aumento de versão → confiança reduzida, nota "verifique o changelog".post_max_size /
max_input_vars (superfície de OOM para CVE-2026-109618), disable_functions.--deep-version)Quando não há versão no banner: easter eggs do PHP (?=PHPE9568F34-... → GIF/credits
com expose_php=On) e arquivos que vazam versão (composer.json, .env, …;
.env PHP_VERSION = exata, uma restrição "php": ">=8.2" apenas estreita o branch).
--origin-scan)CDNs ocultam a origem, então a leitura de cabeçalhos mostra apenas a borda. --origin-scan:
www, prefixos não-proxied (origin.*, cpanel.*, mail.*…)
e subdomínios do recon;Host + SNI reais,
lendo Server / X-Powered-By / páginas de erro direto da origem.Uma requisição direta a um IP já exposto. Apenas alvos autorizados.
Inteligência com credenciais adiciona IPs que o DNS nunca expõe, além de uma versão do PHP a partir do banner indexado (inteligência sinalizada — pode estar desatualizada):
--shodan-key / env SHODAN_API_KEY — hosts por hostname:<domain>.--censys-id + --censys-secret / env CENSYS_API_ID + CENSYS_API_SECRET
— hosts por certificado TLS / nome DNS.--origin-scan.export SHODAN_API_KEY=xxx CENSYS_API_ID=xxx CENSYS_API_SECRET=xxx
python3 php2shell_scan.py hackersec.com --origin-scan
| Confiança | Significado |
|---|---|
HIGH | versão obtida de um phpinfo() exposto ou de uma página de erro do PHP |
MEDIUM | versão obtida de um banner HTTP (expose_php=On) |
LOW | apenas inferência, ou atrás de um proxy, ou um backport da distro pode se aplicar |
A saída consolidada agrupa os alvos por severidade, ordena os VULNERABLE por confiança (HIGH primeiro) e sinaliza resultados LOW/MEDIUM para nova verificação antes de reportar.
Comparação de versão por branch em relação à tabela FIXED:
< fixed em um branch suportado → VULNERABLE>= fixed → PATCHED< 8.2 (EOL) → VULNERABLE_EOL (sem patch upstream; verifique backport da distro/OSV)Execute apenas contra ativos que você possui ou para os quais tem permissão explícita de testar. O
modo --probe pode desestabilizar workers frágeis. Você é responsável pelo seu uso.
MIT