## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-BHANUNAMIKAZE-WP2SHELL-CVE-2026-63030-POC
# WP2Shell Детектор и PoC валидации
    
> **Охват CVE:** CVE-2026-63030 и CVE-2026-60137 **Назначение:** Только авторизованное тестирование безопасности, защитная валидация и одноразовые локальные лаборатории
WP2Shell — это цепочка уязвимостей ядра WordPress, объединяющая баг путаницы пакетных маршрутов REST API до аутентификации (**CVE-2026-63030**) с примитивом SQL-инъекции `author__not_in` в `WP_Query` (**CVE-2026-60137**). Этот репозиторий предоставляет Python-сканер доказательства концепции и безопасный валидатор, чтобы защитники могли идентифицировать затронутые установки WordPress, подтвердить уязвимое поведение в изолированной лаборатории и проверить исправление — без необходимости извлечения данных или достижения выполнения кода.
## Обзор
Этот проект идентифицирует установки WordPress и проверяет два примитива уязвимости, связанных с цепочкой уязвимостей ядра WordPress **WP2Shell** :
* **CVE-2026-63030** — Путаница пакетных маршрутов REST API.
* **CVE-2026-60137** — Неполная санитизация `WP_Query::author__not_in`, что может привести к SQL-инъекции, когда подконтрольные злоумышленнику данные достигают параметра.
Когда оба условия присутствуют, неаутентифицированный запрос может достичь уязвимой SQL-конструкции через конечную точку пакетного REST API WordPress. Публичные уведомления описывают совокупное воздействие как потенциально ведущее к удаленному выполнению кода.
Этот репозиторий следует использовать только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение. Предпочтительнее использовать изолированную лабораторию Docker или виртуальной машины, привязанную к `127.0.0.1`.
* * *
## Уведомление о безопасности
Текущий исходный файл содержит функциональность, изменяющую состояние, включая попытки извлечения данных из базы данных, попытки записи в файлы, рабочие процессы аутентификации, создание администратора, загрузку плагинов и выполнение команд.
* Снятие отпечатков WordPress.
* Оценка версии.
* Проверки версий локального дерева исходного кода.
* Безопасная проверка путаницы маршрутов.
* Неразрушающее подтверждение SQL-инъекции на основе времени в изолированной лаборатории.
* Отчетность, сбор доказательств и устранение.
* * *
## Сводка уязвимостей
### CVE-2026-63030 — Путаница пакетных маршрутов REST API
Затронутые релизы WordPress могут терять согласованность между внутренними массивами, используемыми для отслеживания:
* Разобранных пакетных запросов.
* Сопоставленных обработчиков маршрутов REST.
* Результатов проверки.
Когда искаженный элемент пакета принимается в один внутренний массив, но не в другой, последующие запросы могут быть связаны с неправильным обработчиком. Таким образом, запрос может быть проверен как один маршрут, но выполнен с использованием функции обратного вызова другого маршрута.
**Влияние на безопасность:**
* Десинхронизация запроса/обработчика REST.
* Проверка по схеме неправильного маршрута.
* Неожиданное выполнение вложенных пакетов.
* Достижимость до аутентификации путей кода, которые в противном случае были бы ограничены.
* В сочетании с CVE-2026-60137 — потенциальная SQL-инъекция и дальнейшая компрометация.
### CVE-2026-60137 — SQL-инъекция в `author__not_in`
Затронутая реализация `WP_Query` не всегда нормализует `author__not_in` перед использованием для построения SQL-условия `NOT IN (...)`.
Параметр обычно ожидает список целочисленных идентификаторов авторов. Если скалярная строка попадает в уязвимую конструкцию запроса без предусмотренной проверки схемы REST, небезопасная SQL-структура может сохраниться в запросе к базе данных.
**Влияние на безопасность:**
* Слепая SQL-инъекция.
* Оракул базы данных на основе булевых значений или времени.
* Потенциальное раскрытие содержимого базы данных WordPress.
* Усиленное воздействие при объединении с CVE-2026-63030.
* * *
## Затронутые версии
WordPress выпустила исправления 17 июля 2026 года и включила принудительные автоматические обновления для затронутых установок из-за серьезности.
* * *
## Рабочий процесс уязвимости```text
Unauthenticated client | v WordPress REST batch endpoint | v Malformed batch member creates request/handler misalignment | v Later request is validated against one route but dispatched using another route's handler | v Scalar author_exclude reaches WP_Query as author__not_in | v Unsafe value reaches SQL NOT IN (...) construction | v Blind SQL timing or Boolean oracle | v Potential database compromise | v Potential application-level compromise and RCE
root@kitploit:~
Детектор должен остановиться после подтверждения примитивов route-confusion и SQL-инъекции. Ему не нужно извлекать данные или выполнять команды, чтобы установить, что скомпрометированная установка уязвима.
---
## Процесс обнаружения
### Этап 1 — Нормализация цели
Инструмент:
1. Добавляет схему по умолчанию `http` или `https`, если она отсутствует.
2. Нормализует путь установки WordPress.
3. Отклоняет неподдерживаемые схемы URL и встроенные учётные данные.
4. Применяет политики перенаправлений, прокси, TLS и тайм-аутов.
### Этап 2 — Идентификация WordPress
Сканер проверяет:
- ссылки на `wp-content/`;
- ссылки на `wp-includes/`;
- метаданные генератора WordPress;
- ссылки обнаружения REST API;
- структуру индекса WordPress REST;
- пространство имён `wp/v2`;
- необязательные фид и `readme.html`.
### Этап 3 — Определение версии
Доказательства версии могут поступать из:
- метаданных HTML-генератора;
- метаданных фид-генератора;
- строк запроса основных ресурсов WordPress;
- HTTP-заголовков генератора;
- `readme.html`;
- локального файла `wp-includes/version.php`.
Доказательства оцениваются и сопоставляются. Противоречивые удалённые индикаторы версии снижают достоверность.
### Этап 4 — Проверка доступности пакетного маршрута
Сканер пытается обнаружить `/batch/v1` через:```text
/?rest_route=/
/wp-json/
Маршрут можно указать, используя:```text /?rest_route=/batch/v1 /wp-json/batch/v1
root@kitploit:~
### Фаза 5 — Безопасный зонд на путаницу маршрутов
Безопасный зонд содержит:
1. Намеренно искажённый внутренний путь.
2. Запрос к недействительному ID поста с безвредным вложенным публичным `GET`.
3. Последующий запрос `/batch/v1`.
Уязвимый сервер возвращает внешний ответ `207 Multi-Status`, в котором запрос к недействительному посту обрабатывается как вложенный пакетный запрос.
Детектор сообщает:```text
route-confusion-observed
when it sees:
* Ожидаемый маркер `parse_path_failed`.
* Второй внешний ответ со статусом `207`.
* Вложенный массив `responses`, показывающий, что безвредный внутренний запрос выполнен.
### Фаза 6 — Подтверждение SQLi на основе времени
Нерарушающий валидатор SQLi должен отправлять парные запросы, отличающиеся только константным булевым условием:```text False control -> no deliberate database delay True test -> deliberate database delay
root@kitploit:~
Валидатор должен:
- Принимать ожидаемый внешний HTTP `207`.
- Разбирать как внешние, так и вложенные пакетные конверты.
- Проверять маркеры некорректных запросов.
- Убеждаться, что вложенный запрос с SQL-инъекцией вернул допустимый ответ.
- Собирать несколько истинных и ложных образцов.
- Перемешивать или чередовать порядок образцов.
- Сравнивать медианы, а не единичный запрос.
- Сообщать о недостаточных измерениях как `inconclusive`.
Повторяемый разрыв между истинными и ложными образцами подтверждает, что контролируемый атакующим ввод достиг SQL-оценки. Нет необходимости выбирать или извлекать содержимое базы данных.
---
## Требования
- Python 3.9 или новее.
- Для предоставленного скрипта не требуется сторонних Python-пакетов.
- Сетевой доступ к авторизованной установке WordPress.
- Для локального тестирования:
- Одноразовая лабораторная установка WordPress 7.0.1 или 6.9.4.
- Контейнер базы данных или выделенная тестовая база данных.
- Веб-сервис, привязанный к `127.0.0.1`.
- Без производственных учётных данных или данных.
Проверка Python:```bash
python3 --version
Опциональная проверка синтаксиса:```bash python3 -m py_compile WP2Shell_CVE-2026-63030_POC.py
root@kitploit:~
## Установка
Переименуйте предоставленный скрипт в предсказуемое имя файла:```bash
mv 'poc(1).py' WP2Shell_CVE-2026-63030_POC.py
chmod +x WP2Shell_CVE-2026-63030_POC.py
Показать глобальную справку:```bash python3 WP2Shell_CVE-2026-63030_POC.py --help
root@kitploit:~
Отобразить версию:```bash
python3 WP2Shell_CVE-2026-63030_POC.py --version
* * *
## Команды
Скрипт определяет три команды:```text remote Fingerprint and scan HTTP(S) WordPress targets. local Read the installed WordPress version from a source tree. exploit State-changing proof-of-concept path.
root@kitploit:~
### Текущее состояние сборки
| Команда | Статус |
|---|---|
| `local` | Реализовано |
| `remote` | CLI определён, но `run_remote()` в настоящее время является заглушкой и возвращает ошибку |
| `exploit` | Содержит функциональность, изменяющую состояние; ограничьте использование одноразовой локальной лабораторией и отделите от защитного сканирования |
В настоящее время источник выводит следующее для `remote`:
``````text
Remote scanning not fully implemented in this snippet. Use 'local' or 'exploit'.
Восстановите полную реализацию `run_remote()` перед тем, как рекламировать массовое удаленное сканирование как рабочее.
* * *
# Оценка локальной версии
Команда `local` читает:```text /wp-includes/version.php
root@kitploit:~
и извлекает `$wp_version`.
## Основное использование```bash
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html
## JSON отчет```bash
python3 WP2Shell_CVE-2026-63030_POC.py local
\--wordpress-root /var/www/html
\--format json
\--output local-result.json
root@kitploit:~
## Установка WordPress на основе Docker
Когда контейнер WordPress называется `wordpress`, скопируйте или смонтируйте исходное дерево на хост, или выполните проверку версии внутри контейнера:```bash
docker compose exec wordpress php -r \
'require "/var/www/html/wp-includes/version.php"; echo $wp_version, PHP_EOL;'
## Настройка уязвимой лаборатории с помощью compose.yaml
Используйте предоставленный `compose.yaml` для запуска одноразовой локальной лаборатории, привязанной к `127.0.0.1:8080`:```bash docker compose up -d
root@kitploit:~
После того, как первоначальная установка WordPress завершится в браузере по адресу `http://127.0.0.1:8080`, вы можете запустить:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target http://127.0.0.1:8080 \
--active-probe \
--format json
Чтобы остановить и удалить лабораторию:```bash docker compose down -v
root@kitploit:~
## Параметры локальной команды
| Опция | Описание |
|---|---|
| `--wordpress-root PATH` | Обязательная директория, содержащая `wp-includes/version.php` |
| `-f, --format` | `table`, `json`, `jsonl` или `csv` |
| `-o, --output FILE` | Записать отчёт в файл |
| `--fail-on` | Политика кода выхода: `never`, `vulnerable` или `unknown` |
## Пример вывода vulnerable-version```json
[
{
"selected_version": "7.0.1",
"version_assessment": "affected-wp2shell",
"verdict": "CONFIRMED_AFFECTED_VERSION",
"severity": "critical"
}
]
Результат локальной версии подтверждает, что установленный релиз попадает в опубликованный диапазон уязвимых версий. Сам по себе он не демонстрирует эксплуатацию во время выполнения или влияние обратно перенесенного патча.
* * *
# Интерфейс удаленного сканера
Парсер `remote` поддерживает следующие аргументы, но представленная реализация `run_remote()` в настоящее время неполна.
## Один целевой хост
Ожидаемый интерфейс после восстановления `run_remote()`:```bash python3 WP2Shell_CVE-2026-63030_POC.py remote
\--authorized
\--target https://wordpress.example
\--active-probe
root@kitploit:~
## Несколько явных целей```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://site-one.example \
--target https://site-two.example \
--active-probe
## Целевой файл
Создайте `targets.txt`:```text https://site-one.example/ https://site-two.example/blog/
root@kitploit:~
Ожидаемый интерфейс:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--targets-file targets.txt \
--active-probe \
--format jsonl \
--output results.jsonl
## Стандартный ввод```bash
cat targets.txt | python3 WP2Shell_CVE-2026-63030_POC.py remote
\--authorized
\--stdin
root@kitploit:~
## Использование прокси```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://wordpress.example \
--active-probe \
--proxy http://127.0.0.1:8081
## Пользовательский заголовок запроса```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote
\--authorized
\--target https://wordpress.example
\--header 'Authorization: Bearer TEST_TOKEN'
root@kitploit:~
## Удалённые параметры
| Параметр | Назначение |
|---|---|
| `-u, --target URL` | Целевой URL; повторяемый |
| `-l, --targets-file FILE` | Один целевой объект на строку; повторяемый |
| `--stdin` | Читать цели из stdin |
| `--authorized` | Требуется подтверждение авторизации |
| `--default-scheme` | Схема, применяемая по умолчанию |
| `-c, --concurrency` | Одновременные рабочие процессы |
| `--rate` | Совокупная частота запросов |
| `--timeout` | Таймаут на запрос |
| `--retries` | Количество повторных попыток |
| `--max-targets` | Максимальное количество принимаемых целей |
| `--max-body-bytes` | Максимальный сохраняемый размер тела ответа |
| `-k, --insecure` | Отключить проверку TLS |
| `--no-redirects` | Отключить перенаправления |
| `--allow-cross-host-redirects` | Разрешить перенаправления на другой хост |
| `--proxy` | HTTP/HTTPS прокси |
| `-H, --header` | Пользовательский заголовок; повторяемый |
| `--user-agent` | Переопределить User-Agent |
| `--fingerprint-level` | `quick`, `standard` или `extended` |
| `--active-probe` | Отправить безопасный зонд route-confusion |
| `--rest-endpoint` | `query`, `pretty` или `both` |
| `--include-request-log` | Добавить метаданные URL, статуса и времени |
| `-f, --format` | `table`, `json`, `jsonl` или `csv` |
| `-o, --output` | Записать вывод в файл |
| `--fail-on` | Политика кода выхода |
---
## Безопасная проверка во время выполнения
Для неразрушающей локальной проверки обоих примитивов используйте специальный валидатор, который:
- Отказывается от не-loopback хостов.
- Подтверждает route confusion в первую очередь.
- Запускает образцы времени постоянного состояния только после успешного route confusion.
- Не извлекает данные и не выполняет команды.
Пример рабочего процесса:```bash
python3 wp2shell_local_validator.py check \
--authorized \
--target http://127.0.0.1:8080 \
--sqli \
--delay 2 \
--samples 4 \
--warmups 2 \
--debug \
--dump-dir evidence \
--output result.json
Ожидаемый временной шаблон уязвимой лаборатории:```text False controls: approximately 0.03–0.10 seconds True tests: consistently delayed
root@kitploit:~
Ожидаемый вердикт:```text
FULL_VULNERABILITY_PRIMITIVES_CONFIRMED
Тест на время выполнения может выполнять выражение задержки более одного раза, поэтому настроенная двухсекундная задержка может привести к наблюдаемой задержке около четырех секунд. Важным сигналом является повторяемое различие между истинными и ложными условиями.
* * *
## Форматы вывода
### Таблица
Лучше всего для интерактивного терминала:```bash \--format table
root@kitploit:~
### JSON
Лучше всего подходит для доказательств и интеграции:```bash
--format json --output result.json
### JSON Lines
Лучше всего подходит для больших наборов целей:```bash \--format jsonl --output results.jsonl
root@kitploit:~
### CSV
Лучше всего подходит для электронных таблиц и отчетности:```bash
--format csv --output results.csv
## Вердикты
* * *
## Коды завершения
Сканер использует коды завершения на основе политики.
Таким образом, обнаружение уязвимости может намеренно вернуть ненулевой статус.
Пример:```bash python3 WP2Shell_CVE-2026-63030_POC.py local
\--wordpress-root /var/www/html
\--fail-on vulnerable
echo $?
root@kitploit:~
---
## Дифференциальный тест уязвимой и исправленной версий
### Уязвимая среда```text
WordPress 7.0.1
Ожидается:```text route-confusion-observed repeatable true/false SQL timing difference
root@kitploit:~
### Фиксированное окружение```text
WordPress 7.0.2
Ожидается:```text route-confusion-not-observed SQLi timing test not reached or no valid timing oracle
root@kitploit:~
Всегда пересоздавайте том WordPress при смене версий. Повторное использование тома может сохранить старые или автоматически обновленные основные файлы.```bash
docker compose down -v
docker compose pull
docker compose up -d
* * *
## Исправление
Немедленно обновитесь до одного из исправленных выпусков или более поздней поддерживаемой версии:
* WordPress 6.8.6.
* WordPress 6.9.5.
* WordPress 7.0.2.
* WordPress 7.1 beta2 или позднее (для предварительного тестирования).
Временные меры должны охватывать обе формы пакетных конечных точек:```text /wp-json/batch/v1 /?rest_route=/batch/v1
root@kitploit:~
Дополнительные защитные меры:
1. Проверяйте журналы на наличие анонимных пакетных запросов, некорректных внутренних URL-адресов, вложенных пакетных структур и необычных значений `author_exclude`.
2. После любого периода воздействия проверяйте учетные записи администраторов, изменения плагинов, неожиданные PHP-файлы и доступ к базе данных.
3. Подтверждайте контрольные суммы ядра WordPress и восстанавливайте из заведомо исправной резервной копии, если есть подозрения на компрометацию.
4. Если могла иметь место эксплуатация SQL-инъекции, смените секреты и учетные данные, хранящиеся в базе данных WordPress.
Блокировка конечной точки — временная мера, а не замена обновления ядра WordPress.
---
## Идеи для обнаружения
Потенциальные индикаторы включают:
- Анонимные `POST`-запросы к любой из форм пакетных конечных точек.
- HTTP-ответы `207`, содержащие вложенные массивы `responses`.
- Некорректные внутренние URL-адреса в телах пакетных запросов.
- Вложенные объекты `requests` внутри другого элемента пакета.
- Скалярные или SQL-образные значения `author_exclude`.
- Повторяющиеся парные запросы с чередованием быстрых и задержанных ответов.
- Неожиданное создание администратора WordPress.
- Неожиданная установка или активация плагина.
- Новые PHP-файлы в каталогах WordPress с правом записи.
- Запросы к базе данных, содержащие необычные выражения `author__not_in`.
---
## Известные ограничения в предоставленном скрипте
- Обработка cookie-файлов не эквивалентна постоянной сессии браузера.
- В некоторых путях кода предполагаются префиксы таблиц базы данных.
- Привилегия `FILE` базы данных и пути файловой системы различаются в зависимости от развёртывания.
- `INTO OUTFILE` обычно ограничен и не может перезаписывать существующие файлы.
- WordPress может отключать установку плагинов через `DISALLOW_FILE_MODS`.
- Пороги задержки могут зависеть от прокси, WAF, тайм-аутов PHP, тайм-аутов базы данных и нагрузки.
- Строки версий могут быть скрыты, подделаны, кэшированы или противоречивы.
- Наблюдаемая подверженная версия не доказывает отсутствие бэкпорта безопасности.
- Отсутствие временного сигнала не доказывает, что сервер исправлен.
---
## Ссылки
- Релиз безопасности WordPress 7.0.2:
https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
- Документация WordPress 7.0.2 и изменённые файлы:
https://wordpress.org/documentation/wordpress-version/version-7-0-2/
- NVD — CVE-2026-63030:
https://nvd.nist.gov/vuln/detail/CVE-2026-63030
- NVD — CVE-2026-60137:
https://nvd.nist.gov/vuln/detail/CVE-2026-60137
- Архив релизов WordPress:
https://wordpress.org/download/releases/
---
## Юридическое и этическое использование
Используйте этот проект только если:
- Вы владеете системой, или
- У вас есть явное письменное разрешение, и
- Запрашиваемая тестовая деятельность соответствует согласованному объёму.
Не выставляйте заведомо уязвимые установки WordPress в открытый Интернет. Используйте одноразовые учётные данные, синтетические данные, изолированные сети и чистые снимки. Уничтожайте или сбрасывайте лабораторию после тестирования.
Наиболее безопасным доказательством уязвимости является минимально необходимые доказательства для демонстрации проблемы:```text
Affected version
+
Route-confusion behavior
+
Repeatable constant-condition SQL timing oracle
Кража учетных данных, установка постоянного доступа, установка веб-шелла и выполнение команд не обязательны для подтверждения существования уязвимости.