
Этот репозиторий содержит практический исследовательский и проверочный набор для CVE-2025-4396, неаутентифицированной слепой SQL-инъекции на основе времени, затрагивающей плагин WordPress Relevanssi через параметр `cats`.
Этот репозиторий содержит практическое исследование и набор инструментов для проверки CVE-2025-4396 — неаутентифицированной Time-Based Blind SQL-инъекции, затрагивающей плагин WordPress Relevanssi через параметр cats.
Проект был создан для авторизованных Purple Team-задач с целью:
Репозиторий включает:
Отказ от ответственности
Данный проект предоставляется только для образовательных целей, защитной проверки и авторизованного тестирования безопасности.
Не используйте его против систем, которые вам не принадлежат или на проверку которых у вас нет явного письменного разрешения.
CVE-2025-4396 — это уязвимость SQL-инъекции, затрагивающая функциональность поиска Relevanssi в WordPress.
В протестированном сценарии проблема достигается через рабочий процесс поиска и, в частности, через параметр cats. Уязвимый участок кода позволяет вводимым данным, контролируемым атакующим, влиять на SQL-запрос, генерируемый плагином.
Поскольку уязвимая конечная точка доступна без предварительной аутентификации, удалённый злоумышленник может использовать эту ошибку для выполнения неаутентифицированной SQL-инъекции.
Практические последствия включают:
Уязвимость существует потому, что вводимые пользователем данные из параметра, связанного с поиском, не обрабатываются безопасно перед включением в SQL-запрос.
На практике это означает, что атакующий может внедрить SQL-выражения в логику backend-запроса и заставить базу данных выполнить дополнительные условия.
Уязвимость эксплуатируется в слепом режиме, то есть приложение не отображает напрямую ошибки SQL или необработанные результаты базы данных.
Вместо чтения вывода запроса со страницы атакующий задаёт базе данных серию вопросов «истина/ложь» и наблюдает за одним побочным эффектом:
Эксплуатация основана на SQL-функциях, таких как SLEEP(), чтобы создать измеримую разницу во времени ответа сервера.
Это позволяет атакующему извлечь данные, не видя их напрямую.
Например, атакующий может задать такие вопросы:
a?»Повторяя этот процесс, атакующий может восстановить полный хеш посимвольно.
Стандартный подход перебирает известный набор символов и проверяет каждого кандидата по одному.
Для каждой позиции в целевом хеше:
Этот метод прост и надёжен, но относительно медленен, поскольку может потребовать много запросов на символ.
Более быстрый подход использует бинарный поиск по ASCII-значению каждого символа.
Вместо вопросов:
a?»b?»c?»задаются вопросы:
Это делит пространство поиска пополам на каждом запросе и значительно сокращает количество HTTP-запросов.
Атака позволяет оператору извлечь значение user_pass из таблицы wp_users, обычно для выбранного ID пользователя WordPress, такого как:
1 для администратора по умолчанию,В последних версиях WordPress это значение может использовать новый конвейер паролей WordPress 6.8+, который объединяет:
CVE_2025_4396.pyЭто стандартный скрипт извлечения.
Он выполняет классическую Time-Based Blind SQL-инъекцию и извлекает целевой хеш посимвольно, используя линейный поиск по фиксированному набору символов.
Для каждой позиции символа:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Аргументы:
-t, --target : URL уязвимой цели, включая инжектируемый параметр
-u, --userid : ID пользователя WordPress для атаки
-s, --sleep : порог задержки в секундах
-v, --verbose : включить отладочный вывод
CVE_2025_4396_Stealth.pyЭто версия с бинарным поиском.
Она выполняет ту же задачу извлечения, что и стандартный скрипт, но заменяет линейный посимвольный поиск бинарным поиском по ASCII-значениям.
Для каждой позиции:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
После извлечения хеша пароля из WordPress следующим шагом является его офлайн-взлом.
Примечания по хешированию WordPress 6.8+. В протестированном рабочем процессе извлечённое значение может выглядеть так:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Для Hashcat используемая часть bcrypt:
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Однако этот bcrypt применяется не напрямую к сырому паролю. WordPress сначала применяет этап предварительной обработки: