Перейти к содержимому
Назад к пути
Теория 2 мин чтения

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)

Как это работает:

  1. (@a:=0x00) — инициализируется переменная @a.
  2. Вложенный SELECT обходит таблицу information_schema.columns.
  3. Оператор IN (или функции сравнения) используется для того, чтобы на каждой итерации цикла по строкам переопределять @a, склеивая её текущее значение с новым table_name.
  4. В итоге @a собирает в себе огромную HTML-строку со всеми таблицами (используя <br> для переносов), которая выводится одним гигантским текстовым блобом.

Защита

HPP и DIOS — это техники эксплуатации на уровне сети и сложного SQL-синтаксиса. Защита от них в Go-приложениях сводится к главному правилу: Prepared Statements (параметризация). Если вы используете database/sql с ? или $1 (или безопасные методы ORM), то даже успешно проскользнувший сквозь WAF пейлоад DIOS останется для базы лишь строковым литералом, и инъекция не состоится.

Продолжить чтение

Что бы прочитать модуль полностью, зарегистрируйтесь/войдите на платформу

Когда закончишь — отметь раздел, чтобы продолжить.

🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru