
Scanner haute fidélité pour php2shell (CVE-2026-109618 et CVE-2026-109619)
Un outil en ligne de commande pour détecter CVE-2026-109618 et CVE-2026-109619 dans les applications PHP.
Le scanner envoie une requête de contrôle multipart minimale suivie de jusqu'à trois sondes multipart élaborées. Les sondes utilisent des clés de tableau PHP imbriquées sur 62 niveaux et augmentent de 1 MiB à 20 MiB, correspondant à la logique de détection utilisée par le scanner interne d'Assetnote.
Une cible est signalée comme vulnérable lorsque la sonde produit une erreur d'épuisement de mémoire PHP, un HTTP 500 vide différentiel, une défaillance de worker PHP-FPM, ou une version PHP annoncée connue comme non corrigée. Les réponses 5xx initiales, les statuts courants de rejet de requête et les réponses HTTP 500 non vides sans la signature d'erreur fatale PHP ne sont pas traitées comme des signaux de plantage.
Le scanner teste /index.php par défaut. Un chemin fourni dans l'URL est conservé, et --path ou --path-file permettent de tester des chemins personnalisés. Les cibles phpMyAdmin sont automatiquement retestées sur /show_config_errors.php. Les redirections ne sont pas suivies.
Le mode par défaut --sapi auto applique à la fois les règles de verdict mod_php et PHP-FPM, correspondant au comportement combiné des postmodules d'Assetnote. Utilisez --sapi mod_php ou --sapi fpm pour restreindre la détection à un SAPI connu.
Chaque chemin testé peut recevoir une requête de contrôle de 42 octets et trois sondes totalisant environ 29 MiB. Le sondage s'arrête dès que le verdict est établi, et les URL d'entrée en double ne sont scannées qu'une seule fois.
pip install -r requirements.txt
Analyser un seul hôte :
python3 scanner.py -u https://example.com
Analyser une liste d'hôtes :
python3 scanner.py -l hosts.txt
Analyser avec plusieurs threads et enregistrer les résultats :
python3 scanner.py -l hosts.txt -t 20 -o results.json
Analyse avec des en-têtes personnalisés :
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
Analyser un chemin personnalisé :
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
Utilisez uniquement les règles de verdict 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 première découverte originale de php2shell est attribuée à l'équipe Calif. Vous pouvez lire leur analyse ici : https://calif.io/php2shell/.
Le scanner a été développé par l'Assetnote Security Research Team en utilisant une logique conçue pour la plateforme d'exposition de Searchlight.
Les résultats sont affichés dans le terminal. Lors de l'utilisation de -o, les hôtes vulnérables sont enregistrés dans un fichier JSON avec la raison du verdict et les preuves de requête/réponse HTTP expurgées.
Sur certaines configurations PHP spécifiques, le scanner peut signaler un faux positif lorsque sa sonde multipart dépasse la memory_limit de PHP. Les versions corrigées et vulnérables peuvent alors renvoyer la même réponse HTTP 500 vide.
Ce comportement a été reproduit sur PHP 8.4.27 corrigé avec des valeurs de memory_limit allant de 2M à 32M, et sur PHP 8.3.36 à 128M lorsque max_multipart_body_parts est défini à 2785 ou plus. Le seuil exact peut varier selon les builds.
Lorsque PHP ne divulgue pas sa version, le scanner ne peut pas distinguer cette OOM sûre post-correctif du comportement vulnérable pré-correctif. Les résultats doivent donc être vérifiés par rapport à la version de PHP installée et à tout rétroportage du fournisseur.