
Этот репозиторий содержит практический исследовательский и проверочный набор для 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 сначала применяет этап предварительной обработки:
Это означает, что обычный словарь не может быть напрямую передан в Hashcat, если вы хотите воспроизвести точную логику WordPress 6.8+.
Вместо этого каждый пароль-кандидат должен быть сначала преобразован в его представление, совместимое с предварительным хешированием WordPress.
Репозиторий также включает «вспомогательный» скрипт, который:
$wp$ при необходимости,Извлечь хеш:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.Подготовить среду для взлома:
python3hashcat доступен в PATHЗапустить Auto_Crack.py:
python3 Auto_Crack.py -H '\$wp\$2y\$10\$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.' -w /usr/share/wordlists/rockyou.txt
Необходимо экранировать "$" с помощью "\" — совместимость с bash
Следующее содержимое для обнаружения может использоваться командами SOC для выявления попыток эксплуатации и измерения зрелости защиты.
title: Potential Time-Based Blind SQLi (CVE-2025-4396 Relevanssi)
id: 5a8a1c93-5c74-4b5b-a620-8e1c3e41ab5d
status: experimental
description: Detects HTTP GET requests containing typical Time-Based Blind SQL injection payloads often used to exploit CVE-2025-4396 in the WordPress Relevanssi plugin (bypassing comma filters).
author: n3fhara
date: 2026-03-18
tags:
- attack.initial_access
- attack.t1190
- cve.2025-4396
logsource:
category: webserver
detection:
selection_endpoint:
cs-uri-query|contains:
- 's='
- 'cats='
- 'tags='
selection_payload:
cs-uri-query|contains:
- 'SLEEP('
- 'WAITFOR'
- 'SUBSTRING('
- 'ASCII('
- 'LENGTH('
selection_bypass_indicators:
cs-uri-query|contains:
- 'FROM'
- 'FOR 1'
- '*('
condition: selection_endpoint and selection_payload and selection_bypass_indicators
falsepositives:
- Highly unlikely. Legitimate search queries should not contain SQL functions.
level: high
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"ET EXPLOIT WordPress Relevanssi SQLi Attempt (CVE-2025-4396)"; flow:established,to_server; content:"GET"; http_method; content:"cats="; http_uri; pcre:"/(cats|tags)=.*(SLEEP|WAITFOR)%28.*(%2A|\*).*SUBSTRING/i"; classtype:web-application-attack; sid:1000001; rev:1; metadata:created_at 2026_03_18, cve CVE_2025_4396;)
index=web_logs sourcetype=access_combined
| regex uri_query="(?i)cats=|tags="
| stats count as request_count, avg(response_time) as avg_time, max(response_time) as max_time, dc(uri_query) as unique_payloads by clientip
| where request_count > 20 AND max_time > 2000
| sort - max_time
url.query : (*cats=* OR *tags=* OR *s=*) AND url.query : (*SLEEP* OR *WAITFOR* OR *SUBSTRING* OR *ASCII*) AND url.query : (*FROM* OR *FOR* OR *%2A*)
sequence by source.ip with maxspan=1m
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
Базовые сигнатуры, указанные выше, хороши для необфусцированной эксплуатации, но становятся слабее, когда оператор внедряет более продвинутые техники.
Видимость SOC ухудшается, когда атакующий начинает использовать:
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
Используйте только в средах, где у вас есть явное разрешение на тестирование. Авторы и участники не несут ответственности за неправомерное использование.
Отказ от ответственности
Данный проект предоставляется только для образовательных целей, защитной проверки и авторизованного тестирования безопасности.
Не используйте его против систем, которые вам не принадлежат или на проверку которых у вас нет явного письменного разрешения.