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-poc — PoC para CVE-2026-87902 — path traversal no autenticado en la resolución de plantillas de página de WordPress (inclusión local de PHP, RCE condicional) con un laboratorio vulnerable fijado | Kitploit
Herramientas/GitHubGitHub/ressl/cve-2026-87902-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebVirtualización de SeguridadSeguridad WebPruebas de PenetraciónLabs y Práctica
GitHubressl/cve-2026-87902-poc

cve-2026-87902-poc

PoC para CVE-2026-87902 — path traversal no autenticado en la resolución de plantillas de página de WordPress (inclusión local de PHP, RCE condicional) con un laboratorio vulnerable fijado

Ver Repositorio
39859hace 26 díasAún no revisado
Sitio web

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 — WordPress Core: path traversal no autenticado en la resolución de plantillas de página

Inclusión local de archivos PHP no autenticada en WordPress Core mediante un valor pagename con doble codificación — y, bajo condiciones específicas de despliegue, ejecución de código PHP con los privilegios de la cuenta del servidor web.

CVECVE-2026-87902
Aviso del proveedorGHSA-7hp8-65ch-5whp
AnálisisCVE-2026-87902: Critical WordPress file inclusion and conditional RCE
AfectadoWordPress Core 4.7.0 – 7.1.1 (todas las ramas, según los rangos por rama del aviso); reproducido dinámicamente en 7.0.2
Corregido7.1.2 (rama 7.1), 7.0.6 (rama 7.0) y un backport para todas las ramas hasta 4.7.37 (según el aviso)
DebilidadesCWE-98 (control inadecuado del nombre de archivo en include), CWE-22 / CWE-23 (path traversal)
CVSS v3.1CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H — 8.1 Alta
CVSS v4.0 (complementario)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 — 9.2 Crítica
Autenticaciónninguna — sin cuenta, cookie, nonce, sesión, plugin ni petición saliente
Interacción del usuarioninguna
AutorRobert Ressl — ressl.ch
PoC verificado2026-09-22 contra el laboratorio de este repositorio — véase Resultados verificados

Resumen

WordPress resuelve una plantilla de Página mediante una cadena que nunca comprueba que el archivo seleccionado permanezca dentro de la raíz de un tema:

  1. pagename y page_id son variables de consulta públicas que WP::parse_request() acepta desde un cuerpo POST anónimo.
  2. Un traversal con doble codificación en pagename sobrevive a la sanitización temprana de la consulta como octetos %xx escapados (wp_basename() no puede ver %2f como separador, y sanitize_title_with_dashes() conserva deliberadamente los octetos válidos).
  3. Un page_id válido selecciona entonces una Página publicada real, mientras que el pagename malicioso permanece en el objeto de consulta.
  4. get_page_template() llama después a urldecode() sobre ese valor y añade un candidato como page-templates/../../../../../../../usr/local/lib/php/pearcmd.php a la jerarquía de plantillas.
  5. locate_template() y el cargador final de plantillas solo comprueban la existencia, la legibilidad y el sufijo .php/.html — nunca que la ruta canónica siga estando dentro de una raíz de tema permitida — y luego lo include.

Eso constituye una primitiva de inclusión local de archivos remota no autenticada en WordPress Core. En el entorno de ejecución oficial probado (wordpress:php8.3-apache, que incluye PEAR y no carga ningún php.ini, por lo que register_argc_argv está en On), la inclusión se encadenó a través de pearcmd.php de PEAR: una primera petición anónima hace que config-create escriba PHP controlado por el atacante en /tmp, y una segunda petición anónima incluye ese archivo y lo ejecuta como www-data.

La falta de contención de rutas en Core es la vulnerabilidad. PEAR es solo una ruta dependiente del entorno desde la inclusión hasta la ejecución de código — no es una dependencia de WordPress y no está presente ni es utilizable en todos los despliegues.

Causa raíz

Ubicaciones del código verificadas (WordPress 7.0.2):

#UbicaciónRol
1wp-includes/class-wp.php:18,322-330pagename y page_id son variables de consulta públicas y se leen de $_POST
2wp-includes/class-wp-query.php:2205sanitize_title_for_query( wp_basename( $query_vars['pagename'] ) ) — %2f no es un separador para wp_basename()
3wp-includes/formatting.php:2283-2289sanitize_title_with_dashes() conserva los octetos %xx válidos en lugar de eliminarlos
4wp-includes/template.php:492$pagename_decoded = urldecode( $pagename ); — el traversal se activa después de la sanitización
5wp-includes/template.php:722-736locate_template() concatena el candidato bajo cada raíz de tema y solo llama a file_exists()
6wp-includes/template-loader.php:116-132realpath() normaliza la ruta, y luego include se ejecuta sin ninguna comprobación canónica de contención en la raíz
7wp-includes/canonical.php:42-47redirect_canonical() retorna anticipadamente para peticiones que no son GET/HEAD, por lo que un POST no se canonicaliza

Precondiciones

La primitiva de inclusión independiente necesita:

#PrecondiciónMotivo
1Una Página publicada y accesible anónimamente, seleccionada mediante un page_id numéricola página debe ser devuelta por la consulta después de que falle la búsqueda del pathname
2Ninguna plantilla de página personalizada resoluble anterioruna plantilla válida asignada se ordena antes que el candidato malicioso
3Un directorio de nivel superior en el tema activo (hijo o padre) cuyo nombre empiece por page-, p. ej. page-templates/WordPress antepone el prefijo fijo page-, por lo que un traversal .. no puede empezar en la posición 0; el directorio solo tiene que existir y ser atravesable — no tiene que ser escribible
4Un archivo local .php seleccionado que exista y sea legible por el usuario de PHPel cargador comprueba is_file()/is_readable() y requiere un sufijo .php
5Ningún confinamiento del sistema de archivos que bloquee ese archivoun open_basedir o una política MAC pueden impedir la inclusión

La etapa PEAR demostrada necesita además un pearcmd.php legible (junto con sus dependencias), register_argc_argv=On para el SAPI web, y un directorio de salida escribible. Los archivos php.ini de producción establecen register_argc_argv=Off; la imagen probada no carga ningún php.ini, por lo que se aplicó el valor predeterminado compilado (On). Esta es una limitación importante sobre la prevalencia de la cadena de ejecución de código demostrada.

Los temas incluidos Twenty Twenty-Three/Four/Five no incluyen ningún directorio page-* de nivel superior, por lo que el laboratorio estándar necesita el fixture descrito a continuación. Los temas personalizados pueden usar legítimamente una estructura page-templates/ (documentación de WordPress).

El aviso registra dónde se producen estas condiciones en software distribuido: la condición del tema se cumple en los temas heredados Twenty Twelve y Twenty Fourteen y en temas de terceros como Neve, Hestia y Sydney, mientras que la transición a PEAR se aplica a la imagen oficial de PHP para Docker y a las configuraciones predeterminadas de cPanel que ejecutan PHP anterior a 8.5. (Twenty Twelve y Twenty Fourteen incluyen ambos un directorio page-templates/ de nivel superior; las demás afirmaciones son del aviso). Este repositorio no mide con qué frecuencia se aplica la cadena completa.

Inicio rápido

./lab/up.sh            # WordPress 7.0.2 + MySQL 8.4 + the page-* fixture, installed and ready
python3 cve-2026-87902.py   # two anonymous POSTs, prints the proof marker

cve-2026-87902.py necesita Python 3.6+ (solo biblioteca estándar) y accede al laboratorio en http://127.0.0.1:8091 de forma predeterminada. Salida esperada:

Descargar herramienta