XSS (Cross-Site Scripting, межсайтовый скриптинг) — это одна из наиболее распространенных и опасных уязвимостей в веб-приложениях. Ее суть заключается в том, что злоумышленник может внедрить вредоносный JavaScript-код на страницу сайта, который затем выполняется в браузере пользователя. Атака возможна из-за недостаточной фильтрации или экранирования пользовательского ввода, что позволяет взломщику обойти механизмы безопасности.
XSS-атаки представляют серьезную угрозу, поскольку могут привести к краже конфиденциальных данных, например, cookies, токенов сессии, подмене содержимого страницы, перенаправлению пользователей на фишинговые сайты и даже к компрометации учетных записей. В некоторых случаях XSS используется в сочетании с другими уязвимостями для получения полного контроля над веб-приложением или системой пользователя.
В этой статье мы разберем, как работает межсайтовый скриптинг, какими бывают атаки, как проверить сайт на наличие уязвимости, а также рассмотрим эффективные способы защиты. Понимание механизмов XSS критически важно как для разработчиков, так и для специалистов по информационной безопасности, чтобы предотвращать подобные угрозы на этапе создания и тестирования веб-приложений.

В зависимости от способа внедрения и механизма выполнения вредоносного скрипта XSS-атаки делятся на три основных типа:
Суть уязвимости:
Вредоносный скрипт "отражается" от сервера в ответ на пользовательский запрос, например, через параметры URL, формы поиска или HTTP-заголовки. Код не сохраняется на сервере, а выполняется только при открытии специально сформированной жертвой ссылки.
Методика атаки:
Злоумышленник создает URL с вредоносным JavaScript-кодом. Жертве отправляется фишинговая ссылка через email, мессенджер или соцсети. При переходе по ссылке сервер возвращает страницу с внедренным скриптом, который выполняется в браузере жертвы. Важно, что сам сервер не сохраняет этот вредоносный код, он существует только в момент обработки конкретного запроса.
Пример эксплуатации:
Кража cookies аутентификации.
Перенаправление на фишинговый сайт.
Подмена содержимого страницы для социальной инженерии.
Суть уязвимости:
Вредоносный скрипт сохраняется на сервере, например, в базе данных, комментариях, профилях пользователей и выполняется каждый раз, когда жертва загружает зараженную страницу. Это самый опасный тип XSS, так как он может поражать множество пользователей без прямой атаки на каждого.
Методика атаки:
Атакующий отправляет вредоносный код через уязвимую форму, например, комментарий в блоге. Сервер сохраняет этот код, и он отображается другим пользователям. Когда жертва заходит на страницу, скрипт выполняется в ее браузере.
Пример эксплуатации:
Массовая кража сессий пользователей.
Распространение вредоносного ПО через зараженные страницы.
Дефейс — изменение содержимого сайта.
Суть уязвимости:
Уязвимость возникает из-за небезопасного взаимодействия JavaScript с DOM (Document Object Model). В отличие от хранимых и отраженных XSS атака происходит полностью на стороне клиента без отправки вредоносного кода на сервер.
Методика атаки:
Злоумышленник формирует URL, который изменяет DOM через уязвимый JavaScript. Жертва переходит по ссылке, и клиентский скрипт некорректно обрабатывает фрагмент (#) URL, что приводит к выполнению кода.
Пример эксплуатации:
Кража данных из локального хранилища.
Подмена интерфейса для фишинга паролей.
Обход CSRF-защиты.
XSS-уязвимости представляют серьезную киберугрозу для компаний любого масштаба. Внедрение произвольного JavaScript-кода через уязвимые веб-приложения может привести к следующим последствиям:
Для выявления уязвимостей XSS используются ручные и автоматизированные методы.
Как искать XSS вручную?
Проверяем все поля, куда сайт принимает текст от пользователя:
Вместо обычного текста вставляем код и смотрим, выполняется ли он.
Примеры:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
'"><svg/onload=alert(1)>
Если появляется всплывающее окно с цифрой 1 — уязвимость есть!
Отраженные XSS
Код вставляется в URL и сразу срабатывает.
Пример:
http://site.com/search?q=<script>alert(1)</script>
Если после перехода по ссылке появляется alert — уязвимость есть.
Хранимые XSS
Код сохраняется на сервере, например, в комментариях и срабатывает у всех, кто заходит на страницу.
Пример:
Пишем комментарий: <img src=x onerror=alert(1)>
Обновляем страницу или заходим с другого браузера — если alert появляется, значит, XSS есть.
XSS на основе DOM
Уязвимость спрятана в JavaScript сайта.
Проверяем:
Открываем DevTools (F12) → Console
Вводим document.write('<script>alert(1)</script>')
Если выполнилось — возможна DOM-уязвимость.
Сайт может фильтровать <script>, но пропускать другие теги. Пробуем:
<svg onload=alert(1)>
<body onload=alert(1)>
<a href="javascript:alert(1)">Click</a>
Или кодируем символы:
<img src=x onerror="alert(1)">
Автоматические сервисы и инструменты для проверки:
OWASP ZAP: бесплатный инструмент с возможностью сканирования на XSS и другие уязвимости.
Burp Suite: профессиональный инструмент для тестирования безопасности, включая автоматическое сканирование.
Acunetix: коммерческий сканер с детекцией сложных XSS.
XSStrike: специализированный инструмент для XSS с обходом фильтров.
Важно: Автоматические инструменты экономят время, но могут пропускать специфичные уязвимости. Комбинация ручного тестирования и автоматизации обеспечивает максимальную защиту.
Для защиты важно сочетать технические меры, выбор надежной инфраструктуры и соблюдение стандартов безопасности.
Экранирование данных
// Пример для PHP
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
Content Security Policy (CSP)
Content-Security-Policy: script-src 'self'; style-src 'self' 'unsafe-inline';
HTTP-заголовки безопасности
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000
Надежный хостинг для бизнеса — основа безопасности:
Пентесты — имитация атак для поиска уязвимостей.
Сканирование инструментами: