PDA

Просмотр полной версии : XXE уязвимости


Paladin
19.11.2023, 20:51
https://forum.antichat.xyz/attachments/4931363/1700410180365.png

Привет уважаемые форумчане!
Перед тем, как мы начнем рассматривать очень интересную и сложную тему, мне бы хотелось сказать несколько слов. Меня можно поздравить, я перестал быть куратором курса WAPT. Буду теперь помогать студентам посредством написания статей и других бесполезных опусов, которые, надеюсь помогут им в освоении материала курса. В ходе учебы кураторы периодически снабжают учеников дополнительной литературой или ссылками на полезные источники. Часто они разрозненные, противоречивые и что самое ужасное - на басурманском языке, где ничего не понятно. Вот я и решил все, что написано на этих ресурсах испытывать на практике на нашей лаборатории и делится этими исследованиями. Вполне возможно, я собираюсь заниматься х@#%&й, но даже если и так, это в любой момент можно бросить и просто отдыхать. А вдруг кому-то пригодится! Теперь перейду непосредственно к теме статьи.
XXE
Когда я проходил курс WAPT, эта тема оставила неизгладимый отпечаток на моем сознании и стоило приличного количества волос, выдранных из ж0#@, ну в общем вы поняли. Эта тема стала одной из тех, которые вызвали наибольшее количество боли и уничтожила большое количество нервных клеток. Попробуем сегодня вместе на простом примере разобраться с этим типом уязвимости.

XML External Entity (XXE) – это тип атаки, использующий уязвимости в анализаторах XML. При атаке XXE можно внедрить специально созданный XML-контент в приложение, которое его обрабатывает. XXE позволяет определять объекты на основе содержимого URL-адреса или пути к файлу. Когда сервер считывает внедренную нагрузку XML, он анализирует внешний объект, объединяет его с окончательным документом и возвращает его пользователю с конфиденциальными данными внутри.

Как правило к XXE уязвимы приложения без надлежащей валидации входных данных, а также без отключенной обработки внешних сущностей в синтаксическом анализаторе XML. Однако многие XML парсеры уже имеют защиту от XXE атак.
ТИПЫ XXE
XXE атаки делятся на типы по принципу того, какой способ используется для доставки полезной нагрузки и какой импакт это несет атака при тестировании на проникновение. Существует 6 типов XXE атак:

1. Извлечение файлов – самое банальное применение, при котором мы можем извлекать файлы с целевого сервера

2. SSRF-Атаки – использование XXE-атак для выполнения атак типа SSRF(Server-Side Request Forgery)

3. Blind XXE – атака, при которой атакующий не получает ответ от сервера, с помощью которого можно понять уязвимо ли приложение к XXE-атакам

4. Инъекция через File Upload – атака, при которой атакующий загружает файл, содержащий XML компоненты

5. Billion Laughs – атака типа denial-of-service (DoS)

6. XInclude – атака с внедрением полезной нагрузки в оператор XInclude

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

Перейдем к практике. Мы имеем сайт, на котором написано, что он ждет XML.
https://forum.antichat.xyz/attachments/4931363/1700410390441.png

Изучим запрос к этому серверу. Запускаем Burp Suite и обновляем страницу, после чего смотрим перехваченный запрос.
https://forum.antichat.xyz/attachments/4931363/1700410457679.png

Не видим ничего такого, что напоминало бы нам формат XML. Ничего удивительного, XML разметка отправляется методом POST. Меняем метод запроса, для чего загоняем его в Repiter и в меню выбираем Changerequestmethod
https://forum.antichat.xyz/attachments/4931363/1700410548724.png

Теперь наш запрос имеет нужный метод, отправляем его
https://forum.antichat.xyz/attachments/4931363/1700410680716.png

Упс! Приложение начинает наглеть и требует нужный тег. Ну и как нам его найти? Тот, кто обучается на курсе может посмотреть видео к уроку и написать несложный скрипт на Python, который сгенерирует нужную нагрузку, благодаря которой мы вычислим нужный тег. Но мы сегодня рассмотрим самый простой способ – фаззинг.

Отправляем наш запрос в Intruder. И добавляем в наш запрос следующую разметку:



XXE

В качестве типа атаки выбираем Pitchfork, а в качестве словарей наш любимый directory-list-2.3-medium. Запускаем атаку и видим чудо. Надпись XXE прописалась в теге title. Значит через него и будем выводить нужную нам информацию.
https://forum.antichat.xyz/attachments/4931363/1700410775404.pngЧтение файлов
Для начала попробуем вывести один из системных файлов, например, /etc/passwd. Для этого создадим сущность title и делаем так, чтобы она вернула нам значение файла:

]>

