
🔥 XSS2Shell — сканер CVE-2026-64638 и набор PoC-инструментов
<p align="center">
<img src="https://img.shields.io/badge/CVE-2026--64638-critical?style=for-the-badge&logo=wordpress&logoColor=white&color=dc143c" alt="CVE-2026-64638">
<img src="https://img.shields.io/badge/CVSS-8.9-high?style=for-the-badge&color=crimson" alt="CVSS 8.9">
<img src="https://img.shields.io/badge/discovered_by-pwn.ai-7fd1ff?style=for-the-badge" alt="pwn.ai">
<img src="https://img.shields.io/badge/python-3.8+-blue?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.8+">
</p>
<h1 align="center">🔥 XSS2Shell — сканер и PoC-инструментарий для CVE-2026-64638</h1>
<p align="center">
<b>Массовый сканер на основе поведенческого анализа (behavior-first) и генератор PoC-страниц доказательного уровня для цепочки XSS-to-RCE без предварительной аутентификации, затрагивающей 500M+ веб-сайтов на WordPress.</b><br>
<i>Только обнаружение. Без эксплойтов. Создан для программ bug bounty и blue teams.</i>
</p>
<h4 align="center">Официальный чекер: https://pwn.ai/xss2shell-checker.html</h4>
<p align="center">
<a href="#-what-is-cve-2026-64638">Что это?</a> •
<a href="#-quick-start">Быстрый старт</a> •
<a href="#-shodan-dorks">Shodan-дорки</a> •
<a href="#-usage">Использование</a> •
<a href="#-decision-matrix">Матрица решений</a> •
<a href="#-detection-signatures">Обнаружение</a> •
<a href="#-faq">FAQ</a>
</p>
---
## 🔎 Shodan-дорки
Найдите потенциально уязвимые экземпляры WordPress по всему интернету перед сканированием:
### Базовое обнаружение WordPress
```
http.component:"wordpress" -http.title:"Just a moment"
```
Находит сайты на WordPress, исключая режим Cloudflare «I'm Under Attack» и страницы защиты от ботов, которые блокируют автоматические запросы или требуют прохождения проверки (challenge).
### Сужение до страниц входа
```
http.component:"wordpress" http.title:"Log In"
```
Возвращает только страницы входа WordPress — ту самую поверхность атаки, которую использует CVE-2026-64638.
### Поиск по конкретным версиям
```
http.component:"wordpress" "wp-content" "?ver=7.0" -"?ver=7.0.3"
```
Помечает экземпляры WordPress 7.0.x без патча 7.0.3 по отпечаткам версий ресурсов (asset version fingerprinting).
### Расширение поверхности
```
http.component:"wordpress" http.html:"wp-login.php"
```
Находит сайты, где wp-login.php доступен, но не обязательно является текущей страницей — более широкое покрытие.
### Исключение Cloudflare (комбинированное)
```
http.component:"wordpress" -http.title:"Just a moment" -http.title:"Attention Required" -org:"Cloudflare"
```
Агрессивный фильтр, который отсеивает большинство целей, стоящих за Cloudflare. Используйте при масштабном сканировании с `--active` — Cloudflare ограничит частоту запросов или заблокирует пробный запрос.
> **Совет:** Экспортируйте результаты Shodan через `shodan download` и передавайте имена хостов напрямую в `xss2shell_mass.py -i`.
---
## 🚨 Что такое CVE-2026-64638?
7 августа 2026 года **компания pwn.ai раскрыла CVE-2026-64638 (XSS2Shell)** — критическую уязвимость межсайтового скриптинга без предварительной аутентификации в ядре WordPress, которая выстраивается в цепочку вплоть до **удалённого выполнения кода** на сервере. [citation:pwn.ai blog]
Ошибка эксплуатирует расхождение парсеров между `strip_tags()` в PHP и `wp_kses_post()` в WordPress:
- **`strip_tags()`** определяет HTML-теги по символу `<`, за которым сразу следует буква. `< area id=...>` (с пробелом) обрабатывается как **текст** — и сохраняется.
- **`wp_kses_post()`** (KSES) распознаёт `< area` как допустимый элемент `<area>` — а `<area>` входит в **белый список** KSES. [citation:pwn.ai blog]
Одна неудачная попытка входа с особым образом сформированным именем пользователя `< area id=ajaxurl href=/?rest_route=/&_method=GET&_jsonp=alert>...` обходит оба санитайзера, отображается как живой DOM на странице входа, перехватывает собственный скрипт WordPress `user-profile.js` через DOM clobbering и вызывает `alert()` в origin WordPress — **без единого клика, без аутентификации, без файлов cookie**. [citation:pwn.ai blog]
Повышение привилегий до вошедшего в систему администратора? Тот же примитив похищает пароли приложений (Application Passwords) через Same Origin Method Execution (SOME), загружает вредоносный плагин и выполняет PHP-код от имени `www-data`. [citation:pwn.ai blog] [citation:hadrian.io blog]
> **Затронуто:** WordPress 6.4 – 7.0.2 — исправлено в 7.0.3, бэкпорты до 4.7+.
> **Масштаб:** ~500 миллионов веб-сайтов на момент раскрытия. [citation:pwn.ai blog]
### 📰 Ключевые ресурсы
| Ресурс | Ссылка |
|---|---|
| **Первоначальное раскрытие (pwn.ai)** | [pwn.ai/blog/xss2shell](https://pwn.ai/blog/xss2shell) |
| **Технический анализ Hadrian** | [hadrian.io/blog/wordpress-xss2shell](https://hadrian.io/blog/wordpress-xss2shell-unauthenticated-login-screen-xss-to-php-code-execution-cve-2026-64638) |
| **Консультация WordPress (GHSA)** | [GHSA-52p2-r8wf-jcrf](https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-52p2-r8wf-jcrf) |
| **Исследование SOME-атак (2022)** | [pwn.ai/blog/bypass-csp-using-wordpress](https://pwn.ai/blog/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution) |
| **Релиз WordPress 7.0.3** | [wordpress.org/news/2026/08/wordpress-7-0-3-release](https://wordpress.org/news/2026/08/wordpress-7-0-3-release/) |
---
## ⚡ Что делает этот инструментарий
Это инструментарий **только для обнаружения**. Он не превращает уязвимость в эксплойт — он даёт исследователям безопасности, баг-хантерам и blue team всё необходимое, чтобы:
1. **Массово сканировать** сотни хостов WordPress за считанные минуты с точностью поведенческого анализа
2. **Создавать PoC-страницы доказательного уровня**, подтверждающие срабатывание XSS (только alert())
3. **Классифицировать результаты** с точными уровнями уверенности — без ложных срабатываний от сопоставления версий
### 🔑 Почему поведенческий подход (Behavior-First)?
> «Строка версии говорит о том, каким *должен быть* уровень патчей.
> Только поведение санитайзера на странице входа говорит о том, срабатывает ли ошибка *на самом деле*.»
Управляемые хостинги незаметно бэкпортят патчи безопасности, не меняя строку версии. Плагины усиления защиты входа полностью заменяют сообщение об ошибке, убивая канал отражения даже на небезопасных версиях. **Сканеры, работающие только по версиям, дают ложные срабатывания и ложные отрицательные результаты.** Этот сканер отправляет один безвредный пробный запрос и классифицирует *фактическое поведение санитайзера*.
---
## 🚀 Быстрый старт
### Установка
```bash
git clone https://github.com/jakestone/xss2shell.git
cd xss2shell
pip install -r requirements.txt
```
### Сканирование за 5 минут
```bash
# Passive — no probes sent to target, version + endpoint fingerprinting only
python3 xss2shell_mass.py -i domains.txt -o results
# Active — sends ONE benign failed-login per host (authorized assets only!)
python3 xss2shell_mass.py -i domains.txt -o results --active --workers 80
```
### Генерация PoC с доказательной базой
```bash
# Single target
python3 make_poc.py --target https://blog.example.com
# Batch from scanner output
python3 make_poc.py --from-results results.csv -o pocs/
```
Откройте созданный файл `.poc.html` в браузере во время записи видео → если сработает `alert()`, вы зафиксировали доказательство XSS без аутентификации.
---
## 📖 Использование
### Массовый сканер (`xss2shell_mass.py`)
```
usage: xss2shell_mass.py [-h] -i INPUT [-o OUTPUT]
[--active] [--workers WORKERS]
[--timeout TIMEOUT] [--quiet]
```
| Флаг | Описание |
|---|---|
| `-i, --input` | Файл с одним хостом на строку (голый домен или полный URL) |
| `-o, --output` | Базовый путь для выходных файлов (создаёт `.csv` + `.json`) |
| `--active` | Включить поведенческий пробный запрос — один неудачный вход на хост |
| `--workers` | Размер пула потоков (по умолчанию: 50, максимум ~200 для хороших соединений) |
| `--timeout` | Тайм-аут HTTP в секундах (по умолчанию: 10) |
| `--quiet` | Выводить только `confirmed_vulnerable`, `vulnerable` и `likely_vulnerable` |
#### Пассивные данные сканирования (без активного пробного запроса, собираются всегда)
1. **Главная страница** → отпечаток WordPress (meta generator, параметры ресурсов `?ver=`, ссылки на wp-content)
2. **Страница входа** → доступность, определение стандартной формы входа, подключение гаджета `user-profile.js`, версии основных ресурсов
3. **REST JSONP smoke-тест** → безвредный GET-запрос на `/?rest_route=/&_method=GET&_jsonp=<random>` — открыт ли путь JSONP?
4. **Запасной вариант через Feed/Readme** → извлечение версии, если отпечаток главной страницы отсутствует
#### Активный пробный запрос (один POST, флаг `--active`)
Отправляет одну неудачную попытку входа с именем пользователя `< area id=<RANDOM> href=/x2s>` и классифицирует HTML-ответ:
- **`bypass`** — настоящий элемент `<area>` с нашей меткой сохранился → расхождение strip_tags/KSES ПОДТВЕРЖДЕНО
- **`escaped`** — метка присутствует, но закодирована в HTML-сущности → установлен патч или усиление защиты
- **`stripped`** — показана стандартная ошибка WP, теги удалены → `acevomod` или установлен патч
- **`closed`** — имя пользователя вообще не отражается → установлен плагин усиления защиты входа
### Генератор PoC (`make_poc.py`)
```
usage: make_poc.py [-h] [--target TARGET] [--from-results FROM_RESULTS]
[-o OUTDIR]
```
Генерирует для каждой цели **опубликованную PoC-страницу pwn.ai** — ту самую HTML-форму, которая вызывает `alert()` на незапатченном WordPress. В комментарии включены три варианта полезной нагрузки:
| Вариант | Значение `href` | Когда использовать |
|---|---|---|
| **Стандартный (Default)** | `/?rest_route=/&_method=GET&_jsonp=alert` | Стандартный WordPress |
| **Конверт (Envelope)** | `/?rest_route=/&_method=GET&_envelope=1&_jsonp=alert` | REST возвращает 401 (оборачивается в 200) |
| **Обход WAF (WAF Pivot)** | `/wp-json/wp/v2/statuses/publish?_jsonp=alert&_method=GET` | `?rest_route=` блокируется WAF |
---
## 🧠 Матрица решений
Механизм принятия решений сканера объединяет классификацию версий (из API stable-check на WordPress.org) с поведенческими данными и выдаёт 10 различных вердиктов:
| Вердикт | Условия |
|---|---|
| **`confirmed_vulnerable`** 🔴 | Версия небезопасна И метка пробного запроса сохранилась как элемент `<area>` И присутствует гаджет `user-profile.js` |
| **`vulnerable`** 🔴 | Версия небезопасна по данным wordpress.org; поведенческий пробный запрос НЕ выполнялся (повторите с `--active`) |
| **`likely_vulnerable`** 🟠 | Метка пробного запроса сохранилась, НО `user-profile.js` не подключён (отсутствует опубликованный гаджет автозапуска) |
| **`mitigated`** 🟣 | Версия небезопасна, НО метка пробного запроса была закодирована/удалена/не отражена (тихий бэкпорт или усиление защиты) |
| **`likely_patched`** 🟢 | Версия скрыта/неизвестна, НО метка пробного запроса была закодирована/удалена |
| **`patched`** 🟢 | Версия `latest` или `outdated` (с бэкпортами безопасности) |
| **`not_wordpress`** ⚫ | Отпечаток WordPress не обнаружен |
| **`unreachable`** ⚫ | Соединение не удалось (тайм-аут, SSL, DNS) |
| **`inconclusive`** 🟡 | Блокировка WAF, вызов Cloudflare, скрытая версия без пробного запроса или отсутствие страницы входа |
| **`error`** 🟡 | Непредвиденный сбой во время сканирования |
### Формат вывода
**Колонки CSV:** `host`, `url`, `status`, `checker_status`, `wp_version`, `branch_status`, `evidence`, `http`, `ms`, `error`
Колонка `checker_status` соответствует **словарю публичного чекера pwn.ai** (`vulnerable` / `patched` / `not_wordpress` / `unreachable` / `inconclusive` / `error`) для прямой корреляции.
---
## 🔍 Сигнатуры обнаружения (Blue Team / SOC)
Если вы на стороне защиты, вот криминалистические следы, которые оставляет эта уязвимость:
### На стороне сервера (логи веб-сервера / WAF)
```
# Primary signal: encoded '<' in the log parameter
POST /wp-login.php → log=%3C... (URL-encoded < in username field)
# Higher confidence: paired with REST pivoting
GET /?rest_route=/&_method=GET&_jsonp=... # JSONP callback
GET /wp-json/wp/v2/statuses/publish?_jsonp=... # WAF-bypass variant
# Escalation stage indicators
GET /wp-admin/authorize-application.php?success_url=<off-origin>
POST /wp-admin/update.php?action=upload-plugin
GET /wp-content/plugins/<random>/shell.php
```
### Правило блокировки на Edge / WAF
Блокируйте `POST /wp-login.php`, в котором параметр `log` содержит `%3C` (URL-кодированный символ `<`). Допустимые имена пользователей WordPress **никогда** не содержат угловых скобок. Не **сужайте** правило до конкретных тегов — KSES допускает табуляцию, перевод строки и возврат каретки после `<` и любой тег из белого списка, поэтому правило, привязанное к конкретному тегу, тривиально обходится. [citation:hadrian.io blog]
### Ключевой вывод для защитников
Колбэк `_jsonp=` на этапе повышения привилегий использует **точки** для обхода свойств (например, `window.opener.approve.click`). Помечайте REST-запросы с точечными JSONP-колбэками как сильные индикаторы эксплуатации. [citation:hadrian.io blog]
---
## ⚖️ Правовое и этичное использование
```
THIS TOOL IS DETECTION-ONLY. IT DOES NOT:
✗ Weaponize the JSONP callback beyond the public alert()
✗ Include admin-lure pages or Application Password capture
✗ Include REST abuse, plugin upload, or PHP shell code
✗ Execute more than one failed login per target per scan
YOU MUST:
✓ Only scan assets you own or have written authorization to test
✓ Only generate PoCs for your own browser on your own server
✓ Never send PoC links to site admins/users
✓ Never escalate past alert() without program written approval
✓ Follow the bug bounty program scope and rules
This toolkit exists for authorized security research, bug bounty
programs, and defensive detection engineering. Misuse is your
responsibility.
```
---
## 📁 Структура репозитория
```
xss2shell/
├── README.md ← You are here
├── xss2shell_mass.py ← Behavior-first mass scanner (v1.1.0)
├── make_poc.py ← Evidence-grade PoC page generator
├── requirements.txt ← Python dependencies (just `requests`)
├── .gitignore ← Ignores scan outputs and cache
└── example/
├── domains.txt ← Example input file
└── example_output.csv ← Example scan output
```
---
## ❓ FAQ
**В: Почему бы просто не проверить строку версии WordPress?**
О: Управляемые хостинги (WP Engine, Kinsta, Pantheon и т.п.) часто переносят патчи безопасности без изменения версии. Плагины усиления защиты входа полностью заменяют сообщение об ошибке. Оба случая приводят к **ложным срабатываниям** у сканеров, работающих только по версиям, и **ложным отрицательным результатам** для скрытых версий. Этот сканер проверяет *фактическое поведение санитайзера*.
**В: Опасен ли пробный запрос `--active`?**
О: Нет. Он отправляет ровно одну неудачную попытку входа с безвредным именем пользователя-меткой. Он не пытается выполнить JavaScript, не перебирает допустимые имена пользователей и не запускает никакую реальную эксплуатацию. Он менее интрузивен, чем обычная попытка входа.
**В: Можно ли использовать этот инструмент для несанкционированного сканирования?**
О: Нет. Активный пробный запрос отправляет HTTP POST на `/wp-login.php` — это запрос к целевому серверу. Используйте только на активах, которые вам принадлежат или на тестирование которых у вас есть явное письменное разрешение.
**В: В чём разница между `vulnerable` и `confirmed_vulnerable`?**
О: `vulnerable` означает, что API WordPress.org считает версию небезопасной, но мы не подтвердили поведенчески расхождение strip_tags/KSES. `confirmed_vulnerable` означает, что мы отправили пробный запрос, и элемент `<area>` пережил оба санитайзера — **опубликованная цепочка может сработать**.
**В: Можно ли использовать это в отчётах для моей программы bug bounty?**
О: Да! Колонка `checker_status` напрямую соответствует словарю публичного чекера pwn.ai для лёгкой корреляции. Дополняйте результаты сканирования видеодоказательствами PoC из `make_poc.py`, чтобы отчёты были полными.
**В: Обнаруживает ли этот инструментарий цепочку RCE?**
О: Нет. Этот инструментарий обнаруживает **точку входа XSS без аутентификации**. Полная цепочка RCE требует вошедшего администратора, включённых паролей приложений и прав на загрузку плагинов — условий, которые этот сканер не оценивает. Сканер сосредоточен на том, что наблюдаемо извне: обходе санитайзера.
---
## 🏆 Благодарности и ссылки
- **Обнаружение и раскрытие:** [pwn.ai](https://pwn.ai) — обнаружена автономно мультиагентной ИИ-системой
- **Основа техники SOME:** [Paulos Yibelo](https://x.com/@paulosyibelo) — исследование 2022 года, номинированное на Top Web Hacking Techniques
- **Технический анализ:** [Hadrian](https://hadrian.io) — всесторонние рекомендации по обнаружению и смягчению последствий
- **CVE:** CVE-2026-64638 / GHSA-52p2-r8wf-jcrf
- **Патч:** [WordPress 7.0.3](https://wordpress.org/news/2026/08/wordpress-7-0-3-release/)
---
<p align="center">
<sub>Создано <a href="https://github.com/0xlipon">0xlipon</a> • Только обнаружение • Только для авторизованного использования</sub>
</p>