6. Продвинутые техники: HPP и DIOS
Продвинутые техники обхода WAF: HPP и DIOS
Даже если приложение защищено коммерческим Web Application Firewall (WAF), существуют продвинутые классы атак, позволяющие обойти фильтры и извлечь данные. В этом уроке мы разберём две такие техники: HTTP Parameter Pollution (HPP) и DIOS (Dump In One Shot).
1. HTTP Parameter Pollution (HPP)
HTTP Parameter Pollution (загрязнение параметров HTTP) — это техника обхода WAF, основанная на том, как разные веб-серверы и фреймворки обрабатывают запросы с дублирующимися параметрами.
Представьте URL: ?id=1&id=2. Какой id получит приложение?
- В Go (net/http):
r.URL.Query()["id"]вернёт срез["1", "2"]. Если использоватьr.URL.Query().Get("id"), вернётся первое значение ("1"). - В PHP/Apache: вернётся последнее значение (
"2"). - В ASP.NET/IIS: значения склеиваются через запятую (
"1,2").
Как HPP обходит WAF
Многие WAF анализируют только первое вхождение параметра или применяют фильтры к каждому вхождению отдельно, не ожидая их конкатенации. Если бэкенд на ASP.NET склеивает параметры, атакующий может "разорвать" SQL-инъекцию:
?q=SELECT /*&q=*/name&q=password/*&q=*/FROM/*&q=*/users
WAF видит разрозненные куски: SELECT /*, */name, password/* и пропускает их. Но IIS соберёт их в единую строку:
SELECT /*,*/name,password/*,*/FROM/*,*/users
В результате SQL-комментарии /*,*/ скрывают запятые, и СУБД успешно выполняет запрос SELECT name,password FROM users.
В экосистеме Go (например, при использовании gin или fiber) поведение получения параметров нужно всегда контролировать. Если Go стоит за reverse-proxy (например, Nginx), а Nginx настроен на фильтрацию первого параметра, а Go берет последний (или наоборот, если Go вручную обрабатывает слайс), возникает окно уязвимости.
2. DIOS (Dump In One Shot)
В классической UNION-инъекции, чтобы выгрузить все имена таблиц, атакующему нужно использовать LIMIT и перебирать строки одну за другой, либо использовать GROUP_CONCAT с риском упереться в лимит длины ответа (например, group_concat_max_len в MySQL).
DIOS (Dump In One Shot) — это метод, позволяющий выгрузить структуру БД (или огромный массив данных) в рамках одного запроса и одного возвращаемого поля в браузере, обходя ограничения на группировку.
Механика DIOS
Техника основана на использовании подзапросов, переменных (в MySQL) и конкатенации на лету. Пример пейлоада для DIOS, возвращающего сразу все таблицы:
(SELECT (@a) FROM (SELECT(@a:=0x00),(SELECT (@a) FROM (information_schema.columns) WHERE (@a) in (@a:=CONCAT(@a,'<br>','<font color=red>',table_name,'</font>'))))a)
Как это работает:
(@a:=0x00)— инициализируется переменная@a.- Вложенный
SELECTобходит таблицуinformation_schema.columns. - Оператор
IN(или функции сравнения) используется для того, чтобы на каждой итерации цикла по строкам переопределять@a, склеивая её текущее значение с новымtable_name. - В итоге
@aсобирает в себе огромную HTML-строку со всеми таблицами (используя<br>для переносов), которая выводится одним гигантским текстовым блобом.
Защита
HPP и DIOS — это техники эксплуатации на уровне сети и сложного SQL-синтаксиса. Защита от них в Go-приложениях сводится к главному правилу: Prepared Statements (параметризация). Если вы используете database/sql с ? или $1 (или безопасные методы ORM), то даже успешно проскользнувший сквозь WAF пейлоад DIOS останется для базы лишь строковым литералом, и инъекция не состоится.
Продолжить чтение
Что бы прочитать модуль полностью, зарегистрируйтесь/войдите на платформу
Когда закончишь — отметь раздел, чтобы продолжить.