
Esegue la scansione di WordPress Core 4.7.0–7.1.1 per CVE-2026-87902, LFI non autenticato tramite traversal di pagename con doppia codifica, con escalation RCE opzionale tramite PEAR config-create e scansione di massa.
Strumento di Sfruttamento per Path Traversal in WordPress Core get_page_template() / locate_template()
Solo per test di sicurezza autorizzati. L'accesso non autorizzato a sistemi informatici è illegale.
| Voce | Dettagli |
|---|---|
| ID CVE | CVE-2026-87902 |
| ID GHSA | GHSA-7hp8-65ch-5whp |
| Tipo di Vulnerabilità | CWE-98 — Controllo Improprio del Nome File per Include/Require |
| CVSS v3.1 | 8.1 (Alto) / CVSS 4.0: 9.2 (Critico) |
| Componente Affetto | WordPress Core |
| Versioni Affette | dalla 4.7.0 alla 7.1.1 (tutti i rami) |
| Versioni Corrette | 7.1.2 (e backport fino alla 4.7.37) |
| Autenticazione Richiesta | Nessuna (Non Autenticata) |
| Vettore di Attacco | Singola richiesta GET |
| Scoperta Da | Robert Ressl (tramite il programma HackerOne di WordPress) |
| Data di Divulgazione | 22 settembre 2026 |
| Sfruttata in Natura | Sì — elencata nel catalogo CISA KEV |
CVE-2026-87902 è una vulnerabilità di path traversal e inclusione locale di file (LFI) non autenticata in WordPress Core che interessa ogni versione di WordPress rilasciata dal 2016 (dalla 4.7.0 alla 7.1.1). Un attaccante non necessita di alcun account o autenticazione. Manipolando un parametro di query pagename malevolo, l'attaccante può indurre il meccanismo di risoluzione dei template di pagina di WordPress a includere qualsiasi file .php leggibile al di fuori della directory del tema attivo. In specifiche condizioni del server (PHP register_argc_argv = On e un pearcmd.php leggibile), la vulnerabilità può essere escalata a esecuzione remota di codice (RCE).
| Rami | Versione Corretta |
|---|---|
| 4.7.x | 4.7.37 |
| 5.0.x | 5.0.29 |
| 5.3.x | 5.3.25 |
| 5.9.x | 5.9.18 |
| 6.0.x | 6.0.16 |
| 6.6.x | 6.6.9 |
| 6.9.x | 6.9.9 |
| 7.0.x | 7.0.6 |
| 7.1.x | 7.1.2 |
La vulnerabilità risiede in get_page_template() in wp-includes/template.php. Quando la variabile di query pagename è presente, la funzione costruisce page-{$pagename}.php ma non riesce a chiamare validate_file() su quel valore per verificare la presenza di directory traversal. Il nome file candidato viene quindi passato a locate_template(), che lo concatena con il percorso della directory del tema e verifica solo file_exists() — non verifica che il percorso risolto rimanga all'interno della directory del tema. Un nome di template contenente ../ può quindi risolversi in un file PHP leggibile al di fuori del tema attivo ed essere incluso ed eseguito.
GET /?page_id=&pagename= → WP_Query resolves page_id, matches a published page (avoids 404) → get_page_template() urldecode()s pagename, builds page-{$pagename}.php → locate_template() concatenates candidate to theme directory, resolves via file_exists() → template-loader executes realpath() + include
WordPress applica sanitize_title_for_query() a pagename, che sostituisce i punti letterali (.) con trattini (-) per bloccare il traversal. Opera su input già decodificato una volta e non esegue decodifica ricorsiva. L'attaccante invia %252e%252e%252f (../ doppiamente codificato):
%252e → %2e, %252f → %2fsanitize_title_for_query() vede %2e%2e%2f (nessun punto letterale) e lo lascia passareget_page_template() chiama internamente di nuovo urldecode(): %2e%2e%2f → ../page- (ad esempio, page-templates/).page_id..php (WordPress aggiunge l'estensione).Nota per Host Windows: Win32 normalizza .. lessicalmente, quindi il traversal può funzionare anche se la directory page- non esiste. Su Linux, quella directory deve esistere realmente.
Condizioni:
register_argc_argv è impostato su Onpearcmd.php leggibile sul serverL'attaccante include pearcmd.php tramite LFI e sfrutta il suo comando config-create per scrivere un file PHP sul server, quindi include nuovamente quel file tramite LFI per eseguire comandi arbitrari.
CVE-2026-87902 è stata scoperta e segnalata da Robert Ressl, un ricercatore di sicurezza con sede in Svizzera.
Segnalata tramite il programma HackerOne di WordPress nel luglio 2026. Il WordPress Security Team ha coordinato la correzione e l'ha rilasciata insieme a WordPress 7.1.2 il 22 settembre 2026.
| Data | Evento |
|---|---|
| Luglio 2026 | Robert Ressl segnala la vulnerabilità tramite il programma HackerOne di WordPress |
| 22 settembre 2026 | Rilasciato WordPress 7.1.2 con la correzione; pubblicato l'avviso |
| 22 settembre 2026 | Rilasciati i backport di sicurezza per i rami dalla 7.0 alla 4.7 |
| 23 settembre 2026 | Gli attaccanti iniziano a sondare i siti vulnerabili |
| 25 settembre 2026 | CISA aggiunge CVE-2026-87902 al catalogo KEV |
| Funzionalità | Descrizione |
|---|---|
| Fingerprinting della versione | Identifica la versione di WordPress tramite meta generator, feed RSS, OPML, readme.html, ?ver= degli asset |
| Verdetto intelligente sulla versione | Utilizza la mappatura delle versioni corrette per determinare se il target rientra nell'intervallo interessato |
| Scoperta del tema | Estrae lo slug del tema attivo, rileva il tema padre, scopre le directory page-* |
| Scoperta degli ID di pagina | Trova ID di pagina validi tramite REST API, classe body page-id-, shortlink |
| Validazione dell'oracolo LFI | Utilizza file sicuri come wp-links-opml.php e wp-trackback.php come oracoli con controlli negativi |
| Traversal con doppia codifica | Codifica automaticamente due volte in percentuale / e . per aggirare sanitize_title_for_query() |
| Sfruttamento RCE tramite PEAR | Prova percorsi PEAR comuni, scrive ed esegue file marker tramite config-create |
| Scansione di massa | Scansione concorrente multi-thread di elenchi di target |
| Output dei risultati | Salva i risultati in vuln_lfi.txt e vuln_lfitorce.txt |
pip install requests
python3 CVE-2026-87902.py
Menu interattivo:
[1] Scansione singola LFI [2] Scansione singola LFI + RCE [3] Scansione di massa LFI [4] Scansione di massa LFI + RCE [5] Esci
Scegli [1], inserisci l'URL del target:
url > https://target.example.com
Scegli [2], inserisci URL e comando (predefinito id):
url > https://target.example.com cmd > id
Scegli [3] o [4], inserisci il file contenente gli URL dei target (uno per riga, # per i commenti):
file > targets.txt
| File | Contenuto |
|---|---|
| vuln_lfi.txt | Target LFI confermati |
| vuln_lfitorce.txt | Target RCE sfruttati con successo |
TIMEOUT = 8 # Timeout della richiesta (secondi) THREADS = 200 # Thread concorrenti per la scansione di massa USE_ALL_ORACLES = False # Usa tutti gli oracoli (più accurato ma più lento)