В этой статье я расскажу о критическом риске веб-безопасности, известном как межсайтовый скриптинг, о признаках, типах и способах предотвращения XSS-атак.
Что такое межсайтовый скриптинг?
**Cross-Site Scripting** — это тип инъекционной атаки, которая позволяет злоумышленнику внедрить вредоносный код на стороне клиента (выполняемый жертвой), что приводит к выдаче себя за пользователя для получения привилегированного доступа к веб-приложению, выполнению атак подделки межсайтовых запросов к другим уязвимым веб-сайтам, перенаправлению жертв на сайт злоумышленников, загрузке вредоносных файлов и т.д. XSS может быть соединен с другими уязвимостями для получения полного доступа к целевой системе.
Доказательство концепции (PoC)
XSS просто добавляет произвольный html и javascript код в ответ, если разработчики не санируют пользовательский ввод должным образом и не кодируют html символы в ответе. Вы можете начать с внедрения некоторых невинных HTML-символов, таких как <u>,** <br>, <p>. А затем использовать функцию javascript внутри HTML-тегов для подтверждения XSS-бага. **alert() ** использовался в качестве доказательства наличия XSS ошибки в течение десятилетий, но теперь его заменили **print(), alert(document.domain) и alert(window.origin).
Тип уязвимости межсайтового скриптинга
-
Отраженный XSS — когда полезная нагрузка XSS в запросе немедленно отражается в ответе. Она не сохраняется на сервере. Пример — Допустим, ссылка на запрос отправляется жертве фишингом или встраивается в любой другой сайт.
// REQUEST URL https://website.com/profile.php?show=<script>print()</script> // RESPONSE <script>print()</script>
-
Хранимый XSS — когда полезная нагрузка XSS сохраняется на сервере и выполняется для каждого другого пользователя, заходящего на уязвимую веб-страницу. Код постоянно сохраняется в базе данных сайта и может быть использован для создания червя. Пример — Жертва использует веб-сайт и получает вредоносный код.
<p><script>print()</script></p>
-
XSS на основе DOM — когда ошибка обнаруживается в исходном коде уязвимой веб-страницы и прикрепленных к ней файлах. Объектная модель документа — это соглашение, используемое для представления и работы с объектами в документе HTML, а также в других типах документов.
<script> var pos=document.URL.indexOf("context=")+8; document.write(document.URL.substring(pos,document.URL.length)); </script>
Как предотвратить XSS-атаки? 🛡️
Межсайтовый скриптинг входит в список 10 лучших угроз безопасности OWASP с 2010 года, поэтому разработчикам важно писать безопасный код и предотвращать XSS-атаки. Поскольку XSS — это инъекционная уязвимость, ключ к предотвращению этих атак — никогда не доверять вводимым пользователем данным. Также непрактичным ответом будет никогда не позволять пользователю вводить данные на веб-страницу.
Методы предотвращения XSS 📃
- Используйте брандмауэр веб-приложений
- Брандмауэр немедленно блокирует определенные вредоносные полезные нагрузки и теги в HTTP-запросах.
- В некоторых случаях брандмауэр можно обойти, но это может стать очень неприятным для злоумышленника.
- DevSecOps
- Snyk.io
- Находите и автоматически устраняйте уязвимости в вашем коде, зависимостях с открытым исходным кодом, контейнерах и инфраструктуре как код.
- Используйте расширения snyk для вашей IDE.
- Сканируйте уязвимые контейнеры docker.
- Snyk.io
- Проверяйте и обеззараживайте данные, предоставленные пользователем
- Пользовательские данные должны проверяться на передней стороне сайтов на корректность (например, имя пользователя, электронная почта, домен и форматирование номера телефона), но они также всегда должны проверяться и санироваться на задней стороне для обеспечения безопасности.
- В зависимости от приложения, вы можете составить «белый список» буквенно-цифровых символов и «черный список» всех остальных символов. Однако это решение не является надежным.
- Кодирование HTML
- Каждый раз, когда вы вводите данные, предоставленные пользователем, в тело документа (например, с помощью атрибута innerHTML в JavaScript), вы должны HTML-кодировать эти данные.
- Примерами HTML-кодирования являются:
- & &
- < <
- > >
- » «
- ‘ ‘
- Используйте библиотеку кодирования безопасности
- Для многих языков и фреймворков существуют библиотеки кодирования безопасности, которые могут помочь предотвратить XSS.
- Используйте обновленные фреймворки.
- Используйте теги iframe
- Вы можете использовать тег iframe для предотвращения кражи cookies/сессий, привилегированного доступа.
- Платформа Google blogger использует теги iframe для отображения кода на разных поддоменах и предотвращения XSS на основном веб-приложении.
Подведение итогов
Основные выводы:
- XSS — это критическая инъекционная уязвимость, с помощью которой злоумышленник манипулирует ответом сервера и выполняет произвольный код javascript в браузере пользователя.
- Существует 3 типа XSS: отраженный, основанный на DOM и хранимый.
- XSS-атаки могут использоваться для загрузки вредоносных файлов, выполнения межсайтовых запросов, кражи аутентификационной информации, перехвата сеансов, кражи конфиденциальных данных и порчи веб-сайтов.
- Для предотвращения XSS необходимо санировать данные пользователя на бэкенде, кодировать в HTML данные, предоставляемые пользователем, которые отображаются в шаблоне, а также использовать библиотеку кодирования безопасности или WAF.
Похожие ссылки:
- OWASP top 10 — https://owasp.org/www-project-top-ten/
- Шпаргалка OWASP — https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
- Предотвращение портов — https://portswigger.net/web-security/cross-site-scripting/preventing
- Статья о проверке кода на наличие уязвимостей межсайтового скриптинга — https://wiki.owasp.org/index.php/Reviewing_Code_for_Cross-site_scripting
- Исследование портвейна — https://portswigger.net/research/alert-is-dead-long-live-print
Надеюсь, эта статья будет полезна для вас. Спасибо за прочтение.