Перейти к содержимому

Поиск по платформе

Reflected XSS в поиске магазина

Поисковый запрос отражается в HTML без экранирования. Выполни произвольный JS в контексте магазина.

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Легко+30 XP ~10 мин golang
CWE-79 · A03:2021 Pro
Обложка: Reflected XSS в поиске магазина Обложка: Reflected XSS в поиске магазина
Задача
# Reflected XSS: кража сессии администратора через поиск ## Сценарий Вы проводите аудит безопасности интернет-магазина **ГикДевайс**. Разработчик добавил поиск по каталогу и выводит поисковый запрос обратно на страницу результатов. У сервиса есть администратор-бот: он принимает жалобы из формы «Report to Admin» и открывает любую переданную ссылку в реальном браузере со своей активной сессией. Команда уверена, что ссылки безвредны — страница каталога «всего лишь показывает запрос». Внутренний аудит считает иначе: если во внедрённой ссылке выполнится JavaScript, он исполнится от имени администратора. ## Цель 1. Найдите отражённый XSS в поиске каталога: проверьте, экранируется ли запрос при выводе на страницу. 2. Сформируйте ссылку, в которой выполняется скрипт, отправляющий cookie-сессию страницы на ваш Exploit Server. 3. Передайте ссылку администратору через форму жалобы. 4. С украденной сессией откройте панель администратора и получите флаг. ## Теория Reflected XSS возникает, когда приложение сразу отражает пользовательский ввод в HTML-ответе без экранирования. Если в страницу попадает script-тег или тег с обработчиком события, браузер жертвы исполняет код в контексте сайта — со всеми правами, включая чтение `document.cookie`, когда cookie не помечена `HttpOnly`. Шаблонизатор Go `html/template` по умолчанию экранирует все переменные. Уязвимость появляется, только когда разработчик явно отключает защиту: кастомная функция помечает строку как «уже безопасный HTML». **Уязвимый паттерн:** ```go // кастомная функция отключает экранирование пользовательских данных funcMap := template.FuncMap{ "safeHTML": func(s string) template.HTML { return template.HTML(s) }, } // шаблон выводит запрос так: {{safeHTML .Query}} ``` `template.HTML(s)` сообщает движку «строка уже безопасна» — и любой тег из поискового запроса попадает в DOM как исполняемый код. ## Точка входа атаки `GET /catalog?q=...` — поиск с отражением запроса; `POST /report` — форма жалобы, бот откроет переданный URL; панель администратора — `/admin`. * Обычный пользователь: `demo` / `demo` * Exploit Server для приёма украденных данных — кнопка в панели лабы

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: XSS через атрибут (javascript: URL) Обложка лабы: XSS через атрибут (javascript: URL)
XSS

XSS через атрибут (javascript: URL)

XSS через javascript: URL-схему в атрибуте href. Go html/template экранирует HTML, но пропускает опасные URL-схемы.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: DOM XSS через URL-фрагмент (location.hash) Обложка лабы: DOM XSS через URL-фрагмент (location.hash)
XSS

DOM XSS через URL-фрагмент (location.hash)

JavaScript на странице каталога читает location.hash и вставляет его в DOM через innerHTML. Укради сессию администратора.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Stored XSS в комментариях к товарам Обложка лабы: Stored XSS в комментариях к товарам
XSS

Stored XSS в комментариях к товарам

Комментарии к товарам хранятся без санитаризации и отображаются как HTML. Укради сессию администратора.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: XSS при слабой CSP (unsafe-inline) Обложка лабы: XSS при слабой CSP (unsafe-inline)
XSS

XSS при слабой CSP (unsafe-inline)

Reflected XSS эксплуатируется благодаря CSP с 'unsafe-inline'. Исправление требует nonce-based CSP.

+90 XP
Go Pro
Exploit Fix