
PoC funzionale di CVE-2026-64638 (XSS2Shell): catena pre-auth XSS a RCE in WordPress Core. Laboratorio Docker + server attaccante Python + analisi tecnica e mitigazione.
Proof of Concept educativa della catena XSS2Shell (CVE-2026-64638), vulnerabilità pre-autenticazione XSS → RCE nel WordPress Core scoperta in modo autonomo da pwn.ai e divulgata il 7 agosto 2026.
CVE-2026-64638 è una vulnerabilità di tipo cross-site scripting (XSS)
riflesso, pre-autenticazione, nella schermata di accesso di WordPress
(wp-login.php). Interessa tutte le versioni supportate di WordPress
precedenti alla 7.0.3, pubblicata il 6 agosto 2026 come security release
di emergenza. Le è stato assegnato un CVSS v4.0 di 8.9.
La catena battezzata XSS2Shell dimostra come, partendo unicamente da un tentativo di login fallito con un username manipolato, un attaccante può:
strip_tags) e di WordPress
(wp_kses_post).user-profile.js) per effettuare una richiesta REST JSONP alla stessa
origine.jQuery.globalEval().Il risultato è l'esecuzione remota di codice (RCE) sul server WordPress,
sotto l'utente del processo web (tipicamente www-data), partendo da un
singolo click dell'amministratore su un link controllato dall'attaccante.
Questo repository contiene materiale strettamente educativo e difensivo.
La PoC viene fornita con un ambiente Docker autocontenuto la cui unica finalità è servire come bersaglio locale e riproducibile.
┌─────────────────────────────────────────────────────────────────────┐
│ 1. XSS pre-auth en wp-login.php │
│ log=< area id=ajaxurl href=/?rest_route=/&_jsonp=...> │
│ (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 <script> │
│ 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 │
└─────────────────────────────────────────────────────────────────────┘
La PoC è costruita per essere eseguita su macOS o Linux con:
zip (per costruire il payload manualmente,
opzionale; il ZIP già costruito è incluso in payload/).Non è necessario installare WordPress manualmente: il docker-compose.yml
avvia un WordPress 7.0.2 vulnerabile (l'ultima versione precedente alla
patch) insieme a MariaDB.
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
cp .env.example .env
docker compose up -d