&title;
https://forum.antichat.xyz/attachments/4931363/1700410857367.png

Класс!

Теперь хочу обратить ваше внимание на использование враппера file://. В принципе, в данном случае, мы могли его вообще не использовать и результат бы не поменялся:
https://forum.antichat.xyz/attachments/4931363/1700410942865.png

В некоторых случаях он необходим. Не нужно забывать, что в этом случае нам нужно задать абсолютный путь. Без враппера файл будет открываться из текущей директории.

Без враппера
https://forum.antichat.xyz/attachments/4931363/1700410991664.png

С враппером, без указания пути (Ничего нет)
https://forum.antichat.xyz/attachments/4931363/1700411029188.png

С враппером, с указанием пути
https://forum.antichat.xyz/attachments/4931363/1700411089543.pngЧтение файлов PHP
Если у нас есть нужда прочитать файл php, то здесь придется действовать несколько по-другому. Так как в коде php будет много всяких пробелов, тегов, переносов строк и прочей лабуды, мы не сможет прочитать его так, как рассмотрели выше. Например, файл index.php.
https://forum.antichat.xyz/attachments/4931363/1700411278143.png

Поэтому воспользуемся враппером php://

php://filter/read=convert.base64-encode/resource=index.php

Здесь мы конвертируем содержимое файла в base64 и потом спокойно его раскодируем:
https://forum.antichat.xyz/attachments/4931363/1700412088068.png

https://forum.antichat.xyz/attachments/4931363/1700412179527.pngRCE
Выполнение удаленных команд осуществляется при помощи враппера expect://

Для демонстрации этого примера воспользуемся одной из задач с платформы античат .

Как показано на скрине, команда id успешно выполнилась.
https://forum.antichat.xyz/attachments/4931363/1700412268124.pngOut-of-band
Бывают ситуации, когда XXE есть, а ответа мы никакого не получаем. Допустим в нашем примере нет никакого ответа от сервера, но мы догадываемся, что уязвимость присутствует. Это может говорить о том, что присутствует слепая XXE.

Вот пример того, как Out-of-band можно использовать для обнаружения слепых XXE-атак:

Предположим, что атакующий отправляет XML-файл, содержащий ссылку внешней сущности на контролируемый им URL, следующим образом:



]>

&title;

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

Если XXE-атака удалась, наш сервер получит отстук в виде GET запроса.

Для подобных целей нам не обязательно поднимать свой сервер, мы можем использовать Burp Collaborator, специальный инструмент Burp Suite, который нужен для отлова подобных слепых атак.

Сгенерируем ссылку в Burp Collaborator, вставим ее вместо http://xakep.com, у нас получится следующее:



]>

&title;

При отправке измененного запроса на сервер, тот начнет стучаться в наш Collaborator, в результате чего получаем отбивку о том, что запрос был, а значит XXE-атака сработала:
https://forum.antichat.xyz/attachments/4931363/1700412447768.png

Запросы прошли, значит XXE сработала

Пробуем прочитать файл. Создаем файл xxe.dtd куда прописываем следующий код



">

%eval;

%getdata;

А в запросе такую нагрузку

%xxe;]>
https://forum.antichat.xyz/attachments/4931363/1700412580478.pngКак видим, файл мы прочитали.
Ну вот в общем-то и все. До новых встреч!!!

Cruel Lord
27.11.2023, 11:29
Так вот кто такой Paladin оказывается) Спасибо за статью

boeng21
19.12.2023, 05:16
Объясните пожалуйста почему в некоторых случаях используются
foo, %, eval, &#x25?

Paladin
19.12.2023, 16:23
boeng21 сказал(а):

Объясните пожалуйста почему в некоторых случаях используются
foo, %, eval, &#x25?


Блин, нереально сложный вопрос. Я серьезно. Гуглить пробовали? Вот небольшая ссылочка, которая поможет понять некоторые моменты - XML External Entity - Payloads All The Things

Вообще foo используют все программисты, это метапеременная. Здесь это имя типа документа.
% - объявление сущности
&#х25 - объявление сущности внутри другой сущности, по сути это % в URL кодировке
eval - это имя сущности

aka 0vern0t
19.12.2023, 23:03
Хорошая статья