XXE-ін'єкція
Завантажений XML-файл, що читає власні файли сервера.
Що таке XXE-ін'єкція?
XXE (ін'єкція зовнішніх сутностей XML) перетворює XML-парсер на інструмент читання файлів і підробки запитів. Зловмисник оголошує сутність SYSTEM у DOCTYPE, а парсер вставляє локальний файл або відповідь внутрішнього URL ще до того, як ваш код побачить документ. Тому це помилка конфігурації парсера, а не вхідних даних. Ви спрямуєте завантаження замовлення на закупівлю на file:///etc/passwd і прочитаєте цей файл у полі vendor, яке повертається у відповіді. Потім виправите виклик libxmljs.parseXml(..., { noent: true }) : відхилятимете оголошення DOCTYPE і сутностей, а XML розбиратимете з вимкненим розгортанням зовнішніх сутностей і DTD.
Що ви дізнаєтесь у XXE-ін'єкція
- Розпізнавайте XXE як помилку конфігурації парсера, а не вхідних даних
- Читайте XML-пейлоад і знаходьте оголошення сутності SYSTEM, яке робить його небезпечним
- Усвідомлюйте, що XXE не обмежується читанням локальних файлів і охоплює звернення до внутрішніх URL (SSRF)
- Застосовуйте виправлення на рівні парсера (вимикайте розгортання зовнішніх сутностей) і додавайте поверх нього заходи ешелонованого захисту
- Знайшовши небезпечний параметр в одному місці розбору XML, перевіряйте на нього всі інші такі місця
XXE-ін'єкція — Кроки навчання
-
Знайдіть функцію приймання
Brackwell Logistics дозволяє будь-якому зареєстрованому постачальнику подати замовлення на закупівлю, завантаживши його як XML-файл. Форма приймає документ, розбирає його на серверах Brackwell і повертає постачальника та суму. Боб відкриває функцію, щоб побачити, як вона поводиться, перш ніж за неї братися.
-
Де відбувається розбір
Увесь інтерес Боба до цієї сторінки зводиться до одного рядка.
-
Завантажте звичайне замовлення
Спершу подивіться, як функція працює штатно. Боб прикріплює звичайне замовлення на закупівлю й надсилає його. Вкладка «Network» («Мережа») у браузері записує запит і відповідь сервера — те, що розробник бачить у DevTools.
-
Що повернув парсер
Замовлення розібралося без помилок. Одна деталь у відповіді підказує Бобові, як атакувати цю функцію.
-
Почніть зі звичайного файлу
Боб відкриває звичайне замовлення на закупівлю у своєму редакторі. Поки що воно саме таке, яким здається: постачальник і сума, прості дані. XML дозволяє документові оголосити зовнішню сутність — іменований заповнювач, значення якого парсер бере з іншого місця. Боб якраз збирається додати таку сутність.
-
Озбройте файл
Боб додає DOCTYPE, який оголошує зовнішню сутність, що вказує на файл на диску, а потім спрямовує поле vendor на цю сутність. Файл усе ще розбирається як замовлення на закупівлю. Боб починає з файлу, який є в кожній системі Linux, щоб довести, що парсер узагалі розгортає таке посилання.
-
Сутність
Вистачило двох рядків.
-
Завантажте спеціально створений файл
Боб надсилає свій спеціально створений файл через ту саму функцію приймання. Для браузера це просто ще одне завантаження замовлення на закупівлю.
-
Файл повертається
Відповідь — це не ім'я постачальника, а файл паролів сервера: сервер прочитав його з диска й повернув прямо у звичайній відповіді на завантаження.
-
Перевірка знань
Охоплення стандартів безпеки
OWASP Top 10
- A02:2025 Security Misconfiguration
- A05:2021 Security Misconfiguration
CWE
- CWE-611 Improper Restriction of XML External Entity Reference
- CWE-918 Server-Side Request Forgery (SSRF)
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security