Перейти к содержимому
← Каталог golang XSS

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 для приёма украденных данных (см. панель лабы) |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru