Межсайтовый скриптинг, или Cross site scripting, или XSS, предполагает наличие сайта, подключающего непредусмотренный код Javascript, который, в свою очередь, передается пользователям, исполняющим этот код в своих браузерах. Безобидный пример XSS (именно такой вы должны использовать!) выглядит так:
alert(‘XSS’);
Это создаст вызовет функцию Javascript alert и создаст простое (и безобидное) окошко с буквами XSS. В предыдущих версиях книги я рекомендовал вам использовать этот пример при написании отчетов. Это было так, пока один чрезвычайно успешный хакер не сказал мне, что это был “ужасный пример”, объяснив, что получатель отчета об уязвимости может не понять опасность проблемы и из-за безобидности примера выплатить небольшое вознаграждение.
Таким образом, используйте этот пример для обнаружения XSS-уязвимости, но при составлении отчета подумайте о потенциальном вреде, который может нанести уязвимость и объясните его. Под этим я не подразумеваю рассказ компании о том, что же такое XSS, но предлагаю объяснить, чего вы можете добиться, используя уязвимость и как конкретно это могло отразиться на их сайте.
Существует три различных вида XSS, о которых вы могли слышать при исследовании и написании отчетов:
- Reflective XSS: эти атаки не сохраняются на сайте, что означает создание и выполнение XSS в одном запросе и ответе.
- Stored XSS: эти атаки сохраняются на сайте и зачастую более опасны. Они сохраняются на сервере и выполняются на “нормальных” страницах ничего не подозревающими пользователями.
- Self XSS: эти атаки также не сохраняются на сайте и обычно используются как часть обмана человека с целью запуска XSS им самим.Когда вы ищете уязвимости, вы обнаружите, что компании зачастую не заботятся об устранении Self XSS, они беспокоятся только о тех случаях, когда вред их пользователям может быть нанесен не ими самими, а кем-либо еще, как в случае с Reflective и Stored XSS. Однако, это не значит, что вы не должны искать Self XSS.
Если вы нашли ситуацию, в которой Self XSS может быть выполнен, но не сохранен, подумайте о том, как может быть использована эта уязвимость, сможете ли вы использовать её в комбинации с чем-либо, чтобы она уже не была Self XSS?
Один из самых известных примеров использования XSS — MySpace Samy Work, выполненный Сами Камкаром. В октябре 2005 Сами использовал уязвимость stored XSS на MySpace, что позволило ему загрузить код Javascript, который выполнялся каждый раз, когда кто-нибудь посещал его страницу MySpace, добавляя посетителя страницы в друзья профиля Сами. Более того, код также копировал себя на страницы новых друзей Сами таким образом, чтобы профили новых его друзей обновлялись со следующим текстом: “but most of all, samy is my hero”.
[ad name=»Responbl»]
Хотя пример Сами был относительно безобидным, использование XSS позволяет красть логины, пароли, банковскую информацию, и так далее. Несмотря на потенциальный вред, исправление XSS-уязвимостей, как правило, не является сложным и требует от разработчиков просто экранировать пользовательский ввод (прямо как в HTML-инъекции) при его отображении. Хотя, некоторые сайты так же убирают потенциально вредоносные символы, когда хакер их отправляет.
Ссылки OWASP
Посмотрите набор шпаргалок на OWASP XSS Filter Evasion Cheat Sheet25
Примеры
1. Распродажа Shopify
Сложность: Низкая
Url: wholesale.shopify.com
Ссылка на отчет: https://hackerone.com/reports/10629326 Дата отчета: 21 декабря 2015
Выплаченное вознаграждение: $500
Описание:
Сайт распродажи Shopify27 является простой страницей с прямым призывом к действию — введите название товара и нажмите “Find Products”. Вот скриншот:
XSS-уязвимость здесь была самой простой, какую только можно найти — текст, введенный в поисковую строку не был экранирован, так что исполнялся любой введенный Javascript. Вот отправленный текст из описания уязвимости: test’;alert(‘XSS’);’
Причина того, что это сработало, в том, что Shopify принимал пользовательский ввод, выполнял поисковый запрос и при отсутствии результатов, печатал сообщение, сообщающее об отсутствии результатов поиска по введенному запросу, показывая на странице не экранированный пользовательский ввод. В результате, отправленный Javascript рендерился на странице и браузеры интерпретировали его как исполняемый Javascript.
[ad name=»Responbl»]
Выводы
Тестируйте все, уделяйте особое внимание ситуациям, где введенный текст рендерится на странице. Проверяйте, можете ли вы включить в ввод HTML или Javascript, и смотрите, как сайт обрабатывает их. Так же пробуйте закодировать ввод подобно тому, как описано в главе, посвященной HTML-инъекциям.
XSS-уязвимости не должны быть сложными или запутанными. Эта уязвимость была самой простой, какую можно представить — простое поле для ввода текста, которое не обрабатывает пользовательский ввод. И она была обнаружена 21 декабря 2015, и принесла хакеру $500! Все, что потребовалось — хакерское мышление.
2. Корзина подарочных карт Shopify
Сложность: Низкая
Url: hardware.shopify.com/cart
Ссылка на отчет: https://hackerone.com/reports/9508928 Дата отчета: 21 октября 2015
Выплаченное вознаграждение: $500
Описание:
Сайт магазина подарочных карт Shopify29 позволяет пользователям создавать собственное оформление для подарочных карт с помощью HTML-формы, включающей в себя окошко загрузки файла, несколько строк для ввода текста деталей, и так далее. Вот скриншот:
XSS-уязвимость здесь срабатывала, когда в поле формы, предназначенное для названия изображения, вводили Javascript. Это довольно легко сделать, используя HTML прокси, о которых мы поговорим позднеев главе “Инструменты”. Итак, оригинальная отправка формы включала:
Content-Disposition: form-data; name=”properties[Artwor 2 k file]”
Её можно было перехватить и изменить на:
Content-Disposition: form-data; name=”properties[Artwor 2 k file<img src=’test’ onmouseover=’alert(2)’>]”;
[ad name=»Responbl»]
Выводы
Здесь можно подметить две вещи, которые помогут обнаруживать XSS-уязвимости:
- Уязвимость в этом случае не была непосредственно в самом поле загрузки файла — она была в названии поля. Так что, когда вы ищите возможность применить XSS, не забывайте поиграться со всеми доступными значениями полей.
- Указанное значение было отправлено после того, как его изменили при помощи прокси. Это важно в ситуациях, когда на клиентской стороне (в вашем браузере) значения валидируются перед отправкой на сервер.
На самом деле, каждый раз, когда вы видите, что валидация в реальном времени осуществляется в вашем браузере, это должно быть красным флагом, сигнализирующем о необходимости протестировать это поле! Разработчики могут допускать ошибки, не валидируя отправленные значения на предмет вредоносного кода на сервере, потому что надеются, что Javascript-валидация в браузере уже осуществила проверку.
Оглавление:
Базовые знания о HTTP протоколе. Глава 1
Что такое HTML иньекция. Уроки хакинга. Глава 2.
Что такое HPP (HTTP Parameter Pollution) атака? Уроки хакинга. Глава 3
Что такое CRLF инъекция, примеры использования. Уроки хакинга, Глава 4.
Уязвимости в логике приложений. Уроки хакинга. Глава 6
Уязвимости в логике работы приложений. Примеры.
Что такое XSS атака (Cross Site Scripting Attacks). Уроки хакинга. Глава 7.
SQL иньекции. Виды и примеры использования. Уроки хакинга. Глава 8.
Уязвимости Открытого Перенаправления. Уроки хакинга. Глава 9
8 comments On Что такое XSS атака (Cross Site Scripting Attacks). Уроки хакинга. Глава 7.
Pingback: SQL иньекции. Виды и примеры использования. Уроки хакинга. Глава 8. - Cryptoworld ()
Pingback: Что такое HTML иньекция. Уроки хакинга. Глава 2. - Cryptoworld ()
Pingback: Методика взлома крупных компаний через WEB. - Cryptoworld ()
Pingback: Уязвимости в логике приложений. Уроки хакинга. Глава 6 - Cryptoworld ()
Очень точно описано. Админ— ок.
Pingback: Уязвимости Открытого Перенаправления. Уроки хакинга. Глава 9 - Cryptoworld ()
Pingback: Захват поддомена. Уроки хакинга. Глава 10. - Cryptoworld ()
Pingback: Как взломать сайт бесплатно используя уязвимости Drupal - Cryptoworld ()