Что такое уязвимость Cross-Site Scripting? Как ее обнаружить? Как предотвратить XSS-атаку?

В этой статье я расскажу о критическом риске веб-безопасности, известном как межсайтовый скриптинг, о признаках, типах и способах предотвращения 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).

Тип уязвимости межсайтового скриптинга

  1. Отраженный XSS — когда полезная нагрузка XSS в запросе немедленно отражается в ответе. Она не сохраняется на сервере. Пример — Допустим, ссылка на запрос отправляется жертве фишингом или встраивается в любой другой сайт.

    // REQUEST URL
    https://website.com/profile.php?show=<script>print()</script> 
    // RESPONSE
    <script>print()</script>
    
  2. Хранимый XSS — когда полезная нагрузка XSS сохраняется на сервере и выполняется для каждого другого пользователя, заходящего на уязвимую веб-страницу. Код постоянно сохраняется в базе данных сайта и может быть использован для создания червя. Пример — Жертва использует веб-сайт и получает вредоносный код.

    <p><script>print()</script></p>
    
  3. 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 📃

  1. Используйте брандмауэр веб-приложений
    1. Брандмауэр немедленно блокирует определенные вредоносные полезные нагрузки и теги в HTTP-запросах.
    2. В некоторых случаях брандмауэр можно обойти, но это может стать очень неприятным для злоумышленника.
  2. DevSecOps
    1. Snyk.io
      1. Находите и автоматически устраняйте уязвимости в вашем коде, зависимостях с открытым исходным кодом, контейнерах и инфраструктуре как код.
      2. Используйте расширения snyk для вашей IDE.
      3. Сканируйте уязвимые контейнеры docker.
  3. Проверяйте и обеззараживайте данные, предоставленные пользователем
    1. Пользовательские данные должны проверяться на передней стороне сайтов на корректность (например, имя пользователя, электронная почта, домен и форматирование номера телефона), но они также всегда должны проверяться и санироваться на задней стороне для обеспечения безопасности.
    2. В зависимости от приложения, вы можете составить «белый список» буквенно-цифровых символов и «черный список» всех остальных символов. Однако это решение не является надежным.
  4. Кодирование HTML
    1. Каждый раз, когда вы вводите данные, предоставленные пользователем, в тело документа (например, с помощью атрибута innerHTML в JavaScript), вы должны HTML-кодировать эти данные.
    2. Примерами HTML-кодирования являются:
      1. & &
      2. < <
      3. > >
      4. » «
      5. ‘ ‘
  5. Используйте библиотеку кодирования безопасности
    1. Для многих языков и фреймворков существуют библиотеки кодирования безопасности, которые могут помочь предотвратить XSS.
    2. Используйте обновленные фреймворки.
  6. Используйте теги iframe
    1. Вы можете использовать тег iframe для предотвращения кражи cookies/сессий, привилегированного доступа.
    2. Платформа 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

Надеюсь, эта статья будет полезна для вас. Спасибо за прочтение.

Оцените статью
devanswers.ru
Добавить комментарий