Reflected XSS в поиске магазина
Поисковый запрос отражается в HTML без экранирования. Выполни произвольный JS в контексте магазина.
easygolangPro
Задача
# Reflected XSS (Кража сессии администратора через поиск)
## Сценарий
Вы проводите аудит безопасности интернет-магазина **SecureShop**. Разработчик добавил функцию поиска по каталогу и при отображении результатов вставляет пользовательский запрос обратно в HTML страницы. У приложения есть **администратор-бот**, который автоматически проверяет жалобы, отправленные через форму **«Report to Admin»** — он открывает любой переданный URL в реальном браузере с активной сессией. Если в URL вам удастся внедрить JavaScript, он выполнится в контексте администратора.
## Цель
1. Найдите Reflected XSS в форме поиска каталога.
2. Сформируйте вредоносную ссылку, которая отправляет содержимое `document.cookie` на ваш Exploit Server.
3. Отправьте ссылку администратору через форму репорта.
4. Используйте украденный `session_token` для входа в панель администратора.
5. Получите флаг на странице Admin Panel.
## Теория
**Reflected XSS** возникает, когда приложение принимает пользовательский ввод и сразу же отражает его обратно в HTML-ответ без экранирования. Если в страницу попадает `<script>` или HTML-тег с обработчиком события (`<img onerror=...>`, `<svg onload=...>`), браузер жертвы исполняет код в контексте сайта — со всеми правами, включая чтение `document.cookie` (если cookie не помечена `HttpOnly`).
Go-шаблонизатор `html/template` по умолчанию автоматически экранирует все переменные. Уязвимость возникает только если разработчик явно отключает защиту через кастомные функции шаблона, помечающие строку как «уже безопасный HTML».
**Уязвимый паттерн:**
```go
// В funcMap регистрируется функция, отключающая экранирование пользовательских данных:
funcMap := template.FuncMap{
"marker": func(s string) template.HTML { return template.HTML(s) },
}
// Шаблон использует её для пользовательского ввода:
// <p>Search results for: {{marker .Query}}</p>
```
`template.HTML(s)` сообщает движку «эта строка уже безопасна», и любой `<script>` из `s` попадает в DOM как исполняемый код.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |
| Поиск каталога | `GET /catalog?q=...` |
| Admin Panel | `GET /admin` (требует роль admin) |
| Форма репорта | `POST /report` (бот откроет переданный URL) |
| Exploit Server | внешний URL для приёма украденных данных (см. панель лабы) |