Stored XSS в комментариях к товарам (Node.js)
Комментарии к товарам рендерятся через nunjucks-фильтр |safe без санитайзинга. Укради сессию администратора через Stored XSS, чтобы получить доступ к флагу.
mediumnodejsPro
Задача
# Stored XSS: комментарии к товарам
## Сценарий
Перед вами Express + Nunjucks приложение интернет-магазина SecureShop. На странице каждого товара есть форма комментариев: любой авторизованный пользователь может оставить отзыв, который сохраняется в базе и потом отображается на странице того же товара всем посетителям. То есть значение поля комментария — это **stored**-данные: они переживают одну сессию атакующего и видны другим пользователям при следующих визитах.
При отображении сохранённых комментариев приложение вставляет их текст в HTML-вывод **без экранирования специальных символов HTML**. Это превращает форму комментария в полноценный канал Stored XSS: введённая один раз HTML-разметка (включая исполняемые теги вида `<script>`, `<img onerror=..>`, `<svg onload=..>`) сохраняется в БД и далее автоматически исполняется в браузере **каждого** пользователя, открывающего страницу этого товара.
В приложении есть отдельная служебная форма «Report to Admin», через которую обычный пользователь может пожаловаться администратору и приложить ссылку. Бот-администратор открывает присланную ссылку в собственном авторизованном браузере. Соединив stored-XSS на странице товара с этой формой, обычный пользователь получает прямой канал доставки JavaScript в браузер админа: оставить вредоносный комментарий на товаре, отправить ссылку на страницу этого товара через Report, и через полученный XSS перехватить сессионную идентификацию администратора. Дальше — на админский раздел `/admin`, где приложение и отдаёт CTF-флаг.
## Цели
1. Найдите форму комментариев и подтвердите, что HTML-разметка из текста комментария **исполняется** при отображении страницы (а не выводится как текст).
2. Сконструируйте комментарий, исполнение которого в браузере жертвы доставит её сессионный идентификатор на ваш Exploit Server.
3. Доставьте администратора на страницу с таким комментарием через форму отчёта; перехватите его сессию; войдите от его имени на админский раздел и заберите CTF-флаг.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
| Exploit Server | ссылка «Exploit Server» на панели лабы |