## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ADARSHTHAKUR14777-CYBER-CVE-2026-60137
# wpsqli — экстрактор SQL-инъекций для WordPress (CVE-2026-60137)
> Быстрый инструмент извлечения данных из базы с меню-интерфейсом, эксплуатирующий уязвимость SQL-инъекции `author__not_in` в ядре WordPress. Инструмент сфокусирован исключительно на перечислении и дампе базы данных, используя путаницу маршрутов REST batch-эндпоинта (CVE-2026-63030) для достижения SQLi-приёмника без аутентификации.
* * *
## Содержание
* Обзор
* Цепочка уязвимостей
* Затронутые версии
* Возможности
* Установка
* Использование
* Пункты меню
* Режимы извлечения
* Производительность
* Правовое предупреждение
* * *
## Обзор
`wpsqli` — это инструмент на чистом Python, предназначенный для эксплуатации цепочки уязвимостей в ядре WordPress, позволяющей выполнять неаутентифицированную SQL-инъекцию в базу данных. Он обходит проверки WordPress REST API через баг путаницы batch-маршрутов, доставляя сырую строковую нагрузку напрямую в SQL-приёмник `WP_Query`.
Инструмент создан для скорости и гибкости: он автоматически пытается выполнить UNION-based in-band извлечение (мгновенно), при неудаче переключается на параллельное boolean-blind извлечение в 8 потоков и, наконец, на последовательное time-based извлечение, если это необходимо.
* * *
## Цепочка уязвимостей
Инструмент связывает две независимые уязвимости для достижения неаутентифицированного извлечения данных:
### Баг A — SQL-инъекция `author__not_in` (CVE-2026-60137)
**Расположение:** `wp-includes/class-wp-query.php`, `WP_Query::get_posts()`
Параметр `author__not_in` применяет санитизацию `absint()` только в том случае, если входные данные являются массивом. Если передана строка, проверка `is_array()` пропускается, строка проходит через `implode()` без изменений и конкатенируется как есть в SQL-условие `$where`.
root@kitploit:~
// Строка 2404: защита срабатывает только для МАССИВОВ
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Строка 2408: строка проходит напрямую
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Строка 2409: сырая интерполяция
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
### Баг B — Путаница REST batch-маршрутов (CVE-2026-63030)
Эндпоинт REST API для записей сопоставляет `author_exclude` с `author__not_in`, но объявляет его как `type => 'array'` целых чисел, поэтому ядро приводит/отклоняет строку. Баг B протаскивает строку мимо проверки, используя баг рассинхронизации в REST batch-эндпоинте (`/wp-json/batch/v1`). Путём внедрения повреждённого path-праймера, который отклоняет `wp_parse_url()`, в список batch-запросов внедряется `WP_Error`, что рассинхронизирует `$matches` с `$validation`. Это позволяет следующему подзапросу быть отправленным под неправильным обработчиком без проверки параметров.
* * *
## Затронутые версии
**Предупреждение:** SQLi-приёмник достижим только при условии, что постоянный объектный кеш (Redis/Memcached) НЕ используется.
* * *
## Возможности
* **Без зависимостей:** Чистая стандартная библиотека Python. `pip install` не требуется.
* **Трёхуровневое извлечение:**
* **UNION-based:** Формирует поддельную строку `wp_posts` для извлечения целых строк за один HTTP-запрос (мгновенно).
* **Boolean-blind (параллельно):** Если UNION заблокирован объектным кешированием, использует 8 параллельных потоков с бинарным поиском для извлечения ~7 запросов на символ.
* **Time-based (последовательно):** Запасной вариант, если boolean-оракул не возвращает строк.
* **Полное перечисление:** Вывод списка баз данных, таблиц и колонок.
* **Дамп таблиц:** Дамп отдельных таблиц, всех таблиц в БД или полный «ядерный» дамп в текстовый файл с меткой времени.
* **Корректное прерывание:** `Ctrl+C` во время извлечения останавливает текущий запрос и возвращает частичные результаты без завершения сеанса.
* **Постоянство сеанса:** Подключитесь один раз и выполняйте несколько запросов через интерактивное меню.
* **Санитизация URL:** Автоматически удаляет пути/запросы из введённого хоста, чтобы предотвратить дублирование эндпоинтов.
* **Вывод, готовый к взлому:** Дампы пользователей включают формат `ID|user_login|user_pass` с bcrypt-хешами, готовыми для `hashcat -m 35500`.
* * *
## Установка
Установка не требуется. Просто скачайте и запустите:
root@kitploit:~
# Клонируем репозиторий
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Переходим в директорию
cd CVE-2026-60137
# Запускаем
python main.py
**Требования:**
* Python 3.8+
* Внешние пакеты не требуются (только стандартная библиотека)
* * *
## Использование
Запустите интерактивное меню:
root@kitploit:~
python main.py
### Пример сеанса
root@kitploit:~
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
ПОДКЛЮЧЕНИЕ
0. Подключиться / Сменить цель
1. Проверить цель (версия + подтверждение уязвимости)
------------------------------------------------------------
СБОР ОТПЕЧАТКОВ
2. Версия MySQL (@@version)
3. Имя текущей базы данных
4. Текущий пользователь БД
5. Префикс таблиц WordPress
6. Дамп wp_users (ID, логин, хеш пароля)
7. Пользовательский SQL-запрос
8. Извлечь все отпечатки (2+3+4+5)
------------------------------------------------------------
ПЕРЕЧИСЛЕНИЕ
9. Список всех баз данных
10. Список всех таблиц (текущая БД)
11. Список колонок таблицы
------------------------------------------------------------
ДАМП
12. Дамп конкретной таблицы
13. Дамп всех таблиц (текущая БД)
14. Полный дамп в файл (все таблицы + все строки)
------------------------------------------------------------
15. Выход
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
* * *
## Пункты меню
### Подключение
Опция| Описание
---|---
`0`| Подключение к цели (URL автоматически санитизируется)
`1`| Проверка уязвимости и активного режима извлечения
### Сбор отпечатков
### Перечисление
Опция| Описание
---|---
`9`| Список всех баз данных на MySQL-сервере
`10`| Список всех таблиц в текущей или указанной базе данных
`11`| Список всех имён колонок для конкретной таблицы
### Дамп
Опция| Описание
---|---
`12`| Дамп одной таблицы (с опциональным лимитом строк и сохранением в файл)
`13`| Дамп всех таблиц в текущей базе данных
`14`| Полный «ядерный» дамп — все таблицы + все строки в файл с меткой времени
* * *
## Режимы извлечения
Инструмент автоматически пробует три режима извлечения в порядке убывания скорости:
### 1\. UNION-Based (мгновенно)
Формирует поддельную строку `wp_posts` с извлечённым значением, закодированным в hex в колонке `post_title` (обёрнутым в маркеры `||..||`). REST API отражает её в ответе — вся строка за один HTTP-запрос.
* **1 запрос на запрос к БД**
* Работает только при отсутствии активного постоянного объектного кеша
* Использует `CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c)` для кодирования результата
### 2\. Boolean-Blind (параллельно)
Если UNION недоступен, использует 8 параллельных потоков с бинарным поиском для извлечения каждого символа. Boolean-оракул проверяет, возвращает ли внедрённое `AND (condition)` строки.
* **~7 запросов на символ** (распараллелено на 8 потоков)
* Бинарный поиск по диапазону ASCII 32-126
* Предварительное сканирование длины строки бинарным поиском перед извлечением
* Прогресс отображается как количество завершённых символов
### 3\. Time-Based (последовательно)
Запасной вариант, если boolean-оракул не возвращает строк (например, сайт с 0 опубликованных записей). Использует `IF(condition, SLEEP(N), 0)` для кодирования истины в задержке ответа.
* **~7 × sleep_delay секунд на символ** (последовательно)
* Самый медленный режим, но работает на пустых базах данных
* * *
## Производительность
### Примеры замеров времени (Boolean, 8 потоков)
* * *
## Правовое предупреждение
Этот инструмент предназначен только для авторизованного тестирования безопасности и образовательных целей. Вы должны использовать этот инструмент только против систем, которыми владеете или на тестирование которых имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам противозаконен.
Авторы и участники этого инструмента не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением. Используйте на свой страх и риск.
* * *
## Благодарности
* Цепочка уязвимостей обнаружена **Adam Kues** (Assetnote / Searchlight Cyber)
* Техника UNION поддельной записи: **sergiointel/wp2shell-poc** (первоисточник)
* Реализация адаптирована из: **Icex0/wp2shell-poc**
* Техника обнаружения путаницы маршрутов: **Hadrian / Icex0**
* * *
## Лицензия
Этот инструмент предоставляется исключительно для образовательных целей и авторизованного тестирования.