XSS
XSS (от англ. Cross-Site Scripting — межсайтовый скриптинг) — это тип уязвимости веб-приложений, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (обычно на языке JavaScript), который выполняется на компьютере пользователя при открытии этой страницы в браузере. XSS-атаки позволяют злоумышленнику обойти политику одинакового происхождения (Same-Origin Policy) и получить доступ к данным, хранящимся в контексте другого веб-сайта, включая сессионные куки, токены аутентификации и личную информацию пользователя.
Классификация
По способу взаимодействия с сервером и характеру хранения внедрённого кода выделяют три основных типа XSS-уязвимостей:
Отражённый XSS (Reflected XSS)
Вредоносный код передаётся в составе HTTP-запроса (например, в строке запроса URL, в теле POST-запроса) и сразу же возвращается сервером в ответе без сохранения. Для атаки необходимо, чтобы жертва перешла по специально сформированной ссылке или отправила запрос, содержащий скрипт. Отражённые XSS часто используются в фишинговых схемах и распространяются через ссылки в электронных письмах или на сторонних сайтах.
Хранимый XSS (Stored XSS)
Вредоносный код постоянно сохраняется на сервере (в базе данных, файловой системе, кеше) и затем отображается всем пользователям, запрашивающим соответствующую страницу. Наиболее опасный тип XSS, так как не требует дополнительных действий от жертвы после первоначального внедрения. Типичные векторы — комментарии, сообщения форумов, поля профиля, метаданные файлов.
DOM-based XSS (DOM-ориентированный XSS)
Уязвимость возникает на стороне клиента из-за некорректной обработки данных в JavaScript-коде, который динамически изменяет DOM-дерево документа. Вредоносный код не передаётся на сервер и не возвращается в исходном HTML-ответе; атака происходит полностью в браузере пользователя при выполнении скриптов, считывающих данные из URL, document.referrer, localStorage или других источников, доступных через JavaScript.
Механизм атаки
Общий принцип XSS-атаки заключается в том, что злоумышленник находит на веб-странице точку ввода данных, которая не проверяется или недостаточно санитизируется перед выводом. Внедрённый код выполняется в контексте безопасности целевого сайта, что даёт атакующему возможность:
- перехватывать сессионные куки и подделывать запросы от имени пользователя;
- перенаправлять пользователя на фишинговые страницы;
- изменять содержимое страницы (дефейс);
- выполнять произвольные действия от имени аутентифицированного пользователя (например, отправлять сообщения, совершать транзакции);
- устанавливать кейлоггеры для перехвата нажатий клавиш.
История
Первые упоминания о межсайтовом скриптинге относятся к середине 1990-х годов. В 1996 году в списке рассылки Bugtraq была опубликована информация о возможности внедрения скриптов в теги <IMG> на сайтах, использующих Microsoft Internet Explorer. Термин «Cross-Site Scripting» был введён в 2000 году исследователями Microsoft для описания атаки, при которой вредоносный код внедряется с одного сайта на другой.
В 2005 году уязвимость хранимого XSS была обнаружена в популярной социальной сети MySpace. Злоумышленник Сэмми Камкар (Sammy Kamkar) создал «червя» на JavaScript, который автоматически добавлял его в друзья к тысячам пользователей, распространяясь через профили. Эта атака продемонстрировала масштабный потенциал XSS-уязвимостей.
По данным отчётов OWASP (Open Web Application Security Project), XSS стабильно входит в десятку наиболее критичных веб-уязвимостей. В 2024 году OWASP классифицирует XSS как уязвимость категории A03 (Injection).
Методы защиты
Санитизация и экранирование вывода
Основной метод предотвращения XSS — корректное экранирование (escaping) всех данных, вставляемых в HTML-контекст. В зависимости от контекста (HTML-теги, атрибуты, JavaScript, CSS, URL) применяются различные правила экранирования символов <, >, ", ', &. Современные шаблонизаторы (например, Twig, Jinja2, React JSX) автоматически экранируют вывод по умолчанию.
Content Security Policy (CSP)
HTTP-заголовок Content-Security-Policy позволяет ограничить источники, из которых браузер может загружать и выполнять скрипты. Правильно настроенный CSP может полностью заблокировать выполнение инлайн-скриптов и ограничить загрузку скриптов только доверенными доменами, что существенно снижает риск XSS даже при наличии уязвимости.
Валидация ввода
Серверная проверка входных данных на соответствие ожидаемому формату (например, только буквы и цифры для имени пользователя) уменьшает количество потенциальных векторов внедрения. Однако валидация не должна быть единственным средством защиты, так как некоторые типы XSS (DOM-based) могут обходить серверную проверку.
HttpOnly и Secure флаги для кук
Установка флага HttpOnly для сессионных кук предотвращает доступ к ним через JavaScript, что затрудняет кражу сессий при XSS-атаке. Флаг Secure ограничивает передачу кук только по защищённому соединению HTTPS.
Регулярные обновления и аудит
Использование актуальных версий веб-фреймворков, библиотек и плагинов, а также регулярное проведение автоматического и ручного тестирования на проникновение (пентестов) позволяет выявлять и устранять XSS-уязвимости на ранних этапах.
Примеры уязвимых конструкций
Наиболее частые места возникновения XSS:
- отображение пользовательского ввода без экранирования:
echo $_GET['name'];(PHP); - использование
innerHTMLилиdocument.write()с непроверенными данными из URL:document.getElementById('msg').innerHTML = location.hash;; - некорректное использование
eval()илиsetTimeout()со строковым аргументом, содержащим пользовательские данные; - динамическое формирование URL для скриптов:
<script src="<?= $userInput ?>">.
Интересные факты
- В 2014 году в браузере Internet Explorer 11 была обнаружена уязвимость, позволяющая выполнять XSS через протокол
mailto:. - Некоторые XSS-атаки могут быть выполнены без использования JavaScript — через внедрение CSS-кода, который извлекает данные через селекторы и фоновые изображения (CSS Injection).
- Существуют автоматизированные инструменты для поиска XSS, такие как Burp Suite, OWASP ZAP, Acunetix, а также специализированные сканеры (XSStrike, BeEF).
Источники
- OWASP Top 10 – 2021 (A03: Injection)
- «The Web Application Hacker's Handbook» by Dafydd Stuttard and Marcus Pinto
- «Cross-Site Scripting: Attack and Defense» by Seth Fogie, Jeremiah Grossman, Robert Hansen, Anton Rager
- CWE-79: Improper Neutralization of Input During Web Page Generation
- RFC 2616: Hypertext Transfer Protocol — HTTP/1.1
- Материалы Positive Technologies и Cisco Talos по веб-безопасности
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →