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

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

DOM XSS через location.hash и innerHTML (Express)

Клиентский JavaScript на странице каталога читает фрагмент URL (location.hash) и вставляет его через innerHTML без санитизации. Серверный код чист, защита и уязвимость живут полностью в браузерном JS.

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин nodejs
CWE-79 · A03:2021 Pro
Обложка: DOM XSS через location.hash и innerHTML (Express) Обложка: DOM XSS через location.hash и innerHTML (Express)
Задача
# DOM-based XSS (инъекция через URL-фрагмент) ## Сценарий **GridLane** — магазин товаров для мейкеров на Node.js и Express. Вёрстальщица Полина добавила в каталог «запоминаемые фильтры»: часть адреса после символа `#` читается клиентским скриптом и выводится над списком товаров меткой «Filtering by: …». Полина уверена, что фича безобидна: фрагмент не покидает браузер, сервер его не видит — значит, и обойти серверные защиты через него нельзя. Проверить это заявление поручили вам. ## Цель 1. Изучите клиентский скрипт каталога и убедитесь, что фрагмент URL вставляется в страницу как разметка, а не как текст. 2. Сконструируйте ссылку, фрагмент которой исполняет скрипт в браузере жертвы и доставляет её сессионный идентификатор на ваш Exploit Server. 3. Отправьте ссылку администратору через форму отчёта, перехватите его сессию и заберите CTF-флаг. ## Теория В DOM-based XSS уязвимость целиком живёт в браузере: серверное экранирование, auto-escape шаблонизатора и WAF не участвуют, потому что вредоносные данные не пересылают по сети — браузер хранит фрагмент локально. Источник здесь — URL-фрагмент, приемник — свойство DOM, которое парсит строку как HTML и создаёт живые элементы страницы. **Уязвимый паттерн:** ```js // Декодированный фрагмент склеивается с разметкой и вставляется как HTML: el.innerHTML = '<p ...>Filtering by: ' + decoded + '</p>'; ``` Клиентский скрипт берёт часть адреса после `#`, декодирует её и записывает в DOM через свойство, трактующее строку как разметку. Любые теги из ссылки становятся настоящими элементами страницы и исполняются с правами её скриптов — включая чтение cookies, доступных JavaScript. ## Точка входа атаки `GET /catalog#фрагмент` — метка с содержимым фрагмента строится в браузере; на сервер уходят только обычные запросы страницы. Канал доставки на жертву: `POST /report` — поле `url` со ссылкой, содержащей ваш фрагмент. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** бот, который открывает присланные через форму отчёта ссылки в собственной авторизованной сессии — его пароль вам недоступен, скрипт должен отработать в его браузере сам * **Exploit Server:** приёмник данных — ссылка на панели лабы

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

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

XSS через атрибут (javascript: URL) в Node.js

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

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

Stored XSS в комментариях к товарам (Node.js)

Комментарии к товарам рендерятся через nunjucks-фильтр |safe без санитайзинга. Укради сессию администратора через Stored XSS, чтобы получить доступ к флагу.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: XSS + обход CSP через unsafe-inline (Node.js) Обложка лабы: XSS + обход CSP через unsafe-inline (Node.js)
XSS

XSS + обход CSP через unsafe-inline (Node.js)

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

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: Reflected XSS в поиске Node.js Обложка лабы: Reflected XSS в поиске Node.js
XSS

Reflected XSS в поиске Node.js

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

+30 XP
Node.js Pro
Exploit Fix