
Scanner ad alta fedeltà per php2shell (CVE-2026-109618 e CVE-2026-109619)
Uno strumento da riga di comando per rilevare CVE-2026-109618 e CVE-2026-109619 nelle applicazioni PHP.
Lo scanner invia una richiesta di controllo multipart minimale seguita da un massimo di tre sonde multipart appositamente costruite. Le sonde utilizzano chiavi di array PHP annidate a 62 livelli di profondità e aumentano da 1 MiB a 20 MiB, rispecchiando la logica di rilevamento utilizzata dallo scanner interno di Assetnote.
Un target viene segnalato come vulnerabile quando la sonda produce un errore di esaurimento della memoria PHP, un HTTP 500 vuoto differenziale, un guasto del worker PHP-FPM, oppure una versione PHP dichiarata nota come non corretta. Le risposte 5xx iniziali, i comuni stati di rifiuto della richiesta e le risposte HTTP 500 non vuote prive della firma di errore fatale PHP non vengono considerati segnali di crash.
Lo scanner verifica /index.php per impostazione predefinita. Un percorso fornito nell'URL viene preservato, e --path o --path-file consentono di verificare percorsi personalizzati. I target phpMyAdmin vengono automaticamente ritestati su /show_config_errors.php. I reindirizzamenti non vengono seguiti.
La modalità predefinita --sapi auto applica sia le regole di verdetto mod_php che quelle PHP-FPM, rispecchiando il comportamento combinato dei postmoduli di Assetnote. Utilizzare --sapi mod_php o --sapi fpm per limitare il rilevamento a una SAPI nota.
Ogni percorso testato può ricevere una richiesta di controllo di 42 byte e tre sonde per un totale di circa 29 MiB. Il probing si interrompe non appena il verdetto è stabilito, e gli URL di input duplicati vengono scansionati una sola volta.
pip install -r requirements.txt
Scansiona un singolo host:
python3 scanner.py -u https://example.com
Scansiona un elenco di host:
python3 scanner.py -l hosts.txt
Esegui la scansione con più thread e salva i risultati:
python3 scanner.py -l hosts.txt -t 20 -o results.json
Scansione con header personalizzati:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
Esegui la scansione di un percorso personalizzato:
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
Usa solo le regole di verdetto 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)
La prima scoperta originale di php2shell è attribuita al team Calif. Puoi leggere il loro resoconto qui: https://calif.io/php2shell/.
Lo scanner è stato realizzato dall'Assetnote Security Research Team utilizzando la logica sviluppata per Searchlight's Exposure Platform.
I risultati vengono stampati nel terminale. Quando si utilizza -o, gli host vulnerabili vengono salvati in un file JSON con il motivo del verdetto e le evidenze della richiesta/risposta HTTP oscurate.
Su specifiche configurazioni PHP, lo scanner può segnalare un falso positivo quando la sua sonda multipart supera il memory_limit di PHP. Le versioni corrette e quelle vulnerabili possono quindi restituire la stessa risposta HTTP 500 vuota.
Questo è stato riprodotto su PHP 8.4.27 corretto con valori di memory_limit da 2M a 32M, e su PHP 8.3.36 a 128M quando max_multipart_body_parts è impostato a 2785 o superiore. La soglia esatta può variare tra le diverse build.
Quando PHP non rivela la propria versione, lo scanner non è in grado di distinguere questo OOM sicuro successivo alla patch dal comportamento vulnerabile precedente alla patch. I risultati dovrebbero quindi essere verificati rispetto alla versione PHP installata e a eventuali backport del fornitore