Межсайтовый скриптинг

by moiseevrus

Межсайтовый скриптинг

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

Что такое межсайтовый скриптинг (XSS)?

Межсайтовый скриптинг (также известный как XSS) — это уязвимость веб-безопасности, которая позволяет злоумышленнику скомпрометировать взаимодействие пользователей с уязвимым приложением. Это позволяет злоумышленнику обойти одну и ту же политику происхождения, которая предназначена для отделения разных веб-сайтов друг от друга. Уязвимости межсайтового скриптинга обычно позволяют злоумышленнику маскироваться под пользователя-жертву, выполнять любые действия, которые может выполнять пользователь, и получать доступ к любым данным пользователя. Если пользователь-жертва имеет привилегированный доступ к приложению, злоумышленник может получить полный контроль над всеми функциями и данными приложения.

Как работает XSS?

Межсайтовые сценарии работают, манипулируя уязвимым веб-сайтом, чтобы он возвращал пользователям вредоносный код JavaScript. Когда вредоносный код выполняется в браузере жертвы, злоумышленник может полностью скомпрометировать свое взаимодействие с приложением.

 

XSS-подтверждение концепции

Вы можете подтвердить большинство видов уязвимостей XSS, внедрив полезную нагрузку, которая заставляет ваш собственный браузер выполнять произвольный код JavaScript. Давно стало обычной практикой использовать эту alert()функцию для этой цели, потому что она короткая, безвредная и ее довольно трудно не заметить, когда она успешно вызывается. На самом деле, вы решаете большинство наших XSS-лабораторий, вызывая alert()их в симулированном браузере жертвы.

К сожалению, есть небольшая заминка, если вы используете Chrome. Начиная с версии 92 (20 июля 2021 г.) iframes из разных источников не могут вызывать файлы alert(). Поскольку они используются для создания некоторых более продвинутых XSS-атак, вам иногда нужно использовать альтернативную полезную нагрузку PoC. В этом случае мы рекомендуем print()функцию. Если вам интересно узнать больше об этом изменении и о том, почему нам нравится print()ознакомьтесь с записью в нашем блоге на эту тему.

Поскольку смоделированная жертва в наших лабораториях использует Chrome, мы изменили затронутые лабораторные работы, чтобы их также можно было решать с помощью print(). Мы указали это в инструкциях везде, где это уместно.

Какие существуют типы XSS-атак?

Существует три основных типа XSS-атак. Это:

  • Отраженный XSS , где вредоносный скрипт исходит из текущего HTTP-запроса.
  • Хранится XSS , где вредоносный скрипт поступает из базы данных веб-сайта.
  • XSS на основе DOM , где уязвимость существует в коде на стороне клиента, а не в коде на стороне сервера.

Отраженный межсайтовый скриптинг

Reflected XSS — простейшая разновидность межсайтового скриптинга. Он возникает, когда приложение получает данные в HTTP-запросе и включает эти данные в немедленный ответ небезопасным способом.

Вот простой пример отраженной XSS – уязвимости:

https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>

Приложение не выполняет никакой другой обработки данных, поэтому злоумышленник может легко построить атаку следующим образом:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
<p>Status: <script>/* Bad stuff here... */</script></p>

Если пользователь посещает URL-адрес, созданный злоумышленником, сценарий злоумышленника выполняется в браузере пользователя в контексте сеанса этого пользователя с приложением. В этот момент скрипт может выполнять любые действия и извлекать любые данные, к которым у пользователя есть доступ.

Сохраненный межсайтовый скриптинг

Сохраненный XSS (также известный как постоянный или XSS второго порядка) возникает, когда приложение получает данные из ненадежного источника и включает эти данные в свои более поздние HTTP-ответы небезопасным способом.

Рассматриваемые данные могут быть отправлены в приложение через HTTP-запросы; например, комментарии к сообщению в блоге, псевдонимы пользователей в чате или контактные данные в заказе клиента. В других случаях данные могут поступать из других ненадежных источников; например, приложение веб-почты, отображающее сообщения, полученные по SMTP, маркетинговое приложение, отображающее сообщения в социальных сетях, или приложение для мониторинга сети, отображающее пакетные данные из сетевого трафика.

Вот простой пример сохраненной XSS – уязвимости. Приложение доски объявлений позволяет пользователям отправлять сообщения, которые отображаются для других пользователей:

<p>Hello, this is my message!</p>

Приложение не выполняет никакой другой обработки данных, поэтому злоумышленник может легко отправить сообщение, которое атакует других пользователей:

<p><script>/* Bad stuff here... */</script></p>

Межсайтовый скриптинг на основе DOM

XSS на основе DOM (также известный как DOM XSS ) возникает, когда приложение содержит некоторый клиентский JavaScript, который обрабатывает данные из ненадежного источника небезопасным способом, обычно путем записи данных обратно в DOM.

В следующем примере приложение использует JavaScript для чтения значения из поля ввода и записи этого значения в элемент в HTML:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;

Если злоумышленник может контролировать значение поля ввода, он может легко создать вредоносное значение, которое приведет к выполнению его собственного сценария:

You searched for: <img src=1 onerror='/* Bad stuff here... */'>

В типичном случае поле ввода заполняется частью HTTP-запроса, например параметром строки запроса URL-адреса, что позволяет злоумышленнику осуществить атаку с использованием вредоносного URL-адреса таким же образом, как отраженный XSS.

Для чего можно использовать XSS?

Злоумышленник, использующий уязвимость межсайтового скриптинга, обычно может:

  • Выдавать себя за пользователя-жертву или маскироваться под него.
  • Выполнить любое действие, которое может выполнить пользователь.
  • Читать любые данные, к которым пользователь может получить доступ.
  • Захват учетных данных пользователя.
  • Выполните виртуальное искажение веб-сайта.
  • Внедрить троянские функции на веб-сайт.

