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

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

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

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин golang
CWE-79 · A03:2021 Pro
Обложка: DOM XSS через URL-фрагмент (location.hash) Обложка: DOM XSS через URL-фрагмент (location.hash)
Задача
# DOM XSS через URL-фрагмент ## Сценарий Вы — аудитор маркетплейса товаров для дома **LoopMarket**. Маркетолог пожаловался, что переходы по ссылкам с якорями из писем и поисковиков «подсвечивают» на странице каталога странные надписи. Выяснилось, что каталог украшает страницу надписью с текстом поискового запроса, взятым из фрагмента адреса, — и вся эта механика живёт на клиенте. Серверная фильтрация тут бессильна по построению: часть адреса после решётки не покидает браузер. Жалобы покупателей смотрит бот-администратор — он открывает любую ссылку из формы «Report to Admin». ## Цель 1. Найдите в клиентском скрипте страницы каталога источник данных из адреса и опасный приёмник, вставляющий их в разметку. 2. Составьте ссылку на каталог, при открытии которой в браузере жертвы выполнится код, передающий куки сессии на ваш Exploit Server. 3. Отправьте ссылку боту-администратору через форму жалоб. 4. Перехваченной сессией войдите в панель администратора и заберите флаг. ## Теория DOM XSS отличается от отражённой и хранимой инъекций: данные не только вводятся, но и исполняются на клиенте — сервер их вообще не видит. Источником служат части адреса, хранилище браузера, реферер; приёмником — методы вставки, интерпретирующие строку как разметку. Фрагмент адреса после решётки — классический источник: он не отправляется на сервер и не попадает в журналы, поэтому WAF и серверная санитизация его не касаются. **Уязвимый паттерн:** ```javascript document.getElementById('search-info').innerHTML = 'Showing results for: ' + decoded; ``` Скрипт читает фрагмент адреса, декодирует его и вставляет в элемент страницы методом, который разбирает строку как HTML. Теги и обработчики событий из фрагмента становятся живой разметкой — и исполняются в момент вставки, в контексте сайта и сессии жертвы. ## Точка входа атаки `GET /catalog` — страница каталога; клиентский скрипт читает фрагмент адреса после решётки. * **Обычный пользователь:** `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
Обложка лабы: 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
Обложка лабы: 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