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

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

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

Поисковый запрос выводится через |safe фильтр Jinja2 без экранирования. Выполни произвольный JS и укради cookie администратора.

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Легко+30 XP ~10 мин python
CWE-79 · A03:2021 Pro
Обложка: Reflected XSS в поиске магазина Обложка: Reflected XSS в поиске магазина
Задача
# Reflected XSS в поиске каталога ## Сценарий Вы — специалист безопасности **ModulMart**, магазина компьютерных комплектующих. Служба поддержки получила жалобу: клиент перешёл со «скидочной» ссылкой на страницу поиска магазина, и после этого из его сессии кто-то попытался оформить заказ. Адрес ссылки потерян, но инцидент-ответчики попросили вас проверить, нельзя ли использовать сам поиск магазина как орудие атаки на посетителей — тем более что у магазина есть форма «Report to Admin», по которой администратор открывает присланные ему адреса. ## Цель 1. Найдите место, где поисковый запрос отражается в HTML-ответе, и подтвердите: разметка из запроса исполняется браузером, а не выводится текстом. 2. Сконструируйте запрос, исполнение которого в браузере жертвы доставит её cookie на ваш Exploit Server. 3. Отправьте боту-администратору адрес страницы с этим запросом, перехватите его сессию и заберите CTF-флаг из админ-раздела. ## Теория Reflected XSS — отражённый ввод: то, что пользователь передал в параметрах, возвращается в разметке страницы и исполняется в его браузере. Шаблонизатор фреймворка экранирует вывод по умолчанию, поэтому в чистом виде ошибка встречается редко — чаще защита для конкретного значения отключена намеренно, «чтобы форматирование поиска выглядело как надо». **Уязвимый паттерн:** ```html Showing results for “{{ query|safe }}” ``` Для отражаемого значения автоэкранирование шаблона явно выключено: строка из параметра попадает в разметку как есть. Скрипт, исполнившийся на странице, работает в контексте домена приложения — видит cookie сессии и может действовать от имени жертвы. Форма отчёта превращает это в атаку на администратора: бот открывает присланный адрес в собственной авторизованной сессии. ## Точка входа атаки `GET /catalog` с параметром `q` — отражение запроса на странице результатов. Доставка боту-администратору — `POST /report` с полем `url`. * **Обычный пользователь:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: XSS + обход CSP через unsafe-inline Обложка лабы: XSS + обход CSP через unsafe-inline
XSS

XSS + обход CSP через unsafe-inline

Поисковый запрос выводится через |safe без экранирования, а CSP содержит unsafe-inline — inline-скрипты не блокируются. Исправь оба файла: убери |safe и настрой nonce-based CSP.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: DOM XSS через location.hash и innerHTML Обложка лабы: DOM XSS через location.hash и innerHTML
XSS

DOM XSS через location.hash и innerHTML

Клиентский JavaScript читает location.hash и вставляет через innerHTML без санитизации. Выполни произвольный JS и укради cookie администратора.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: XSS через атрибут (javascript: URL) Обложка лабы: XSS через атрибут (javascript: URL)
XSS

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

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

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

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

Комментарии к товарам выводятся через |safe без санитизации. Укради сессию администратора через Stored XSS.

+60 XP
Python Pro
Exploit Fix