Знакомство
По мере того, как веб-приложения становятся все более продвинутыми и более распространенными, становятся и уязвимости веб-приложений. Среди наиболее распространенных типов уязвимостей веб-приложений - уязвимости межсайтового скриптинга (XSS). Уязвимости XSS используют преимущества недостатка в дезинфекции пользовательского ввода, чтобы «записать» код JavaScript на страницу и выполнить его на стороне клиента, что приводит к нескольким типам атак.Что такое XSS
Типичное веб-приложение работает, получая HTML-код с сервера и отображая его в клиентском интернет-браузере. Когда уязвимое веб-приложение не очистраивает ввод данных пользователя должным образом, злоумышленникий пользователь может ввести дополнительный код JavaScript в поле ввода (например, комментарий/ответ), поэтому, как только другой пользователь просматривает ту же страницу, он неосознанно выполняет вредоносный код JavaScript.XSS vulnerabilities are solely executed on the client-side and hence do not directly affect the back-end server. They can only affect the user executing the vulnerability. The direct impact of XSS vulnerabilities on the back-end server may be relatively low, but they are very commonly found in web applications, so this equates to a medium risk (low impact + high probability = medium risk), which we should always attempt to reduce risk by detecting, remediating, and proactively preventing these types of vulnerabilities.
Атаки XSS
Уязвимости XSS могут облегчить широкий спектр атак, которые могут быть выполнены с помощью кода JavaScript браузера. Основным примером атаки XSS является то, что целевой пользователь невольно отправляет свой сеансовый файл cookie на веб-сервер злоумышленника. Другим примером является выполнение браузером цели API-вызовов, которые приводят к вредоносному действию, например, изменение пароля пользователя на пароль по выбору злоумышленника. Существует множество других типов атак XSS, от майнинга биткойнов до показа рекламы.Поскольку XSS-атаки выполняют код JavaScript в браузере, они ограничены JS-движком браузера (т.е. V8 в Chrome). Они не могут выполнять общесистемный код JavaScript, чтобы сделать что-то вроде выполнения кода на системном уровне. В современных браузерах они также ограничены одним и тем же доменом уязвимого веб-сайта. Тем не менее, возможность выполнения JavaScript в браузере пользователя все еще может привести к широкому спектру атак, как упоминалось выше. Кроме того, если опытный исследователь идентифицирует двоичную уязвимость в веб-браузере (например, переполнение кучи в Chrome), он может использовать уязвимость XSS для выполнения эксплойта JavaScript в браузере цели, который в конечном итоге выходит из песочницы браузера и выполняет код на машине пользователя.
Уязвимости XSS можно найти почти во всех современных веб-приложениях и активно эксплуатируются в течение последних двух десятилетий. Хорошо известным примером XSS является Samy Worm, который был браузерным червем, который использовал сохраненную уязвимость XSS на веб-сайте социальной сети MySpace еще в 2005 году. Он был выполнен при просмотре зараженной веб-страницы, разместив сообщение на странице жертвы в MySpace, в котором говорилось: "Сэми - мой герой". Само сообщение также содержало ту же полезную нагрузку JavaScript для повторной публикации того же сообщения при просмотре другими. В течение одного дня более миллиона пользователей MySpace разместили это сообщение на своих страницах. Несмотря на то, что эта конкретная полезная нагрузка не нанесла никакого фактического вреда, уязвимость могла быть использована для гораздо более гнусных целей, таких как кража информации о кредитных картах пользователей, установка регистраторов ключей в их браузерах или даже использование двоичной уязвимости в веб-браузерах пользователей (что было более распространено в веб-браузерах в то время).
В 2014 году исследователь безопасности случайно выявил уязвимость XSS в панели инструментов Twitter TweetDeck. Эта уязвимость была использована для создания саморетвита в Twitter, что привело к тому, что твит был ретвитнут более 38 000 раз менее чем за две минуты. В конце концов, это заставило Twitter временно закрыть TweetDeck, пока они исправляли уязвимость.
По сей день даже самые известные веб-приложения имеют уязвимости XSS, которые можно использовать. Даже страница поисковой системы Google имела несколько уязвимостей XSS в строке поиска, последняя из которых была в 2019 году, когда уязвимость XSS была обнаружена в библиотеке XML. Кроме того, сервер Apache, наиболее часто используемый веб-сервер в Интернете, однажды сообщил об уязвимости XSS, которая активно использовалась для кражи паролей пользователей определенных компаний. Все это говорит нам о том, что к уязвимостям XSS следует относиться серьезно, и следует приложить много усилий для их обнаружения и предотвращения.
Типы XSS
Существует три основных типа уязвимостей XSS:| тип | описание |
|---|---|
| Stored (Persistent) XSS | Наиболее важный тип XSS, который возникает, когда ввод пользователя хранится в бэкэнд-базе данных, а затем отображается при извлечении (например, сообщения или комментарии) |
| Reflected (Non-Persistent) XSS | Происходит, когда ввод пользователя отображается на странице после обработки сервером, но не сохраняется (например, результат поиска или сообщение об ошибке) |
| DOM-based XSS | Другой непостоянный тип XSS, который возникает, когда пользовательский ввод отображается непосредственно в браузере и полностью обрабатывается на стороне клиента, без достижения сервера (например, через HTTP-параметры на стороне клиента или теги якоря) |