
Rilevatore CVE-2026-87902. Classe LFI di WordPress get_page_template. Solo rilevamento. Laboratorio autorizzato.
Rilevatore CVE-2026-87902 per WordPress Core.
get_page_template() può essere manipolato in modo che la risoluzione del template di pagina includa un file .php locale leggibile al di fuori del tema attivo. WPSniper identifica il sito, seleziona un page_id pubblicato, sonda la classe di inclusione e stampa VULN solo quando un forte banner PEAR è univoco rispetto al corpo della sonda.
Solo rilevamento. Nessuna webshell. Nessun config-create di pearcmd. Nessuna esecuzione di comandi OS.
python3 WPSniper.py -u https://lab.wordpress.local --shell
Pipeline:
subfinder -d lab.example -silent | httpx -silent | python3 WPSniper.py -t 8
Ambito scritto. Laboratorio proprio. Questa è l'intera licenza per eseguirlo.
WordPress costruisce il nome del template di pagina dalla variabile di query pagename derivata dall'URL e decodificata:
page-{$pagename}.php
locate_template() include poi quel file. Nelle build interessate il percorso risolto non è forzato a rimanere all'interno di una directory di tema consentita. Un traversal con doppia codifica in pagename sopravvive a sanitize_title abbastanza a lungo perché get_page_template() lo decodifichi una volta e risalga fuori dall'albero del tema.
Due precondizioni si trovano davanti a un'inclusione chiusa:
page- (WordPress documenta page-templates/ — Twenty Twelve, Twenty Fourteen, Neve, Hestia, Sydney e altri)..php leggibile per l'account del web server. Il rilevatore usa i banner standard della CLI PEAR come oracolo di inclusione. Non ne scrive uno.L'RCE è un possibile seguito quando quelle condizioni più un gadget scrivibile/eseguibile si allineano. Quel seguito non è in questo repository.
Credito dello scopritore sulla CVE: Robert (ressl) tramite WordPress HackerOne. Advisory: GHSA-7hp8-65ch-5whp.
La tabella delle versioni è integrata. 4.7.0–7.1.1 sono la finestra interessata. Punti corretti: 7.1.2, 7.0.6, 6.9.9, 6.8.10 … fino a 4.7.37.
Una pagina di marketing che dice "pearcmd" in un post del blog non è un riscontro.
VULN solo quando tutto questo è vero:
?page_id=PEAR Version:, Usage: pear, PEAR_Config, Commands for pear, config-create, DEPRECATED: PEAR commands, pear.php)pearcmd / PEAR da solo viene scartato, specialmente se era già presente nell'HTML della baselineINFO = versione interessata e/o directory page-templates, inclusione non chiusa. Non aprire un critical su INFO.
SAFE = branch corretto, o inclusione identica alla baseline.
SKIP = non WordPress, URL errato.
/etc/passwd è l'oracolo sbagliato per questa CVE. locate_template() aggiunge .php. Il comando interattivo passwd esiste così puoi vederlo da solo. La comparsa di una stanza root:x:0:0: è insolita e deve essere verificata manualmente.
python3 -m pip install -r requirements.txt
python3 WPSniper.py -u https://lab.wordpress.local
Richiede requests.
--shell viene ignorato su una pipeline. È intenzionale.
python3 WPSniper.py -u https://lab.wordpress.local --shell
[email protected] ▶
1 fp versione / tema / corretto?
2 pages pagine pubblicate REST
3 theme directory page-templates
4 probe inclusione PEAR + diff baseline (nessuna scrittura)
5 diff idem, stampa Δ + token
6 passwd prova …/etc/passwd (questa classe include *.php)
7 include P includi un percorso .php senza suffisso
8 save ultimo corpo → /tmp/wpsniper-probe.html
9 help
0 exit
Ogni sonda stampa l'URL completo e un curl da copiare e incollare. Usalo nel report. Non inventare una seconda richiesta.
7 include è per un file di laboratorio autorizzato che hai già posizionato. Il nome di esempio nel testo di aiuto è un marcatore di testimonianza, non 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'host in questa pagina è un'etichetta di laboratorio. I nomi host reali dei clienti non appartengono a uno screenshot pubblico.
Aggiorna a 7.1.2 o al backport per il tuo branch:
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 … fino a 4.7.37.
7.1.2 richiede anche che il percorso del template risolto rimanga all'interno di una directory di tema consentita. Questa è la correzione effettiva, non una regola WAF.
pearcmd config-create, nessun wrapper system()/etc/passwd grezzo come conferma primariaSe ti serve un finding: allega il curl che WPSniper ha già stampato, i token forti univoci e la mancata corrispondenza del digest della baseline.
Solo test di sicurezza autorizzati. Eseguirlo contro un host che non possiedi o che non hai per iscritto è un tuo problema, non dello strumento.
mitsec · Yunus Emre Öztaş
| Passo | Azione | Segnale |
|---|
| 1 | Home + generator + /feed/ | WordPress? versione? slug del tema? |
| 2 | REST /wp-json/wp/v2/pages o page_id= nell'HTML | Una pagina pubblicata affinché il percorso del template venga effettivamente eseguito |
| 3 | GET /wp-content/themes/{slug}/page-templates/ | 200 / 401 / 403 = la directory esiste |
| 4 | Baseline ?page_id=N vs sonda pagename= | Digest del corpo + token PEAR forti univoci |
| Flag | Significato |
|---|
-u URL | Singolo target |
-l file | Lista di URL |
| stdin | subfinder | httpx | WPSniper |
-t N | Thread su una lista (default 6) |
-q | Righe silenziose + riepilogo |
--shell | Sonda interattiva su un singolo -u |
--timeout | Secondi (default 14) |