#49 Bug Bounty v.2 — XML External Entity (XXE)
Здравствуйте, дорогие друзья.
XML External Entity (XXE) — это уязвимость, которая может возникнуть при синтаксическом анализе приложения XML. Прежде чем углубиться в изучение того, что такое XXE, вам необходимо сначала хорошо разобраться в XML.
Основы XXE
Расширяемый язык разметки (XML) — это язык, предназначенный для хранения и передачи данных, аналогичный JSON. Пример того, как выглядит XML, можно найти ниже:
<?xml version=»1.0″ encoding=»UTF-8″?>
<bookstore>
<book category=»cooking»>
<title lang=»en»>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category=»children»>
<title lang=»en»>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
В первой строке вы можете увидеть пролог, который содержит версию XML и кодировку. Совет профессионала, если вы когда-нибудь увидите это в burp, вам следует немедленно протестировать его на наличие XXE:
● <?версия xml=»1.0″, кодировка=»UTF-8″?>
Ниже вы увидите тег “<bookstore>”, который представляет корневой узел. Есть два дочерних узла, называемых “<book>”, и каждый из них содержит дочерние узлы, называемые
“<title>,<author>,<year>,<price>”.
<root>
<child>
<subchild>…..</subchild>
</child>
</root>
Это базовая структура XML, но вам следует знать немного больше. Существует так называемое определение типа документа (DTD), которое определяет структуру, а также юридические элементы и атрибуты XML-документа, как показано ниже:
<?xml version=»1.0″?>
<!DOCTYPE note [ <!ENTITY user «Timcore»>
<!ENTITY message «got em»> ]>
<test><name>&user;</name></test>
Как показано выше, существует нечто, называемое СУЩНОСТЬЮ. Оно действует как переменная. В этом примере сущность “user” содержит текст “Timcore”. Эту сущность можно вызвать, набрав “&user;”, и оно будет заменено текстом “Timcore”.
Вы также можете использовать так называемый внешний объект, который будет загружать свои данные из внешнего источника. Это можно использовать для получения содержимого из URL-адреса или файла на диске, как показано ниже:
<!DOCTYPE foo [ <!ENTITY ext SYSTEM «http://example.com» > ]>
<!DOCTYPE foo [ <!ENTITY ext SYSTEM «файл:///путь/к/файлу» > ]>
XML External Entity (XXE) Attack
Я упоминал, что вы можете использовать внешние объекты для извлечения данных из файла на диске и сохранения их в переменной. Что, если мы попытаемся прочитать данные из файла “/etc/passwd” и сохранить их в переменную? Обратите внимание, что для чтения данных в ответе должна быть возвращена сущность.
Зная это, давайте попробуем использовать нашу тестовую среду. Во время работы в burp я зафиксировал следующий POST-запрос, который, похоже, использует XML для отправки данных в серверную систему. Всякий раз, когда вы видите XML, вам следует проверять его на наличие XXE.
Чтобы проверить наличие XXE, просто введите свой вредоносный внешний объект и замените им значение каждого узла, как показано ниже:
Как показано выше, я создал внешнюю сущность для получения данных из файла /etc/passwd и сохранил их в сущности xxe. Затем я поместил переменную в узел <идентификатор продукта>. Если сервер не блокирует внешние объекты, ответ будет передан вам.
После этого вы сможете получить содержимое файла /etc/passwd, как показано выше.
Резюме
Большинство приложений передают данные с помощью JSON, но вы можете столкнуться с приложениями, использующими XML. При этом обязательно проверяйте наличие XXE. Использование этой уязвимости позволяет вам читать произвольные файлы, что может привести к полной компрометации компьютера.
На этом все. Всем хорошего дня!