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

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

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

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

Автор: Hack & Fix
Освоишь: CSP nonceoutput escapingtemplate autoescape
Средне+60 XP ~25 мин php
CWE-79 · A03:2021 Pro
Обложка: XSS в HTML-атрибуте (Attribute Context) Обложка: XSS в HTML-атрибуте (Attribute Context)
Задача
# XSS в HTML-атрибуте ссылки профиля ## Сценарий «Сайтосбор» — маркетплейс цифровых товаров: мастера продают шаблоны и лендинги, а в профиле каждого указана ссылка «Мой сайт» на портфолио. Тимлид сообщества Ася Верховцева попросила вас разобраться с жалобами покупателей: после перехода по ссылкам из профилей мастеров у нескольких человек «слетала» сессия. Ася подозревает, что поле ссылки выполняет чужой код в браузере открывших профиль, и ждёт от вас подтверждения и оценки последствий. ## Цель 1. Сохраните в поле «Мой сайт» значение, которое при выводе в атрибут ссылки исполняет код в браузере посетителя: экранированный текст ссылки при этом не мешает. 2. Отправьте боту-администратору ссылку на свой публичный профиль через страницу отчёта и перехватите данные его сессии на своём сервере приёма. 3. Подмените свою сессию перехваченной и откройте профиль администратора или админ-панель — там отображается флаг. ## Теория Экранирование защищает только тот контекст, для которого создано. Текст ссылки преобразуется в безопасные сущности, но само значение попадает в атрибут навигации без обработки. Атрибут адреса — особый контекст: браузер интерпретирует его содержимое как ссылку, и у атакующего два пути — выйти за пределы атрибута через кавычку и дописать собственный элемент с обработчиком, срабатывающим при загрузке страницы, либо сохранить адрес с исполняемой при клике схемой вместо сетевой. **Уязвимый паттерн:** ```php <a href="<?= $user['website'] ?>" target="_blank" rel="noopener"><?= htmlspecialchars($user['website']) ?></a> ``` Механика атаки: значение сохраняется в профиле как обычная строка и доступно каждому посетителю публичной страницы профиля. Жертва открывает профиль — разметка с внедрённым кодом становится частью документа и исполняется с правами сессии жертвы, позволяя отправить её идентификатор сессии на подконтрольный атакующему приёмник. ## Точка входа атаки `POST /profile/website` — форма обновления профиля, поле `website`. `GET /users/{username}` — публичный профиль, на котором ссылка выводится. `POST /report` — поле `url`: ссылка, которую проверит бот-администратор. * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `???`

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

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

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

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

+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