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

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

DOM XSS через URL-фрагмент

JavaScript читает location.hash и вставляет значение через innerHTML — DOM XSS без участия сервера.

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин php
CWE-79 · A03:2021 Pro
Обложка: DOM XSS через URL-фрагмент Обложка: DOM XSS через URL-фрагмент
Задача
# DOM-based XSS через URL-фрагмент ## Сценарий «КлеверНотес» — интернет-магазин планигровщиков и канцелярии. Фронтендер Игорь Лучников недавно выпустил фичу «поделиться фильтром»: ссылка каталога с тегом в фрагменте адреса, который клиентский скрипт читает и показывает над товарами метку фильтра. После релиза поддержка получила жалобу: у открывшего «подборку» из чата покупателя на странице «само» выполнилось действие. Игорь уверен, что серверное экранирование всё защищает, и просит вас проверить, может ли чужой код исполниться вовсе без подозрительного запроса к серверу. ## Цель 1. Найдите в клиентском скрипте каталога путь данных от фрагмента адреса до страницы и подтвердите исполнение внедрённой разметки в собственном браузере. 2. Подготовьте адрес с фрагментом, при открытии которого cookie администратора отправляются на ваш сервер приёма, и доставьте его боту через страницу отчёта. 3. Подмените свою сессию перехваченной и откройте профиль администратора — там отображается флаг. ## Теория DOM XSS — единственный вид XSS, целиком живущий в браузере: источник данных и точка внедрения — клиентский код. Фрагмент адреса после решётки не отправляется на сервер вовсе, поэтому серверное экранирование и сетевые фильтры здесь бессильны — скрипт читает фрагмент, декодирует его и вставляет в страницу свойством, которое интерпретирует строку как разметку, а не как текст. **Уязвимый паттерн:** ```js document.getElementById('search-info').innerHTML = 'Filtering by tag: ' + decoded; ``` Механика атаки: во фрагмент URL помещается HTML-элемент с обработчиком, срабатывающим при разборе страницы без клика. Через свойство, создающее живые узлы, часть векторов не оживает, поэтому подбирается подходящий тег. Жертве доставляется адрес — страница каталога отдаётся сервером чистой, но после локальной обработки скриптом разметка из фрагмента становится частью документа и исполняется с правами сессии жертвы, включая доступ к её cookie. ## Точка входа атаки `GET /catalog` — фрагмент адреса после `#` обрабатывается клиентским скриптом страницы и на сервер не отправляется. `POST /report` — поле `url`: ссылка, которую проверит бот-администратор. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `???`

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

другие лабы по этой уязвимости
Обложка лабы: XSS в HTML-атрибуте (Attribute Context) Обложка лабы: XSS в HTML-атрибуте (Attribute Context)
XSS

XSS в HTML-атрибуте (Attribute Context)

Пользовательский URL выводится в атрибуте href без валидации схемы — javascript: выполняется при клике.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: Reflected XSS в поиске товаров Обложка лабы: Reflected XSS в поиске товаров
XSS

Reflected XSS в поиске товаров

Поисковый запрос отображается на странице без экранирования, позволяя выполнить произвольный JavaScript в браузере жертвы.

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

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

Комментарии к товарам выводятся без экранирования — Stored XSS позволяет украсть cookie администратора.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: 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