
wpsqli — полный экстрактор и дампер SQL-инъекций для 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 извлечение, если это необходимо.
Инструмент связывает две независимые уязвимости для достижения неаутентифицированного извлечения данных:
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.
// Строка 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) ";
Эндпоинт 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) НЕ используется.
pip install не требуется.wp_posts для извлечения целых строк за один HTTP-запрос (мгновенно).Ctrl+C во время извлечения останавливает текущий запрос и возвращает частичные результаты без завершения сеанса.ID|user_login|user_pass с bcrypt-хешами, готовыми для hashcat -m 35500.Установка не требуется. Просто скачайте и запустите:
# Клонируем репозиторий
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Переходим в директорию
cd CVE-2026-60137
# Запускаем
python main.py
Требования:
Запустите интерактивное меню:
python main.py
============================================================
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 | Полный «ядерный» дамп — все таблицы + все строки в файл с меткой времени |
Инструмент автоматически пробует три режима извлечения в порядке убывания скорости:
Формирует поддельную строку wp_posts с извлечённым значением, закодированным в hex в колонке post_title (обёрнутым в маркеры ||..||). REST API отражает её в ответе — вся строка за один HTTP-запрос.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) для кодирования результатаЕсли UNION недоступен, использует 8 параллельных потоков с бинарным поиском для извлечения каждого символа. Boolean-оракул проверяет, возвращает ли внедрённое AND (condition) строки.
Запасной вариант, если boolean-оракул не возвращает строк (например, сайт с 0 опубликованных записей). Использует IF(condition, SLEEP(N), 0) для кодирования истины в задержке ответа.
Этот инструмент предназначен только для авторизованного тестирования безопасности и образовательных целей. Вы должны использовать этот инструмент только против систем, которыми владеете или на тестирование которых имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам противозаконен.
Авторы и участники этого инструмента не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением. Используйте на свой страх и риск.
Этот инструмент предоставляется исключительно для образовательных целей и авторизованного тестирования.
| Диапазон версий | Статус |
|---|
| 6.8.0 – 6.8.5 | Баг SQLi присутствует, но цепочка НЕ достижима (batch-путаница появилась в 6.9.0) |
| 6.9.0 – 6.9.4 | УЯЗВИМО — полная цепочка без аутентификации |
| 7.0.0 – 7.0.1 | УЯЗВИМО — полная цепочка без аутентификации |
| 6.8.6 | Исправлено (SQLi) |
| 6.9.5 | Исправлено |
| 7.0.2 | Исправлено |
| 7.1-beta2+ | Исправлено |
| Опция | Описание |
|---|
2 | Извлечение версии MySQL (SELECT @@version) |
3 | Извлечение имени текущей базы данных (SELECT DATABASE()) |
4 | Извлечение текущего пользователя БД (SELECT CURRENT_USER()) |
5 | Извлечение префикса таблиц WordPress |
6 | Дамп таблицы wp_users (ID, логин, хеш пароля) |
7 | Выполнение пользовательского SQL-запроса |
8 | Выполнение всех отпечатков (опции 2-5) по порядку |
| Режим | Запросов на запрос к БД | Скорость | Когда используется |
|---|
| UNION | 1 | Мгновенно | Нет объектного кеша, количество колонок совпадает |
| Boolean (8 потоков) | ~7 × длина_строки / 8 | Быстро | UNION заблокирован, есть строки |
| Time-based | ~7 × sleep × длина_строки | Медленно | Нет строк для boolean-оракула |
| Извлечение | Символов | Запросов | Время |
|---|
| Версия MySQL | ~20 | ~140 | ~15с |
| Имя базы данных | ~15 | ~105 | ~12с |
| Пользователь БД | ~25 | ~175 | ~20с |
| Префикс таблиц | ~5 | ~35 | ~5с |
| Строка wp_users (200 символов) | 200 | ~1400 | ~2 мин |