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

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

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

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Сложно+90 XP ~55 мин golang
CWE-79 · A03:2021 Pro
Обложка: XSS при слабой CSP (unsafe-inline) Обложка: XSS при слабой CSP (unsafe-inline)
Задача
# Reflected XSS при слабой Content-Security-Policy ## Сценарий Вы проводите внешний аудит магазина астрономических приборов **AstroCart** перед крупным релизом. Разработчик недавно добавил заголовок Content-Security-Policy и записал в чек-лист «XSS закрыт». Вам это не понравилось: в коде каталога осталась собственная функция шаблона, отключающая экранирование, а значение политики составлено так, что разрешает исполнение встроенных скриптов. Жалобы посетителей рассматривает бот-администратор: он открывает любую ссылку, присланную через форму «Report to Admin». ## Цель 1. Изучите заголовок безопасности в ответе сервера и найдите, какая его часть отключает защиту от инлайн-скриптов. 2. Подтвердите reflected XSS в поиске каталога: значение параметра отображается на странице как живая разметка. 3. Составьте ссылку, при открытии которой код в браузере жертвы передаёт куки сессии на ваш Exploit Server. 4. Доставьте ссылку боту через жалобу, войдите его сессией в панель администратора и заберите флаг. ## Теория Content-Security-Policy — заголовок, объявляющий браузеру, какие источники скриптов и стилей разрешены. Это второй слой защиты от XSS: даже если чужая разметка попала в страницу, правильно составленная политика не даст ей выполниться. Защита рушится, когда политика явно разрешает встроенные скрипты: это ключевое слово в директиве источников скриптов отменяет блокировку инлайн-кода целиком, вне зависимости от остального значения. **Уязвимый паттерн (двойная ошибка):** ```go "safeHTML": func(s string) template.HTML { return template.HTML(s) }, w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'unsafe-inline' 'self'; style-src 'self' 'unsafe-inline'") ``` Первая строка выключает экранирование поискового запроса при выводе в каталоге: разметка из параметра попадает в страницу как есть. Вторая легализует выполнение встроенных скриптов, поэтому внедрённый код не встречает препятствий. Политика при этом ограничивает и исходящие соединения — канал доставки украденных данных выбирайте с учётом этого ограничения. ## Точка входа атаки `GET /catalog?q=...` — поиск по каталогу; введённый запрос отражается на странице. * **Обычный пользователь:** `demo` / `demo` * **Доставка боту:** `POST /report` — бот откроет присланную ссылку * **Цель:** `GET /admin` — панель администратора с флагом * **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
Обложка лабы: Reflected XSS в поиске магазина Обложка лабы: Reflected XSS в поиске магазина
XSS

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

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

+30 XP
Go Pro
Exploit Fix