Открыть сервис

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:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →