Перейти к содержимому
← Каталог php XSS

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

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

mediumphpPro
Задача
# XSS в атрибуте: опасная URL-схема ## Сценарий Перед вами PHP-приложение интернет-магазина SecureShop. У каждого пользователя в профиле есть поле «Website» — место для ссылки на личный сайт. На публичной странице профиля приложение рендерит эту ссылку в виде кликабельного `<a>`-элемента: значение из поля Website попадает в атрибут `href`, текст ссылки — в содержимое. В PHP-шаблонах традиционно используют `htmlspecialchars()` для экранирования спецсимволов (`<`, `>`, `"`, `&`) при выводе в HTML. Это защищает от классической «вставить тег внутрь HTML-разметки» XSS. Но **HTML-контекст значения** имеет значение: то, что попадает в **URL-атрибут** (`href`, `src`), интерпретируется браузером не как текст, а как URL — и в URL есть свой набор «опасных» конструкций, которые HTML-экранирование не нейтрализует. В частности, в HTML-стандарте есть URL-схемы, при клике на которые браузер не переходит на ресурс, а **исполняет содержимое URL как код** в контексте текущей страницы — без перехода куда-либо. Если приложение принимает значение поля «Website» как есть и кладёт его в `href`, обычный пользователь может сохранить в своём публичном профиле такой URL, и любой посетитель его профиля, кликнувший по ссылке, выполнит JavaScript в собственном браузере. В сочетании с формой «Report to Admin» (бот-администратор открывает присланную ссылку и взаимодействует со страницей в авторизованной сессии) это даёт классический канал кражи административной сессии и эскалации до админских прав, под которыми приложение и отдаёт CTF-флаг. ## Цели 1. Найдите поле в профиле, значение которого выводится в `href` атрибуте ссылки на публичной странице профиля. Подтвердите, что HTML-сущности из этого значения экранируются (или нет), но **выбор URL-схемы** значения никак не валидируется. 2. Подберите URL-схему, при которой клик по ссылке вызовет исполнение JavaScript в браузере посетителя страницы профиля. Соберите payload, который из браузера жертвы доставит её сессионный идентификатор или содержимое защищённой страницы на ваш Exploit Server. 3. Доставьте администратора на свою публичную страницу профиля через форму отчёта; перехватите его сессию или содержимое страницы `/admin`; войдите от его имени в админский раздел и заберите CTF-флаг. ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` | | Целевая учётная запись | `admin` (пароль не известен — его не нужно угадывать) | | Endpoint профиля | `/profile` | | Форма обновления website | `/profile/website` | | Форма отчёта администратору | `/report` | | Админ-раздел | `/admin` | ## Подсказки по контексту - Шаблон `templates/profile.php` рендерит значение website в HTML, и стоит сравнить это с тем, как оно появляется в исходном коде страницы. - Auto-escape PHP-функций вроде `htmlspecialchars()` не закрывает все угрозы — для URL-контекста требуется отдельная проверка схемы. - Бот-администратор реально кликает по ссылке на странице, на которую его привели через отчёт. То есть payload должен сработать на этапе клика.
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru