## https://sploitus.com/exploit?id=2F9CB88F-45B0-53EF-953B-2455889C1EB2
# XSS2Shell β PoC de CVE-2026-64638
> Proof of Concept educativa de la cadena **XSS2Shell** (CVE-2026-64638),
> vulnerabilidad pre-autenticaciΓ³n XSS β RCE en WordPress Core descubierta
> de forma autΓ³noma por **pwn.ai** y divulgada el 7 de agosto de 2026.
---
## Tabla de contenidos
1. [Resumen ejecutivo](#resumen-ejecutivo)
2. [Aviso legal](#aviso-legal)
3. [Arquitectura de la cadena](#arquitectura-de-la-cadena)
4. [Requisitos](#requisitos)
5. [Estructura del repositorio](#estructura-del-repositorio)
6. [GuΓa rΓ‘pida de uso](#guΓa-rΓ‘pida-de-uso)
7. [VerificaciΓ³n de la explotaciΓ³n](#verificaciΓ³n-de-la-explotaciΓ³n)
8. [DocumentaciΓ³n adicional](#documentaciΓ³n-adicional)
---
## Resumen ejecutivo
**CVE-2026-64638** es una vulnerabilidad de tipo *cross-site scripting* (XSS)
reflejado, pre-autenticaciΓ³n, en la pantalla de inicio de sesiΓ³n de WordPress
(`wp-login.php`). Afecta a **todas las versiones** de WordPress bajo
mantenimiento anteriores a la 7.0.3, publicada el 6 de agosto de 2026 como
*security release* de emergencia. Se le asignΓ³ un CVSS v4.0 de **8.9**.
La cadena bautizada **XSS2Shell** demuestra cΓ³mo, partiendo ΓΊnicamente de un
intento de *login* fallido con un *username* manipulado, un atacante puede:
1. Inyectar elementos DOM vivos en la pΓ‘gina de *login* aprovechando una
discrepancia entre dos analizadores sintΓ‘cticos de PHP (`strip_tags`) y de
WordPress (`wp_kses_post`).
2. Secuestrar el flujo de ejecuciΓ³n del JavaScript propio de WordPress
(`user-profile.js`) para realizar una peticiΓ³n REST JSONP al propio origen.
3. Convertir la respuesta JSONP en ejecuciΓ³n de JavaScript en el origen de
WordPress mediante `jQuery.globalEval()`.
4. Encadenar todo ello con la tΓ©cnica *Same Origin Method Execution* (SOME) de
Paulos Yibelo (2022) para hacer *click* automΓ‘ticamente en el botΓ³n de
aprobaciΓ³n de *Application Passwords* dentro de la sesiΓ³n autenticada de un
administrador.
5. Capturar la credencial *Application Password* resultante, publicar una
pΓ‘gina con JavaScript malicioso y, finalmente, subir un *plugin* en formato
ZIP que ejecuta PHP en el servidor.
El resultado es **ejecuciΓ³n remota de cΓ³digo** (RCE) en el servidor WordPress,
bajo el usuario del proceso *web* (tΓpicamente `www-data`), partiendo de un
ΓΊnico *click* del administrador sobre un enlace controlado por el atacante.
---
## Aviso legal
Este repositorio contiene material estrictamente **educativo y defensivo**.
- **PropΓ³sito:** demostrar la cadena de explotaciΓ³n con fines de formaciΓ³n,
auditorΓa propia y validaciΓ³n de *patches*.
- **Uso autorizado:** ejecΓΊtalo **ΓΊnicamente** contra instalaciones de
WordPress que te pertenezcan o sobre las que dispongas de autorizaciΓ³n
escrita explΓcita.
- **Prohibido:** cualquier uso contra sistemas de terceros sin consentimiento.
El autor del repositorio no se responsabiliza del uso indebido del material
aquΓ incluido.
- **Responsabilidad:** el operador es el ΓΊnico responsable del cumplimiento de
la legislaciΓ³n aplicable (LOPD/RGPD en EspaΓ±a, CFAA en EE. UU., etc.).
La PoC se entrega con un entorno Docker autocontenido cuya ΓΊnica finalidad es
servir como blanco local y reproducible.
---
## Arquitectura de la cadena
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. XSS pre-auth en wp-login.php β
β log= β
β (discrepancia strip_tags β wp_kses_post) β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. user-profile.js dispara .trigger('click') β
β DOM clobbering de ajaxurl β peticiΓ³n POST al origen β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. REST JSONP responde application/javascript β
β jQuery.globalEval() ejecuta el callback en el origen WP β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β callback = window.opener
β .approve.click
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. SOME: click() cruza la frontera openerβadmin β
β authorize-application.php#approve se pulsa en sesiΓ³n admin β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. WP crea Application Password β redirige a success_url β
β El atacante captura user_login + password en callback.php β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β HTTP Basic REST
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 6. POST /wp-json/wp/v2/pages β publica pΓ‘gina con β
β El admin visita la pΓ‘gina β JS en origen WP con sesiΓ³n admin β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 7. fetch update.php?action=upload-plugin β sube payload.zip β
β PHP del plugin es accesible directamente sin activarlo β
ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 8. RCE confirmada: GET /wp-content/plugins/payload/shell.php β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
## Requisitos
La PoC estΓ‘ construida para ejecutarse en **macOS** o **Linux** con:
- **Docker** 24+ y **Docker Compose** v2 (para el blanco local).
- **Python** 3.9+ (para el orquestador opcional).
- **PHP** 8.1+ con extensiΓ³n `zip` (para construir el *payload* manualmente,
opcional; el ZIP ya construido se incluye en `payload/`).
- Un navegador moderno basado en Chromium o Firefox.
No es necesario instalar WordPress manualmente: el `docker-compose.yml`
levanta un WordPress 7.0.2 vulnerable (la ΓΊltima versiΓ³n anterior al parche)
junto con MariaDB.
---
## Estructura del repositorio
```
POC XSS2Shell (CVE-2026-64638)/
βββ README.md β Este archivo
βββ docker-compose.yml β Blanco: WordPress 7.0.2 + MariaDB
βββ .env.example β Variables de configuraciΓ³n
βββ exploit.py β Orquestador en Python (opcional)
βββ attacker/ β Infraestructura del atacante
β βββ index.html β PΓ‘gina cebo con la cadena SOME
β βββ callback.php β Receptor de la Application Password
β βββ server.py β Servidor estΓ‘tico + PHP embebido
βββ payload/ β Plugin ZIP malicioso
β βββ build_payload.py β Generador del ZIP
β βββ shell.php β Webshell mΓnimo
β βββ payload.zip β ZIP preconstruido (listo para usar)
βββ docs/
βββ ANALISIS.md β AnΓ‘lisis tΓ©cnico detallado
βββ MITIGACION.md β GuΓa de mitigaciΓ³n y hardening
```
---
## GuΓa rΓ‘pida de uso
### 1. Levantar el blanco (WordPress 7.0.2 vulnerable)
```bash
cp .env.example .env
docker compose up -d
```
WordPress quedarΓ‘ accesible en . Sigue el asistente de
instalaciΓ³n y crea un usuario **administrador** (por ejemplo `admin` /
`admin-password`).
> El Dockerfile ancla la imagen a `wordpress:7.0.2-php8.2-apache`, que es la
> ΓΊltima versiΓ³n anterior al parche 7.0.3.
### 2. Levantar la infraestructura del atacante
```bash
# En otro terminal, dentro de attacker/
python3 server.py
```
El servidor atacante escucha en y expone:
- `/` β `index.html` (la pΓ‘gina cebo).
- `/callback.php` β receptor de la Application Password.
### 3. Simular el *click* del administrador
1. Inicia sesiΓ³n como administrador en .
2. En la **misma sesiΓ³n del navegador**, abre una nueva pestaΓ±a y visita
.
3. VerΓ‘s un ΓΊnico botΓ³n Β«Approve ApplicationΒ». Al pulsarlo se ejecuta toda la
cadena de forma automΓ‘tica.
### 4. Observar la captura de credenciales
En el terminal donde corre `server.py` aparecerΓ‘ una lΓnea del tipo:
```
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
```
La credencial se guarda tambiΓ©n en `attacker/captured_credentials.txt`.
### 5. Ver el RCE
Tras unos segundos, el orquestador de `index.html` habrΓ‘:
- Publicado una pΓ‘gina que ejecuta JavaScript en el origen de WordPress.
- Subido el plugin `payload.zip` a `wp-content/plugins/payload/`.
Verifica la ejecuciΓ³n de cΓ³digo con:
```bash
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
```
Una cabecera `Hacked: true` y un cuerpo JSON confirman el RCE.
---
## VerificaciΓ³n de la explotaciΓ³n
Una vez completada la cadena, los siguientes *endpoints* sirven de evidencia:
| Recurso | Evidencia esperada |
|----------------------------------------------------|---------------------------------------------|
| `GET /wp-content/plugins/payload/shell.php` | Cabecera `Hacked: true` + JSON `{"rce":true,"user":"www-data"}` |
| `attacker/captured_credentials.txt` | Application Password capturada |
| `wp-admin β Aplicaciones β ContraseΓ±as de aplicaciΓ³n` | Una nueva entrada llamada Β«SomeAppΒ» |
---
## DocumentaciΓ³n adicional
- [`docs/ANALISIS.md`](docs/ANALISIS.md) β AnΓ‘lisis tΓ©cnico detallado de cada
fase de la cadena, con referencias al cΓ³digo fuente de WordPress.
- [`docs/MITIGACION.md`](docs/MITIGACION.md) β Mitigaciones recomendadas,
*hardening* y verificaciΓ³n del *patch* 7.0.3.
---
## CrΓ©ditos
- InvestigaciΓ³n original y divulgaciΓ³n: **pwn.ai** β
- TΓ©cnica SOME subyacente: **Paulos Yibelo** (2022), publicada en el blog de
pwn.ai y nominada a *Top Web Hacking Techniques* de 2022.
- PoC y empaquetado de este repositorio: trabajo propio con fines educativos.
---
## Licencia
Distribuido bajo licencia MIT. Consulta el archivo `LICENSE` para mΓ‘s detalles.