
Hochpräziser Scanner für php2shell (CVE-2026-109618 und CVE-2026-109619)
Ein Kommandozeilen-Tool zum Erkennen von CVE-2026-109618 und CVE-2026-109619 in PHP-Anwendungen.
Der Scanner sendet eine minimale Multipart-Kontrollanfrage, gefolgt von bis zu drei präparierten Multipart-Probes. Die Probes verwenden PHP-Array-Schlüssel, die 62 Ebenen tief verschachtelt sind, und steigen von 1 MiB auf 20 MiB an, entsprechend der Erkennungslogik, die von Assetnotes internem Scanner verwendet wird.
Ein Ziel wird als verwundbar gemeldet, wenn die Probe einen PHP-Speichererschöpfungsfehler, einen differenziellen leeren HTTP 500, einen PHP-FPM-Worker-Ausfall oder eine angegebene PHP-Version erzeugt, die bekanntermaßen ungepatcht ist. Anfängliche 5xx-Antworten, übliche Statuscodes zur Anfrageablehnung und nichtleere HTTP-500-Antworten ohne die PHP-Fatal-Error-Signatur werden nicht als Absturzsignale behandelt.
Der Scanner testet standardmäßig /index.php. Ein in der URL angegebener Pfad bleibt erhalten, und mit --path oder --path-file können benutzerdefinierte Pfade getestet werden. phpMyAdmin-Ziele werden automatisch unter /show_config_errors.php erneut getestet. Weiterleitungen werden nicht verfolgt.
Der Standardmodus --sapi auto wendet sowohl die Urteilsregeln für mod_php als auch für PHP-FPM an und entspricht dem kombinierten Verhalten von Assetnotes Postmodulen. Verwenden Sie --sapi mod_php oder --sapi fpm, um die Erkennung auf eine bekannte SAPI zu beschränken.
Jeder getestete Pfad kann eine 42-Byte-Kontrollanfrage und drei Probes mit insgesamt etwa 29 MiB erhalten. Das Probing stoppt, sobald das Urteil feststeht, und doppelte Eingabe-URLs werden nur einmal gescannt.
pip install -r requirements.txt
Einen einzelnen Host scannen:
python3 scanner.py -u https://example.com
Scannen Sie eine Liste von Hosts:
python3 scanner.py -l hosts.txt
Mit mehreren Threads scannen und Ergebnisse speichern:
python3 scanner.py -l hosts.txt -t 20 -o results.json
Mit benutzerdefinierten Headern scannen:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
Eine benutzerdefinierte Pfad scannen:
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
Verwende nur PHP-FPM-Verdict-Regeln:
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)
Die erste, ursprüngliche Entdeckung von php2shell wird dem Calif-Team zugeschrieben. Den zugehörigen Write-up können Sie hier lesen: https://calif.io/php2shell/.
Der Scanner wurde vom Assetnote Security Research Team unter Verwendung von Logik entwickelt, die für Searchlights Exposure Platform erstellt wurde.
Die Ergebnisse werden im Terminal ausgegeben. Bei Verwendung von -o werden verwundbare Hosts in einer JSON-Datei mit dem Begründungstext und redigierten HTTP-Anfrage-/Antwortnachweisen gespeichert.
Bei bestimmten PHP-Konfigurationen kann der Scanner ein falsch positives Ergebnis melden, wenn seine Multipart-Probe das memory_limit von PHP überschreitet. Gepatchte und verwundbare Versionen können dann dieselbe leere HTTP-500-Antwort zurückgeben.
Dies wurde auf gepatchtem PHP 8.4.27 mit memory_limit-Werten von 2M bis 32M reproduziert sowie auf PHP 8.3.36 bei 128M, wenn max_multipart_body_parts auf 2785 oder höher gesetzt ist. Der genaue Schwellenwert kann je nach Build variieren.
Wenn PHP seine Version nicht offenlegt, kann der Scanner diesen sicheren OOM nach dem Patch nicht vom verwundbaren Verhalten vor dem Patch unterscheiden. Die Ergebnisse sollten daher anhand der installierten PHP-Version und etwaiger Vendor-Backports überprüft werden