
Genera una página HTML de activación autoenviable que explota una inyección HTML reflejada en el inicio de sesión de WordPress (CVE-2026-64638) para mostrar un banner personalizado, para pruebas de seguridad autorizadas.
Un generador de PoC de un solo archivo y sin dependencias para la inyección de HTML reflejada CVE-2026-64638 de WordPress en wp-login.php (diferencial entre strip_tags() y el analizador KSES). Produce una página de activación con autoenvío: cuando la víctima abre el archivo, la página envía silenciosamente por POST el payload de inyección y la víctima aterriza directamente en la página de inicio de sesión objetivo con un banner renderizado — sin interacción, sin JavaScript en el lado del objetivo.
Solo para pruebas de seguridad autorizadas. Úsalo únicamente contra sistemas que poseas o para los que tengas autorización explícita de prueba.
| Versiones | Estado |
|---|
| 6.4.0 – 7.0.2 | Vulnerable — funciona de serie |
| 5.8 – 6.3 | Condicional — requiere un plugin que pase login_errors a través de wp_kses() con style permitido |
| 4.7 – 5.7 | No explotable (el nombre de usuario no se refleja) |
| 6.4.9 / 6.5.9 / 6.6.6 / 6.7.6+ / 6.8.7 / 6.9.6 / 7.0.3+ | Parcheado (esc_html) |
python3 banner_poc.py \
--out trigger.html \
--target http://192.0.2.10/wp-login.php \
--msg "Scheduled System Maintenance"
# subdirectorio + ruta de inicio de sesión oculta + subtítulo
python3 banner_poc.py \
--out trigger.html \
--target http://10.0.0.5:8080/blog/my-secret-login \
--msg "Please sign in again" --sub "Session expired"
Aloja trigger.html en cualquier lugar. Cuando la víctima lo abre, es redirigida a la página de inicio de sesión objetivo con el banner renderizado. El salto es silencioso: sin contenido intermedio visible, el fondo coincide con la pantalla de inicio de sesión de WordPress, aterriza en ~0,5 s.
| Flag | Descripción |
|---|---|
--out | Archivo HTML de salida (obligatorio) |
--target | URL completa de la página de inicio de sesión — incluye subdirectorios / rutas de inicio de sesión ocultas (obligatorio) |
--msg | Texto del banner (predeterminado: Scheduled System Maintenance) |
--sub | Línea de subtítulo opcional |
wp-login.php refleja un nombre de usuario de inicio de sesión fallido en el mensaje de error. Las versiones vulnerables lo sanean con PHP strip_tags(), que deja pasar cualquier cosa donde < va seguido de un espacio en blanco.< div style="..."> llega como un elemento real.< /strong> (barra precedida por un espacio) también sobrevive a strip_tags() y se reconstruye como una etiqueta de cierre real, lo que permite que el payload cierre el <strong> de la plantilla (un elemento de formato activo de HTML5) como su primer token y mantenga un control exacto del DOM.div final sin cerrar, de tamaño cero y fuera de pantalla, se traga el texto final de la plantilla ("… is not registered on this site …").class que sobreviven a safecss_filter_attr(). En 6.3+ / 6.4+ position:fixed renderiza una superposición de página completa; en 5.8–6.2 esas propiedades se eliminan y el mismo payload se degrada automáticamente a un banner rojo en el flujo.HTML/CSS puro — no se ejecuta JavaScript en el objetivo. Las reglas WAF dirigidas a <script> o manejadores de eventos no aplican.
Esta herramienta se publica para investigación defensiva y pruebas de penetración autorizadas. El autor no es responsable del mal uso.