
Scanner non destructif pour CVE-2026-109618 / CVE-2026-109619 (RCE du cœur de PHP). Reconnaissance de sous-domaines via crt.sh + subfinder, récupération robuste de bannières, détection basée sur la version.
Scanner non destructif (avec sonde optionnelle) pour CVE-2026-109618 (RCE via
corruption OOM) et CVE-2026-109619 (RCE via état global obsolète) — bugs du cœur
de PHP corrigés dans 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
✅ Vérifié par rapport aux avis officiels php-src (2026-10-21, Critique). Les identifiants CVE et le tableau des versions corrigées ci-dessous correspondent exactement à l'amont.
- CVE-2026-109618 — GHSA-w8hw-w9fx-j79w
- CVE-2026-109619 — GHSA-6wmf-4rv5-p3rp
| Branche | Affectée | Corrigée |
|---|---|---|
| 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 — aucun correctif amont | vérifier le rétroportage distro/OSV |
| Mode | Ce qu'il fait |
|---|---|
LOCAL | php -r pour obtenir la version exacte du runtime, la SAPI, memory_limit, post_max_size |
REMOTE | Empreinte de version via les en-têtes X-Powered-By / Server et phpinfo() exposé |
PRESENCE | Détection de PHP sans version (PHPSESSID, références .php, redirections) |
BANNER | Récupération robuste de bannière par socket brut — HEAD/GET/OPTIONS + sonde malformée, http/https, divulgation via page d'erreur |
RECON | Énumération de sous-domaines via crt.sh (Certificate Transparency) avec repli/fusion sur subfinder, puis scan en éventail des hôtes résolus |
PROBE | (optionnel) Requêtes multipart volumineuses pour observer l'instabilité des workers — peut provoquer un 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
| Option | Signification |
|---|---|
--local | Analyse locale via le binaire php |
--recon | Étend chaque domaine en sous-domaines (crt.sh + subfinder), puis analyse les hôtes qui résolvent |
--recon-only | Énumère uniquement les sous-domaines, sans analyse |
--banner | Force une récupération robuste de bannière par socket brut sur chaque cible |
--phpinfo-paths | Sonde les chemins phpinfo() exposés courants |
--deep-version | Techniques de version supplémentaires : easter eggs PHP + fichiers de fuite de version (composer.json, .env, …) |
--origin-scan | Atteint l'origine PHP derrière Cloudflare/WAF — requête directe vers l'IP avec le véritable en-tête Host |
--shodan-key | Clé API Shodan pour le renseignement sur l'origine (ou variable d'env SHODAN_API_KEY) ; implique --origin-scan |
--censys-id / --censys-secret | Identifiants API Censys (ou variables d'env CENSYS_API_ID / CENSYS_API_SECRET) ; impliquent --origin-scan |
--probe | Sonde de charge multipart — risque de DoS, uniquement sur cibles autorisées |
--probe-count N | Nombre de requêtes de sonde (par défaut 5) |
--threads N / --timeout N | Concurrence / délai d'expiration par requête |
--insecure | Ne pas valider TLS |
-o FILE / --csv FILE | Enregistrer un rapport JSON / CSV |
Au-delà de la vérification de version, chaque cible est enrichie de signaux passifs (issus des réponses normales) qui affinent le verdict et réduisent les faux positifs :
fpm, mod_php) réutilisent l'état des requêtes → exposés à CVE-2026-109619 ; un simple cgi bien moins.ubuntu, +deb, .el8…) — un backport peut corriger sans changement de version → confiance abaissée, note « vérifier le changelog ».post_max_size / max_input_vars (surface OOM pour CVE-2026-109618), disable_functions.--deep-version)Lorsqu'aucune version n'apparaît dans la bannière : easter eggs PHP (?=PHPE9568F34-... → GIF/credits si expose_php=On) et fichiers de fuite de version (composer.json, .env, … ; PHP_VERSION dans .env = exact, une contrainte "php": ">=8.2" ne fait que restreindre la branche).
--origin-scan)Les CDN masquent l'origine, donc la lecture d'un en-tête ne montre que l'edge. --origin-scan :
www, les préfixes non proxifiés (origin.*, cpanel.*, mail.*…) et les sous-domaines de reconnaissance ;Host + SNI, en lisant Server / X-Powered-By / les pages d'erreur directement depuis l'origine.Une requête directe vers une IP déjà exposée. Cibles autorisées uniquement.
Le renseignement authentifié ajoute des IP que le DNS n'expose jamais, ainsi qu'une version PHP issue de la bannière indexée (renseignement signalé — peut être obsolète) :
--shodan-key / env SHODAN_API_KEY — hôtes via hostname:<domain>.--censys-id + --censys-secret / env CENSYS_API_ID + CENSYS_API_SECRET — hôtes via certificat TLS / nom DNS.--origin-scan.export SHODAN_API_KEY=xxx CENSYS_API_ID=xxx CENSYS_API_SECRET=xxx
python3 php2shell_scan.py hackersec.com --origin-scan
| Confiance | Signification |
|---|---|
HIGH | version issue d'un phpinfo() exposé ou d'une page d'erreur PHP |
MEDIUM | version issue d'une bannière HTTP (expose_php=On) |
LOW | déduction uniquement, ou derrière un proxy, ou un backport de distribution peut s'appliquer |
La sortie consolidée regroupe les cibles par gravité, trie les VULNERABLE par confiance (HIGH en premier) et signale les résultats LOW/MEDIUM à revérifier avant de les rapporter.
Comparaison de version par branche par rapport à la table FIXED :
< fixed sur une branche prise en charge → VULNERABLE>= fixed → PATCHED< 8.2 (EOL) → VULNERABLE_EOL (aucun correctif amont ; vérifier le backport de la distribution/OSV)À exécuter uniquement contre des actifs que vous possédez ou que vous êtes explicitement autorisé à tester. Le
mode --probe peut perturber des workers fragiles. Vous êtes responsable de votre usage.
MIT