
Scanner non distruttivo per CVE-2026-109618 / CVE-2026-109619 (RCE del core PHP). Ricognizione dei sottodomini tramite crt.sh + subfinder, banner grabbing robusto, rilevamento basato sulla versione.
Scanner non distruttivo (con probe opt-in) per CVE-2026-109618 (RCE tramite
corruzione OOM) e CVE-2026-109619 (RCE tramite stato globale obsoleto) — bug
del core PHP corretti in 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
✅ Verificato rispetto agli advisory ufficiali php-src (2026-10-21, Critico). Gli ID CVE e la tabella delle versioni corrette di seguito corrispondono esattamente a quelli upstream.
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| Branch | Affected | Fixed |
|---|---|---|
| 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 — nessuna patch upstream | verifica backport distro/OSV |
| Modalità | Cosa fa |
|---|---|
LOCAL | php -r per la versione esatta del runtime, SAPI, memory_limit, post_max_size |
REMOTE | Fingerprint della versione tramite header X-Powered-By / Server e phpinfo() esposto |
PRESENCE | Rilevamento PHP senza versione (PHPSESSID, riferimenti .php, redirect) |
BANNER | Acquisizione robusta del banner tramite raw-socket — HEAD/GET/OPTIONS + probe malformato, http/https, divulgazione della pagina di errore |
RECON | Enumerazione dei sottodomini tramite crt.sh (Certificate Transparency) con fallback/merge su subfinder, poi scansione fan-out risolvendo gli host |
PROBE | (opt-in) Richieste multipart di grandi dimensioni per osservare l'instabilità dei worker — può causare 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 | Significato |
|---|---|
--local | Scansione locale tramite il binario php |
--recon | Espande ogni dominio in sottodomini (crt.sh + subfinder), poi scansiona gli host che risolvono |
--recon-only | Enumera solo i sottodomini, senza scansione |
--banner | Forza un banner grab robusto via raw-socket su ogni target |
--phpinfo-paths | Verifica i percorsi phpinfo() esposti più comuni |
--deep-version | Tecniche di versione aggiuntive: easter egg di PHP + file che rivelano la versione (composer.json, .env, …) |
--origin-scan | Raggiunge l'origin PHP dietro Cloudflare/WAF — richiesta diretta all'IP con il vero header Host |
--shodan-key | Chiave API Shodan per l'intel sull'origin (o env SHODAN_API_KEY); implica --origin-scan |
--censys-id / --censys-secret | Credenziali API Censys (o env CENSYS_API_ID / CENSYS_API_SECRET); implicano --origin-scan |
--probe | Sonda di carico multipart — rischio DoS, solo su target autorizzati |
--probe-count N | Numero di richieste di sonda (default 5) |
--threads N / --timeout N | Concorrenza / timeout per richiesta |
--insecure | Non validare TLS |
-o FILE / --csv FILE | Salva report JSON / CSV |
Oltre al controllo della versione, ogni target viene arricchito con segnali passivi (dalle risposte normali) che affinano il verdetto e riducono i falsi positivi:
fpm, mod_php) riutilizzano lo
stato della richiesta → esposti a CVE-2026-109619; cgi semplice molto meno.ubuntu, +deb, .el8…) — il backport potrebbe correggere senza
un incremento di versione → confidenza ridotta, nota "verifica il changelog".post_max_size /
max_input_vars (superficie OOM per CVE-2026-109618), disable_functions.--deep-version)Quando manca la versione dal banner: easter egg di PHP (?=PHPE9568F34-... → GIF/credits
con expose_php=On) e file che rivelano la versione (composer.json, .env, …;
PHP_VERSION in .env = esatta, un vincolo "php": ">=8.2" restringe solo il branch).
--origin-scan)Le CDN nascondono l'origin, quindi una lettura degli header mostra solo l'edge. --origin-scan:
www, prefissi non proxati (origin.*, cpanel.*, mail.*…)
e i sottodomini del recon;Host + SNI,
leggendo Server / X-Powered-By / pagine di errore direttamente dall'origin.Una richiesta diretta a un IP già esposto. Solo su target autorizzati.
L'intel con credenziali aggiunge IP che il DNS non espone mai, più una versione PHP dal banner indicizzato (intel segnalato — potrebbe essere obsoleto):
--shodan-key / env SHODAN_API_KEY — host tramite hostname:<domain>.--censys-id + --censys-secret / env CENSYS_API_ID + CENSYS_API_SECRET
— host tramite certificato 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
| Affidabilità | Significato |
|---|---|
HIGH | versione da phpinfo() esposto o da una pagina di errore PHP |
MEDIUM | versione da un banner HTTP (expose_php=On) |
LOW | solo inferenza, oppure dietro un proxy, oppure potrebbe applicarsi un backport della distro |
L'output consolidato raggruppa i target per gravità, ordina i VULNERABLE per affidabilità (HIGH per primo) e segnala i risultati LOW/MEDIUM da ricontrollare prima di segnalarli.
Confronto delle versioni per branch rispetto alla tabella FIXED:
< fixed su un branch supportato → VULNERABLE>= fixed → PATCHED< 8.2 (EOL) → VULNERABLE_EOL (nessuna patch upstream; verificare il backport della distro/OSV)Eseguire solo contro asset di tua proprietà o per i quali sei esplicitamente autorizzato a eseguire test. La
modalità --probe può compromettere worker fragili. Sei responsabile del tuo utilizzo.
MIT