Отражённый XSS
Отражённый XSS (англ. Reflected Cross-Site Scripting) — это тип уязвимости веб-приложений, относящийся к классу межсайтового скриптинга (XSS), при котором вредоносный код внедряется в HTTP-запрос и немедленно отображается в ответе сервера без сохранения на постоянном носителе (базе данных, файловой системе). В отличие от хранимого XSS (Stored XSS), отражённая атака не требует записи скрипта на сервер; злоумышленник передаёт жертве специально сформированную ссылку или иной вектор, содержащий вредоносный код, который исполняется в браузере жертвы при обработке ответа от сервера.
Механизм работы
Отражённый XSS возникает, когда веб-приложение принимает данные из HTTP-запроса (например, из параметров URL, заголовков, тела POST-запроса) и включает их в генерируемый HTML-ответ без надлежащей санитизации или экранирования. Сервер не проверяет, не содержит ли введённое пользователем значение исполняемого кода, и возвращает его как часть веб-страницы. Браузер жертвы, получив такой ответ, интерпретирует внедрённый код как часть разметки и выполняет его.
Типичная последовательность атаки
- Подготовка вектора атаки. Злоумышленник находит уязвимый параметр в веб-приложении (например, поле поиска, которое отображает введённый запрос на странице результатов). Он создаёт URL, содержащий вредоносный скрипт в значении этого параметра, например:
https://example.com/search?q=<script>alert('XSS')</script>`. - Доставка ссылки жертве. Злоумышленник передаёт сформированную ссылку потенциальной жертве через фишинговое письмо, сообщение в мессенджере, социальную сеть или иной канал. Часто ссылка маскируется с помощью сервисов сокращения URL или HTML-кода.
- Переход жертвы по ссылке. Жертва, перейдя по ссылке, отправляет HTTP-запрос к уязвимому серверу. В запросе присутствует вредоносный код.
- Генерация ответа сервером. Сервер принимает запрос, извлекает значение параметра
qи вставляет его в HTML-шаблон страницы результатов поиска без экранирования. В результате сервер возвращает HTML-документ, содержащий<script>alert('XSS')</script>. - Исполнение скрипта в браузере. Браузер жертвы загружает полученную страницу, парсит HTML и выполняет внедрённый скрипт. В простейшем случае это приводит к показу всплывающего окна, но в реальных атаках скрипт может выполнять более опасные действия: красть куки (cookies), перенаправлять на фишинговые сайты, изменять содержимое страницы, перехватывать нажатия клавиш или выполнять запросы от имени жертвы.
Отличие от других типов XSS
Хранимый XSS (Stored XSS)
При хранимом XSS вредоносный код сохраняется на сервере (например, в базе данных, в комментариях, профилях пользователей) и отображается всем посетителям страницы, загружающей эти данные. Отражённый XSS не требует сохранения — код существует только в рамках одного запроса и ответа.
DOM-based XSS
DOM-based XSS (также известный как тип-0) не требует участия сервера в генерации ответа. Вредоносный код внедряется в DOM-дерево на стороне клиента через JavaScript-код, который обрабатывает данные из URL или других источников без серверной обработки. Отражённый XSS, напротив, всегда проходит через сервер: сервер принимает данные, встраивает их в ответ и отправляет браузеру.
Векторы атаки
Отражённый XSS может быть реализован через различные входные точки веб-приложения:
- Параметры URL (GET-запросы). Наиболее распространённый вектор. Пример:
?search=...,?error=...,?page=.... - Параметры POST-запроса. Хотя POST-запросы не видны в адресной строке, злоумышленник может создать HTML-форму, которая автоматически отправляет данные на уязвимый сервер при загрузке страницы жертвой.
- HTTP-заголовки. Некоторые приложения отображают значения заголовков (например,
Referer,User-Agent) на странице ошибок или в логах. Если эти заголовки не экранируются, они могут стать вектором атаки. - Путь URL (path-based). В редких случаях сервер может включать часть пути запроса в ответ без экранирования.
Примеры уязвимых конструкций
PHP
``php <?php $search = $_GET['search']; echo "Вы искали: " . $search; ?> ` Если пользователь передаст ?search=<script>alert('XSS')</script>`, сервер вернёт строку с исполняемым скриптом.
ASP.NET
``csharp string name = Request.QueryString["name"]; Response.Write("Привет, " + name); `` Аналогичная уязвимость.
JavaScript (на стороне сервера, Node.js)
``javascript app.get('/search', (req, res) => { res.send(Вы искали: ${req.query.q}); }); ` Без экранирования req.query.q` уязвимость присутствует.
Последствия эксплуатации
Успешная атака с использованием отражённого XSS может привести к:
- Краже сессионных данных. Скрипт может прочитать куки (cookies) жертвы и отправить их на сервер злоумышленника. Это позволяет угнать сессию и получить доступ к аккаунту жертвы.
- Фишинг. Злоумышленник может изменить содержимое страницы, чтобы подменить форму входа или отобразить поддельное уведомление, собирающее учётные данные.
- Перенаправление на вредоносные сайты. Скрипт может изменить
window.locationи перенаправить жертву на сайт, распространяющий вредоносное ПО. - Выполнение действий от имени жертвы. Используя XMLHttpRequest или Fetch API, скрипт может отправлять запросы от имени жертвы, например, для изменения настроек аккаунта, совершения покупок или публикации контента.
- Дефейс (defacement). Внедрение скрипта может изменить внешний вид страницы, разместив оскорбительные или пропагандистские сообщения.
Методы защиты
Экранирование вывода (Output Encoding)
Основной метод защиты — экранирование всех данных, полученных от пользователя, перед их включением в HTML-ответ. В зависимости от контекста (HTML-тело, атрибут, JavaScript, CSS) применяются различные схемы экранирования:
- Для HTML-тела: замена символов
<,>,&,",'на HTML-сущности (<,>,&,",'). - Для атрибутов: дополнительное экранирование кавычек и пробелов.
- Для JavaScript: экранирование обратной косой черты и управляющих символов.
Валидация входных данных (Input Validation)
Хотя экранирование вывода является приоритетным, валидация входных данных может служить дополнительным барьером. Рекомендуется:
- Использовать белые списки (whitelist) разрешённых символов.
- Отклонять или преобразовывать данные, содержащие подозрительные конструкции (например, теги
<script>). - Для числовых полей проверять, что введено именно число.
Использование Content Security Policy (CSP)
CSP — это HTTP-заголовок, который позволяет веб-приложению указать браузеру, какие источники скриптов, стилей и других ресурсов разрешены. Например, заголовок Content-Security-Policy: script-src 'self' запрещает выполнение любых инлайн-скриптов, включая те, что внедрены через XSS. CSP является мощным защитным механизмом, но не заменяет экранирование.
HttpOnly и Secure флаги для кук
Установка флага HttpOnly для кук предотвращает доступ к ним из JavaScript, что снижает риск кражи сессионных данных даже при успешной XSS-атаке. Флаг Secure гарантирует передачу кук только по HTTPS.
Использование современных фреймворков
Современные веб-фреймворки (например, React, Angular, Vue.js, ASP.NET Core, Django) по умолчанию экранируют вывод данных, если разработчик использует шаблонизаторы правильно. Однако ручное встраивание HTML через dangerouslySetInnerHTML (React) или v-html (Vue) может обойти защиту.
Примеры в истории
Отражённый XSS является одной из самых распространённых уязвимостей в веб-приложениях. Согласно отчётам OWASP, XSS входит в топ-10 уязвимостей веб-безопасности. В 2020-х годах отражённый XSS регулярно обнаруживался в крупных сервисах, включая социальные сети, почтовые системы и интернет-магазины. Например, в 2021 году исследователи выявили отражённый XSS в поисковой системе одного из крупных российских интернет-порталов, что позволяло злоумышленникам воровать куки пользователей.
Интересные факты
- Отражённый XSS часто называют «непостоянным» (non-persistent) или «тип-1» XSS, в отличие от хранимого (тип-2) и DOM-based (тип-0).
- Для успешной атаки злоумышленнику необходимо, чтобы жертва перешла по специально сформированной ссылке. Это делает атаку менее автоматической, чем хранимый XSS, но не менее опасной при использовании методов социальной инженерии.
- В некоторых случаях отражённый XSS может быть использован для обхода защиты CSRF (Cross-Site Request Forgery), так как скрипт выполняется в контексте доверенного сайта.
Источники
- OWASP Top 10 — 2021: A03 Injection (Cross-Site Scripting)
- OWASP XSS Prevention Cheat Sheet
- PortSwigger Web Security Academy: Cross-Site Scripting
- «The Web Application Hacker’s Handbook» by Dafydd Stuttard and Marcus Pinto
- CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →