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

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

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

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин golang
CWE-79 · A03:2021 Pro
Обложка: XSS через атрибут (javascript: URL) Обложка: XSS через атрибут (javascript: URL)
Задача
# XSS в контексте атрибута ссылки ## Сценарий Вы — пентестер, приглашённый проверить магазин фестивального мерча **ThreadHive**. В поддержку поступила жалоба: покупатель перешёл по ссылке «личный сайт» из публичного профиля другого пользователя и оказался на фишинговой странице. Разработчики уверены, что штатный шаблонизатор Go экранирует всё опасное автоматически, и вам поручили проверить механизм публичных профилей целиком. Профили просматривает в том числе бот-администратор поддержки: он открывает страницы по жалобам из формы «Report to Admin» и переходит по ссылкам из профилей. ## Цель 1. Обойдите встроенную защиту шаблонизатора в поле «Website» и сохраните в профиле ссылку, которая исполняет код в браузере каждого, кто по ней кликнет. 2. Сделайте так, чтобы при переходе по ссылке куки сессии посетителя уходили на ваш Exploit Server. 3. Через форму жалоб пригласите бота-администратора на свой публичный профиль. 4. Перехваченной сессией войдите в административную панель и заберите флаг. ## Теория Go `html/template` экранирует вывод контекстно: одно и то же значение по-разному обезвреживается в тексте страницы, в атрибуте и в скрипте. Для атрибута-ссылки шаблонизатор дополнительно применяет политику URL: он разбирает схему адреса и нейтрализует схемы, исполняющие код при переходе. Разработчик может неосознанно отключить эту проверку, пометив значение «уже безопасным URL» через собственную функцию шаблона. **Уязвимый паттерн:** ```go "safeURL": func(s string) template.URL { return template.URL(s) }, ``` Обёртка приводит строку к специальному типу «доверенный URL». Встретив такой тип в атрибуте ссылки, шаблонизатор пропускает проверку схемы: сохранённая пользователем ссылка с исполняющей схемой попадает в атрибут как есть и срабатывает при клике — в контексте сайта, с доступом к кукам через объект документа. ## Точка входа атаки `POST /profile/website` — форма редактирования поля «Website» (параметр `website`); результат виден на `GET /profile/{username}`. * **Обычный пользователь:** `demo` / `demo` * **Доставка боту:** `POST /report` — бот откроет адрес из жалобы и кликнет по ссылке из профиля * **Цель:** `GET /admin` — панель администратора с флагом * **Exploit Server:** адрес из панели лабы для приёма перехваченных данных

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

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

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

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

+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