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

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

XSS через атрибут (javascript: URL)

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин python
CWE-79 · A03:2021 Pro
Обложка: XSS через атрибут (javascript: URL) Обложка: XSS через атрибут (javascript: URL)
Задача
# XSS в атрибуте ссылки (опасная схема URL) ## Сценарий Вы — специалист безопасности **GearNest**, магазина гиковских гаджетов. Скоро включают публичные профили покупателей: в кабинете указывается ссылка на личный сайт, и она отображается на странице профиля, открытой всем посетителям. Продуктовая команда считает, что раз шаблонизатор экранирует разметку, то ссылка безопасна; вас попросили проверить это утверждение до релиза, заодно с формой «Report to Admin», по которой администратор открывает присланные ссылки. ## Цель 1. Найдите поле профиля, значение которого попадает в адресный атрибут ссылки на публичной странице профиля, и убедитесь: экранирование разметки работает, а схема URL никак не проверяется. 2. Подберите схему адреса, при клике по которой в браузере посетителя исполняется скрипт, и подготовьте нагрузку, доставляющую cookie жертвы на ваш Exploit Server. 3. Отправьте боту-администратору ссылку на свой публичный профиль, перехватите его сессию и заберите CTF-флаг из админ-раздела. ## Теория Автоэкранирование шаблонизатора защищает ровно один контекст: текст и атрибуты HTML. Но значение в адресном атрибуте ссылки браузер трактует не как HTML, а как URL — со своими правилами и своими опасностями. В URL существуют схемы, при переходе по которым браузер не запрашивает ресурс, а исполняет содержимое адреса как код в контексте текущей страницы. HTML-экранирование такую схему не нейтрализует: она состоит из обычных букв. **Уязвимый паттерн:** ```python website = request.form.get('website', '').strip() db.execute('UPDATE users SET website=? WHERE id=?', (website, user['id'])) ``` Значение поля сохраняется как есть, без разбора адреса, и в шаблоне публичного профиля попадает в адресный атрибут. Сессия магазина хранится в cookie, доступной скрипту страницы, поэтому исполнение кода в браузере посетителя означает и кражу его сессии. ## Точка входа атаки `POST /profile/website` — сохранение ссылки, поле `website`. Публичный профиль — `GET /profile/<username>`. Доставка боту-администратору — `POST /report` с полем `url`. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** пароль не нужен — его сессию вы и перехватываете

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

другие лабы по этой уязвимости
Обложка лабы: Stored XSS в комментариях к товарам Обложка лабы: Stored XSS в комментариях к товарам
XSS

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

Комментарии к товарам выводятся через |safe без санитизации. Укради сессию администратора через Stored XSS.

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

XSS + обход CSP через unsafe-inline

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

+30 XP
Python Pro
Exploit Fix
Обложка лабы: DOM XSS через location.hash и innerHTML Обложка лабы: DOM XSS через location.hash и innerHTML
XSS

DOM XSS через location.hash и innerHTML

Клиентский JavaScript читает location.hash и вставляет через innerHTML без санитизации. Выполни произвольный JS и укради cookie администратора.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: Reflected XSS в поиске магазина Обложка лабы: Reflected XSS в поиске магазина
XSS

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

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

+30 XP
Python Pro
Exploit Fix