
Функциональный 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_tags) и
WordPress (wp_kses_post).user-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).