Reflected XSS в поиске магазина
Поисковый запрос выводится через |safe фильтр Jinja2 без экранирования. Выполни произвольный JS и укради cookie администратора.
easypythonPro
Задача
# Reflected XSS: кража сессии администратора через форму поиска
## Сценарий
Перед вами Flask-приложение интернет-магазина SecureShop. На странице каталога есть форма поиска: пользователь вводит поисковый запрос, сервер возвращает страницу с результатами и **отображает на ней сам запрос** («Showing results for..»). Это типичный паттерн UX и в нём нет ничего необычного — за одним исключением: разработчик вставляет введённый запрос в HTML-вывод **без экранирования**.
В приложении есть отдельная служебная форма «Report to Admin», через которую обычный пользователь может отправить администратору жалобу с приложенной ссылкой. Бот-администратор открывает присланную ссылку в своём браузере под собственной авторизованной сессией. Соединив эти два факта, обычный пользователь получает классический канал доставки Reflected XSS: подобрать поисковый запрос, который при отображении на странице выполнит код в браузере администратора, отправить ссылку на такую страницу через «Report to Admin» и через возникший XSS перехватить сессионную идентификацию администратора.
С админскими правами доступна страница `/admin`, где приложение и отдаёт CTF-флаг.
## Цели
1. Найдите место, где пользовательский ввод отражается в HTML-ответе. Подтвердите, что разметка из ввода **исполняется браузером**, а не выводится как текст.
2. Сконструируйте поисковый запрос, который из браузера жертвы доставит её сессионный идентификатор на внешний приёмник (Exploit Server).
3. Отправьте ссылку на страницу с этим запросом администратору через форму отчёта; перехватите его сессионный идентификатор; войдите его сессией на админский раздел и заберите CTF-флаг.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
| Exploit Server | ссылка «Exploit Server» на панели лабы |