
Détecteur CVE-2026-87902. Classe LFI get_page_template de WordPress. Détection uniquement. Laboratoire autorisé.
Détecteur de CVE-2026-87902 pour WordPress Core.
get_page_template() peut être détourné de sorte que la résolution du template de page inclue un fichier .php local lisible en dehors du thème actif. WPSniper empreinte le site, choisit un page_id publié, sonde la classe d'inclusion, et n'affiche VULN que lorsqu'une bannière PEAR forte est unique au corps de la sonde.
Détection uniquement. Pas de webshell. Pas de pearcmd config-create. Pas d'exécution de commande système.
python3 WPSniper.py -u https://lab.wordpress.local --shell
Pipeline :
subfinder -d lab.example -silent | httpx -silent | python3 WPSniper.py -t 8
Périmètre écrit. Lab personnel. C'est toute la licence pour l'exécuter.
WordPress construit le nom du template de page à partir de la variable de requête pagename dérivée de l'URL et décodée :
page-{$pagename}.php
locate_template() inclut ensuite ce fichier. Sur les versions affectées, le chemin résolu n'est pas contraint de rester à l'intérieur d'un répertoire de thème autorisé. Un traversal doublement encodé dans pagename survit à sanitize_title suffisamment longtemps pour que get_page_template() le décode une fois et sorte de l'arborescence du thème.
Deux préconditions précèdent une inclusion fermée :
page- (WordPress documente page-templates/ — Twenty Twelve, Twenty Fourteen, Neve, Hestia, Sydney et d'autres)..php lisible existe pour le compte du serveur web. Le détecteur utilise les bannières CLI PEAR standard comme oracle d'inclusion. Il n'en écrit pas.La RCE est une suite possible lorsque ces conditions plus un gadget inscriptible/exécutable s'alignent. Cette suite n'est pas dans ce dépôt.
Crédit du découvreur sur la CVE : Robert (ressl) via WordPress HackerOne. Avis : GHSA-7hp8-65ch-5whp.
La table des versions est intégrée. 4.7.0–7.1.1 constituent la fenêtre affectée. Points corrigés : 7.1.2, 7.0.6, 6.9.9, 6.8.10 … jusqu'à 4.7.37.
Une page marketing qui mentionne « pearcmd » dans un article de blog n'est pas un hit.
VULN uniquement lorsque tout ceci est vrai :
?page_id=PEAR Version:, Usage: pear, PEAR_Config, Commands for pear, config-create, DEPRECATED: PEAR commands, pear.php)pearcmd / PEAR seul est écarté, surtout s'il était déjà présent dans le HTML baselineINFO = version affectée et/ou répertoire page-templates, inclusion non fermée. Ne pas classer en critique sur INFO.
SAFE = branche corrigée, ou inclusion identique à la baseline.
SKIP = pas WordPress, URL invalide.
/etc/passwd est le mauvais oracle pour cette CVE. locate_template() ajoute .php. La commande interactive passwd existe pour que vous puissiez le constater vous-même. L'apparition d'une strophe root:x:0:0: est inhabituelle et doit être vérifiée manuellement.
python3 -m pip install -r requirements.txt
python3 WPSniper.py -u https://lab.wordpress.local
Nécessite requests.
--shell est ignoré sur un pipeline. C'est intentionnel.
python3 WPSniper.py -u https://lab.wordpress.local --shell
[email protected] ▶
1 fp version / theme / patched?
2 pages REST published pages
3 theme page-templates directory
4 probe PEAR include + baseline diff (no write)
5 diff same, print Δ + tokens
6 passwd try …/etc/passwd (this class includes *.php)
7 include P include a .php path without suffix
8 save last body → /tmp/wpsniper-probe.html
9 help
0 exit
Chaque sonde affiche l'URL complète et un curl prêt à copier-coller. Utilisez-le dans le rapport. N'inventez pas une seconde requête.
7 include est destiné à un fichier de lab autorisé que vous avez déjà placé. Le nom d'exemple dans le texte d'aide est un marqueur témoin, pas un dropper.
WPSniper v1.3 CVE-2026-87902 get_page_template LFI
[radar] target https://lab.wordpress.local
[radar] generator=6.8.3 theme=twentytwelve status=affected
[radar] page_id=2
[radar] theme dir /wp-content/themes/twentytwelve/page-templates/ → 403
VULN lab.wordpress.local unique=['PEAR Version:','Usage: pear'] Δlen=+18420
patched 7.1.2 · 7.0.6 · 6.8.10 · backports to 4.7.37
L'hôte sur cette page est un label de lab. Les noms d'hôtes clients réels n'ont pas leur place dans une capture publique.
Mettre à niveau vers 7.1.2 ou le backport de votre branche :
7.0.6 · 6.9.9 · 6.8.10 · 6.7.9 · 6.6.9 · 6.5.12 · 6.4.12 · 6.3.12 · 6.2.13 · 6.1.14 · 6.0.16 · 5.9.18 … jusqu'à 4.7.37.
7.1.2 exige également que le chemin de template résolu reste à l'intérieur d'un répertoire de thème autorisé. C'est le véritable correctif, pas une règle WAF.
pearcmd config-create, pas de wrapper system()/etc/passwd brut comme confirmation principaleSi vous avez besoin d'une conclusion : joignez le curl que WPSniper a déjà affiché, les tokens forts uniques, et la divergence d'empreinte baseline.
Tests de sécurité autorisés uniquement. Exécuter ceci contre un hôte que vous ne possédez pas ou que vous n'avez pas par écrit est votre problème, pas celui de l'outil.
mitsec · Yunus Emre Öztaş
| Étape | Action | Signal |
|---|
| 1 | Accueil + generator + /feed/ | WordPress ? version ? slug du thème ? |
| 2 | REST /wp-json/wp/v2/pages ou page_id= dans le HTML | Une page publiée pour que le chemin du template s'exécute réellement |
| 3 | GET /wp-content/themes/{slug}/page-templates/ | 200 / 401 / 403 = le répertoire existe |
| 4 | Baseline ?page_id=N vs sonde pagename= | Empreinte du corps + tokens PEAR forts uniques |
| Option | Signification |
|---|
-u URL | Cible unique |
-l file | Liste d'URLs |
| stdin | subfinder | httpx | WPSniper |
-t N | Threads sur une liste (défaut 6) |
-q | Lignes silencieuses + résumé |
--shell | Sonde interactive sur un seul -u |
--timeout | Secondes (défaut 14) |