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

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

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

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин nodejs
CWE-79 · A03:2021 Pro
Обложка: XSS через атрибут (javascript: URL) в Node.js Обложка: XSS через атрибут (javascript: URL) в Node.js
Задача
# XSS (Опасная URL-схема в атрибуте ссылки) ## Сценарий «СитиГрядка» — магазин для городских фермеров. В профиле покупателя есть поле «личный сайт», которое показывается на публичной странице профиля кликабельной ссылкой. Разработчики уверены в защите: автоэкранирование шаблонизатора включено, спецсимволы кодируются. Но значение попадает в атрибут ссылки — URL-контекст со своими правилами, — и схема URL при сохранении никак не проверяется. Тестировщик предположил, что экранирование HTML не запрещает исполнимые схемы ссылок, и попросил вас доказать это на практике. Канал доставки уже есть: форма отчёта, по которой администратор открывает присланные страницы в своей сессии. ## Цель 1. Убедитесь, что вставить HTML-тег через поле «личный сайт» нельзя, а выбрать URL-схему — можно. 2. Сохраните в профиль такую ссылку, чтобы клик по ней на публичной странице профиля исполнил ваш код в браузере посетителя. 3. Доставьте администратора на свой публичный профиль через форму отчёта, перехватите его сессию и заберите флаг из служебной панели. ## Теория Экранирование HTML защищает контекст разметки: оно мешает «выйти» из атрибута и вставить тег. Но у ссылки есть второе измерение — URL-схема, и оно экранированием не контролируется. Существуют схемы, при активации которых браузер не переходит по адресу, а исполняет тело ссылки как код в контексте текущей страницы. Автоэкранирование шаблонизатора такие схемы не блокирует: значение остаётся валидным атрибутом и при этом становится исполнимым. **Уязвимый паттерн:** ```html <!-- Ссылка пользователя в атрибуте без проверки схемы: --> <a href="{{ user.website }}">{{ user.website }}</a> ``` Механика словами: значение из профиля попадает в атрибут без валидации схемы. Посетитель, кликнувший по такой ссылке на публичном профиле, запускает код в собственном авторизованном контексте; скрипт видит cookie домена и может доставить сессию атакующему на внешний приёмник. ## Точка входа атаки `POST /profile/website` — форма обновления поля «личный сайт»: поле `website` (нужен CSRF-токен со страницы профиля). `GET /profile/:username` — публичная страница профиля с кликабельной ссылкой. `GET /report` и `POST /report` — форма отправки ссылки администратору. `GET /admin` — служебная панель с флагом (роль администратора). * **Тестовая учётная запись:** `demo` / `demo` * **Приёмник данных:** Exploit Server (ссылка на панели лабы)

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

другие лабы по этой уязвимости
Обложка лабы: DOM XSS через location.hash и innerHTML (Express) Обложка лабы: DOM XSS через location.hash и innerHTML (Express)
XSS

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

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

+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