Влияние XSS-уязвимостей

Фактическое воздействие XSS-атаки обычно зависит от характера приложения, его функций и данных, а также от статуса скомпрометированного пользователя. Например:

  • В брошюрном приложении, где все пользователи анонимны, а вся информация общедоступна, влияние часто будет минимальным.
  • В приложении, хранящем конфиденциальные данные, такие как банковские транзакции, электронные письма или медицинские записи, воздействие обычно будет серьезным.
  • Если скомпрометированный пользователь имеет повышенные привилегии в приложении, то воздействие, как правило, будет критическим, позволяя злоумышленнику получить полный контроль над уязвимым приложением и скомпрометировать всех пользователей и их данные.

Как найти и протестировать XSS-уязвимости

Подавляющее большинство XSS-уязвимостей можно быстро и надежно найти с помощью веб-сканера уязвимостей Burp Suite .

Ручное тестирование отраженных и сохраненных XSS обычно включает отправку некоторого простого уникального ввода (например, короткой буквенно-цифровой строки) в каждую точку входа в приложении, идентификацию каждого места, где отправленный ввод возвращается в ответах HTTP, и тестирование каждого местоположения по отдельности, чтобы определить можно ли использовать правильно сформированный ввод для выполнения произвольного JavaScript. Таким образом, вы можете определить контекст , в котором происходит XSS, и выбрать подходящую полезную нагрузку для ее использования.

Ручное тестирование XSS на основе DOM, возникающее из параметров URL, включает аналогичный процесс: помещение некоторого простого уникального ввода в параметр, использование инструментов разработчика браузера для поиска этого ввода в DOM и проверка каждого местоположения, чтобы определить, можно ли его использовать. Однако другие типы DOM XSS сложнее обнаружить. Чтобы найти уязвимости на основе DOM во входных данных, не основанных на URL (таких как document.cookie) или приемниках, не основанных на HTML (таких как setTimeout), ничто не заменит просмотр кода JavaScript, который может занять очень много времени. Сканер веб-уязвимостей Burp Suite сочетает в себе статический и динамический анализ JavaScript для надежной автоматизации обнаружения уязвимостей на основе DOM.

Политика безопасности контента

Политика безопасности контента ( CSP ) — это механизм браузера, целью которого является смягчение влияния межсайтового скриптинга и некоторых других уязвимостей. Если приложение, использующее CSP, ведет себя как XSS, то CSP может затруднить или предотвратить использование уязвимости. Часто CSP можно обойти, чтобы использовать основную уязвимость.

Внедрение висячей разметки

Внедрение висячей разметки — это метод, который можно использовать для захвата данных между доменами в ситуациях, когда полноценный эксплойт межсайтового сценария невозможен из-за входных фильтров или других средств защиты. Его часто можно использовать для сбора конфиденциальной информации, которая видна другим пользователям, включая токены CSRF, которые можно использовать для выполнения несанкционированных действий от имени пользователя.

Как предотвратить XSS-атаки

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

В целом, эффективное предотвращение XSS-уязвимостей, вероятно, будет включать в себя сочетание следующих мер:

  • Фильтровать вход по прибытии. В момент получения пользовательского ввода фильтруйте как можно более строго на основе ожидаемого или действительного ввода.
  • Кодировать данные на выходе. В момент, когда управляемые пользователем данные выводятся в ответах HTTP, кодируйте выходные данные, чтобы предотвратить их интерпретацию как активное содержимое. В зависимости от контекста вывода может потребоваться применение комбинации кодирования HTML, URL, JavaScript и CSS.
  • Используйте соответствующие заголовки ответов. Чтобы предотвратить XSS в ответах HTTP, которые не предназначены для содержания HTML или JavaScript, вы можете использовать заголовки Content-Typeи X-Content-Type-Options, чтобы браузеры интерпретировали ответы так, как вы задумали.
  • Политика безопасности контента. В качестве последней линии защиты вы можете использовать политику безопасности контента (CSP), чтобы уменьшить серьезность любых уязвимостей XSS, которые все еще возникают.

Общие вопросы о межсайтовом скриптинге

Насколько распространены XSS-уязвимости? Уязвимости XSS очень распространены, и XSS, вероятно, является наиболее часто встречающейся уязвимостью веб-безопасности.

Насколько распространены XSS-атаки? Трудно получить надежные данные о реальных XSS-атаках, но, вероятно, они используются реже, чем другие уязвимости.

В чем разница между XSS и CSRF? XSS заставляет веб-сайт возвращать вредоносный код JavaScript, а CSRF побуждает пользователя-жертву выполнять действия, которые он не намеревался совершать.

В чем разница между XSS и SQL-инъекцией? XSS — это уязвимость на стороне клиента, нацеленная на других пользователей приложения, а внедрение SQL — это уязвимость на стороне сервера, нацеленная на базу данных приложения.

Как предотвратить XSS в PHP? Отфильтруйте вводимые данные с помощью белого списка разрешенных символов и используйте подсказки или приведение типов. Экранируйте выходные данные с помощью htmlentitiesи ENT_QUOTESдля контекстов HTML или экранируйте JavaScript Unicode для контекстов JavaScript.

Как предотвратить XSS в Java? Отфильтруйте входные данные с помощью белого списка разрешенных символов и используйте библиотеку, например Google Guava, для HTML-кодирования выходных данных для контекстов HTML или используйте escape-последовательности JavaScript Unicode для контекстов JavaScript.

Статья является переводом portswigger.net

You may also like

Leave a Comment