XXE - XEE - XML External Entity
Основи XML
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" > ]>
Основні атаки
Тест нової сутності
У цій атакі я перевірю, чи працює просте оголошення нової СУТНОСТІ.
Читання файлу
Спробуємо прочитати /etc/passwd
різними способами. Для Windows ви можете спробувати прочитати: C:\windows\system32\drivers\etc\hosts
У цьому першому випадку зверніть увагу, що SYSTEM "**file:///**etc/passwd" також працюватиме.
Цей другий випадок може бути корисним для вилучення файлу, якщо веб-сервер використовує PHP (не випадок лабораторій Portswiggers)
У цьому третьому випадку зверніть увагу, що ми оголошуємо Element stockCheck
як ANY
Список каталогів
У додатках на основі Java можливо переглянути вміст каталогу через XXE за допомогою такого завантаження (просто запитуючи каталог замість файлу):
SSRF
XXE може бути використаний для зловживання SSRF в хмарі
Сліпий SSRF
Використовуючи раніше згадану техніку, ви можете змусити сервер звертатися до сервера, яким ви керуєте, щоб показати його вразливість. Але, якщо це не працює, можливо, це через те, що XML-сутності не дозволені, у цьому випадку ви можете спробувати використати XML-параметричні сутності:
"Сліпий" SSRF - Виведення даних за межі зв'язку
У цьому випадку ми змусимо сервер завантажити новий DTD зі злоякісним навантаженням, яке відправить вміст файлу через запит HTTP (для файлів з кількома рядками ви можете спробувати вивести його через _ftp://_ використовуючи цей базовий сервер, наприклад xxe-ftp-server.rb). Це пояснення базується на лабораторії Portswigger тут.
У злоякісному DTD, наведеному нижче, проводиться серія кроків для виведення даних:
Приклад злоякісного DTD:
Структура наступна:
Кроки, виконані цим DTD, включають:
Визначення Параметричних Сутностей:
Створюється XML параметрична сутність,
%file
, яка читає вміст файлу/etc/hostname
.Інша XML параметрична сутність,
%eval
, визначається. Вона динамічно оголошує нову XML параметричну сутність,%exfiltrate
. Сутність%exfiltrate
встановлюється для виконання HTTP-запиту на сервер атакуючого, передаючи вміст сутності%file
у рядку запиту URL.
Виконання Сутностей:
Використовується сутність
%eval
, що призводить до виконання динамічного оголошення сутності%exfiltrate
.Потім використовується сутність
%exfiltrate
, що викликає HTTP-запит на вказаний URL із вмістом файлу.
Атакуючий розміщує цей шкідливий DTD на сервері під своїм контролем, зазвичай за URL-адресою, наприклад, http://web-attacker.com/malicious.dtd
.
XXE Payload: Для експлуатації вразливої програми атакуючий надсилає XXE навантаження:
Цей вразливий код визначає XML параметричний об'єкт %xxe
та включає його в DTD. При обробці XML-аналізатором цей код витягує зовнішній DTD з сервера зловмисника. Потім аналізатор інтерпретує DTD в режимі реального часу, виконуючи кроки, вказані в шкідливому DTD, що призводить до витікання файлу /etc/hostname
на сервер зловмисника.
Основано на помилках (Зовнішній DTD)
У цьому випадку ми змусимо сервер завантажити шкідливий DTD, який покаже вміст файлу у повідомленні про помилку (це працює лише в разі, якщо ви можете бачити повідомлення про помилку). Приклад тут.
Помилка розбору XML, яка розкриває вміст файлу /etc/passwd
, може бути викликана за допомогою шкідливого зовнішнього визначення типу документа (DTD). Це досягається за допомогою наступних кроків:
Визначається XML параметричний об'єкт з ім'ям
file
, який містить вміст файлу/etc/passwd
.Визначається XML параметричний об'єкт з ім'ям
eval
, який включає динамічне визначення для іншого XML параметричного об'єкта з ім'ямerror
. Цей об'єктerror
, при оцінці, намагається завантажити неіснуючий файл, включаючи вміст об'єктаfile
як його ім'я.Викликається об'єкт
eval
, що призводить до динамічного визначення об'єктаerror
.Викликання об'єкта
error
призводить до спроби завантажити неіснуючий файл, що призводить до повідомлення про помилку, яке містить вміст файлу/etc/passwd
як частину імені файлу.
Шкідливий зовнішній DTD можна викликати за допомогою наступного XML:
Після виконання відповідь веб-сервера повинна містити повідомлення про помилку, яке відображає вміст файлу /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 наступного вигляду:
Вказані кроки виконуються цим 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
.
Якщо ця техніка використовує внутрішній DTD, спочатку потрібно знайти дійсний. Це можна зробити, встановивши той самий OS / Software, який використовує сервер, і пошукавши деякі типові DTD, або отримавши список типових DTD всередині систем та перевірити, чи існує хоча б один з них:
Для отримання додаткової інформації перевірте https://portswigger.net/web-security/xxe/blind
Пошук DTD всередині системи
У наступному чудовому репозиторії github ви можете знайти шляхи DTD, які можуть бути присутні в системі:
Крім того, якщо у вас є образ Docker системи жертви, ви можете використовувати інструмент з того ж репозиторію для сканування образу та знаходження шляху DTD, які присутні всередині системи. Прочитайте Readme репозиторію github, щоб дізнатися як.
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
, тощо), обслуговування як локальних, так і віддалених файлів.
Для можливості доступу до файлів всередині файлів PKZIP дуже корисно зловживати XXE через файли системи DTD. Перевірте цей розділ, щоб дізнатися, як зловживати файлами системи DTD.
Процес доступу до файлу всередині архіву PKZIP за допомогою протоколу jar включає кілька кроків:
Виконується HTTP-запит для завантаження zip-архіву з вказаного місця, наприклад,
https://download.website.com/archive.zip
.HTTP-відповідь, що містить архів, тимчасово зберігається на системі, зазвичай в місці, такому як
/tmp/...
.Потім архів розпаковується для доступу до його вмісту.
Читається конкретний файл всередині архіву,
file.zip
.Після виконання операції будь-які тимчасові файли, створені під час цього процесу, видаляються.
Цікавою технікою для переривання цього процесу на другому кроці є тримання відкритого підключення до сервера нескінченно довго при обслуговуванні файлу архіву. Інструменти, доступні в цьому репозиторії, можна використовувати для цієї цілі, включаючи сервер Python (slow_http_server.py
) та сервер Java (slowserver.jar
).
Запис файлів у тимчасовий каталог може допомогти збільшити іншу вразливість, яка включає трансверсал шляху (таку як локальне включення файлів, ін'єкція шаблонів, XSLT RCE, десеріалізація тощо).
XSS
DoS
Атака "Мільярд сміхів"
Атака Yaml
Квадратична атака на розпухання
Отримання NTML
На хостах Windows можливо отримати хеш NTML користувача веб-сервера, встановивши обробник responder.py:
і надсилаючи наступний запит
Приховані поверхні XXE
XInclude
При інтеграції даних клієнта в серверні XML-документи, такі як ті, що містяться в запитах SOAP на боці сервера, прямий контроль над структурою XML часто обмежений, що ускладнює традиційні атаки XXE через обмеження на зміну елемента DOCTYPE
. Однак атака XInclude
надає рішення, дозволяючи вставляти зовнішні сутності в будь-який елемент даних XML-документу. Цей метод ефективний навіть тоді, коли можна контролювати лише частину даних у створеному сервером XML-документі.
Для виконання атаки XInclude
потрібно оголосити простір імен XInclude
та вказати шлях до файлу для призначеної зовнішньої сутності. Нижче наведено лаконічний приклад того, як можна сформулювати таку атаку:
Перевірте https://portswigger.net/web-security/xxe для отримання додаткової інформації!
SVG - Завантаження файлів
Файли, які користувачі завантажують до певних додатків, а потім обробляються на сервері, можуть використовувати вразливості у способі обробки XML або файлів, що містять XML. Розповсюджені формати файлів, такі як офісні документи (DOCX) та зображення (SVG), базуються на XML.
Коли користувачі завантажують зображення, ці зображення обробляються або перевіряються на сервері. Навіть для додатків, які очікують формати, такі як PNG або JPEG, бібліотека обробки зображень сервера може також підтримувати зображення SVG. SVG, як формат на основі XML, може бути використаний зловмисниками для надсилання шкідливих зображень SVG, тим самим викриваючи сервер на вразливості XXE (зовнішні сутності XML).
Нижче показано приклад такої атаки, де зловмисне зображення SVG намагається прочитати системні файли:
Ще один метод полягає в спробі виконати команди через обгортку PHP "expect":
У обох випадках формат SVG використовується для запуску атак, які використовують можливості обробки XML програмного забезпечення сервера, що підкреслює необхідність надійної перевірки введених даних та заходів безпеки.
Перевірте https://portswigger.net/web-security/xxe для отримання додаткової інформації!
Зверніть увагу, що перший рядок прочитаного файлу або результату виконання з'явиться УСЕРЕДИНІ створеного зображення. Тому вам потрібно мати можливість отримати доступ до створеного SVG-зображення.
PDF - Завантаження файлу
Прочитайте наступний пост, щоб дізнатися, як використовувати XXE для завантаження файлу PDF:
pagePDF Upload - XXE and CORS bypassContent-Type: Від x-www-urlencoded до XML
Якщо запит POST приймає дані у форматі XML, ви можете спробувати використати XXE в цьому запиті. Наприклад, якщо звичайний запит містить наступне:
Тоді ви, можливо, зможете надіслати наступний запит з таким самим результатом:
Content-Type: Від JSON до XEE
Для зміни запиту ви можете використати розширення Burp під назвою "Content Type Converter". Тут ви можете знайти цей приклад:
Інший приклад можна знайти тут.
WAF & Захист від обхіду
Base64
Це працює лише у випадку, якщо сервер 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.
Файл:/ Протокол 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 повинні бути числовими (як у цьому прикладі тут).
Приклад DTD:
Обгортки PHP
Base64
Видобути index.php
Видобуток зовнішнього ресурсу
Віддалене виконання коду
Якщо модуль PHP "expect" завантажений
SOAP - XEE
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).
Аналіз сліпого запиту
Запит надсилається на сервер із наступним вмістом:
Проте цей запит спричинює внутрішню помилку сервера, зокрема зазначаючи проблему з оголошенням розмітки:
Незважаючи на помилку, на Burp Collaborator зафіксовано попадання, що свідчить про певний рівень взаємодії з зовнішньою сутністю.
Витік даних поза межами каналу Для витікання даних відправляється змінений запит:
Цей підхід показує, що User Agent вказує на використання Java 1.8. Відомим обмеженням цієї версії Java є неможливість отримання файлів, що містять символ нового рядка, таких як /etc/passwd, за допомогою техніки Out of Band.
Екстракція даних на основі помилок Для подолання цього обмеження використовується підхід на основі помилок. Файл DTD має таку структуру, щоб викликати помилку, яка включає дані з цільового файлу:
Сервер відповідає помилкою, важливо відображаючи неіснуючий файл, що вказує на те, що сервер намагається отримати доступ до вказаного файлу:
Щоб включити вміст файлу у повідомлення про помилку, файл DTD налаштовується:
Ця модифікація призводить до успішного витікання вмісту файлу, оскільки він відображається в вихідних даних про помилку, відправлених через HTTP. Це свідчить про успішну атаку XXE (зовнішні сутності XML), використовуючи як техніки Out of Band, так і на основі помилок, для вилучення чутливої інформації.
RSS - XEE
Дійсний XML у форматі RSS для використання уразливості XXE.
Ping back
Простий HTTP-запит на сервер зловмисника
Прочитати файл
Читання вихідного коду
Використання фільтра PHP base64
Java XMLDecoder XEE до RCE
XMLDecoder - це клас Java, який створює об'єкти на основі XML-повідомлення. Якщо зловмисний користувач може змусити додаток використовувати довільні дані при виклику методу readObject, він миттєво отримає виконання коду на сервері.
Використання Runtime().exec()
ProcessBuilder
ProcessBuilder
Інструменти
Посилання
Вилучення інформації через HTTP за допомогою власного зовнішнього DTD: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/\
Last updated