[Перевод] XXE: XML external entity
В этой статье мы объясним, что такое инъекция внешних сущностей XML, опишем некоторые общие примеры, поясним, как найти и использовать различные виды XXE-инъекций, а также обобщим, как предотвратить атаки с их помощью.
Что такое инъекция внешних сущностей XML?
Инъекция внешних сущностей XML (также известная как XXE) — это уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в обработку XML-данных приложением. Оно часто позволяет злоумышленнику просматривать файлы в файловой системе сервера приложений и взаимодействовать с любыми серверными или внешними системами, к которым может получить доступ само приложение.
В некоторых ситуациях злоумышленник может усилить атаку XXE для компрометации базового сервера или другой внутренней инфраструктуры, используя уязвимость XXE для выполнения атак подделки запросов на стороне сервера (SSRF).
Как же возникают уязвимости XXE?
Некоторые приложения используют формат XML для передачи данных между браузером и сервером. Приложения, выполняющие это, практически всегда используют стандартную библиотеку или API платформы для обработки XML-данных на сервере. Уязвимости XXE возникают из-за того, что спецификация XML содержит различные потенциально опасные функции, а стандартные анализаторы поддерживают эти функции, даже если они обычно не используются приложением.
Внешние сущности XML — это тип настраиваемой сущности XML, определенные значения которых загружаются из DTD-файлов, в котором они прописаны. Внешние сущности особенно интересны с точки зрения безопасности, поскольку позволяют определять сущность на основе содержимого пути к файлу или URL-адреса.
Какие типы атак XXE существуют?
- Использование XXE для извлечения файлов, где внешняя сущность, включающая содержимое файла, определяется и возвращается в ответе приложения.
- Использование XXE для выполнения атак типа SSRF, где внешняя сущность определяется на основе URL-адреса внутренней системы.
- Использование слепого извлечения информации XXE по управляющему каналу, где конфиденциальные данные передаются с сервера приложений в систему, которой управляет злоумышленник.
- Использование слепого XXE для возвращения данных из сообщений об ошибках, когда злоумышленник может вызвать сообщение об ошибке, содержащее необходимую информацию.
- Использование XXE для извлечения файлов
Чтобы выполнить атаку вида XXE-инъекция, которая извлекает произвольный файл из файловой системы сервера, необходимо изменить представленный XML одним из двух способов:
- Введите (или измените) элемент DOCTYPE, который определяет внешнюю сущность, содержащую путь к файлу.
- Измените значение данных в XML, возвращаемых в ответе приложения, чтобы использовать определенную внешнюю сущность.
Например, предположим, что приложение для покупок проверяет количество запасов продукта, отправляя на сервер следующий XML-код:
381
Приложение не защищено от атак XXE, поэтому можно использовать уязвимость XXE для получения файла /etc/passwd, отправив следующую конструкцию XXE:
]>
&xxe;
Эта структура XXE определяет внешнюю сущность &xxe, значение которой является содержимым файла /etc/passwd, и использует сущность со значением productId. Это приводит к тому, что ответ приложения включает содержимое файла:
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
В случае с реальными уязвимостями XXE часто будет присутствовать большое количество значений данных в представленном XML, любое из которых может быть использовано в ответе приложения. Для систематического тестирования уязвимостей XXE, как правило, необходимо будет проверить каждый узел данных в XML по отдельности, используя определенную сущность и посмотреть состояние ответа.
Помимо извлечения конфиденциальных данных, другой способ применения атак с помощью XXE заключается в том, что их можно использовать для подделки запросов на стороне сервера (SSRF).
Это потенциально серьезная уязвимость, с ее помощью серверное приложение может быть использовано для выполнения HTTP-запросов к любому URL-адресу, к которому сервер может получить доступ.
Чтобы использовать уязвимость XXE для выполнения атаки SSRF, необходимо определить внешнюю XML-сущность с помощью URL-адреса, к которому вы хотите обратиться, и использовать определенную сущность со значением данных. Если вы можете использовать определенную сущность со значением данных, которые возвращаются в ответе приложения, вы сможете просмотреть ответ из URL-адреса в ответе приложения и таким образом получить двустороннее взаимодействие с серверной системой. Если нет, то вы сможете выполнять только слепые атаки SSRF (которые также могут иметь критические последствия).
В следующем примере с использованием XXE внешняя сущность заставит сервер выполнить внутренний HTTP-запрос к внутренней системе в пределах инфраструктуры системы:
]>
Использование XXE для выполнения атак CSRF:
Многие виды уязвимостей XXE слепые. Это означает, что приложение не возвращает значения каких-либо определенных внешних сущностей в своих ответах, и поэтому прямой поиск файлов на стороне сервера невозможен.
Слепые уязвимости XXE по-прежнему могут быть обнаружены и использованы, но тут требуются более продвинутые методы. Иногда можно использовать внешние методы для поиска уязвимостей и их использования для эксфильтрации данных. Также иногда может вызывать ошибки синтаксического анализа XML, которые приводят к раскрытию конфиденциальных данных в сообщениях об ошибках.
Поиск и использование слепых уязвимостей XXE:
Возможность для атаки с помощью инъекции XXE очевидна во многих случаях, поскольку обычный HTTP-трафик приложения включает запросы, содержащие данные в формате XML. В других случаях возможность для атаки менее заметна. Однако если вы посмотрите в нужных местах, вы найдете возможность для атаки XXE в запросах, которые не содержат XML.
XInclude атаки
Некоторые приложения получают данные, отправленные клиентом, вставляют их на стороне сервера в XML-документ, а затем его анализируют. Примером этого может служить случай, когда клиентские данные помещаются в запрос SOAP бэкэнда, который затем обрабатывается службой SOAP бэкэнда.
В этом случае нельзя выполнить классическую атаку XXE, так как вы не контролируете весь XML-документ и поэтому не можете определить или изменить элемент DOCTYPE. Однако вместо этого вы можете использовать XInclude. XInclude является частью спецификации XML, которая позволяет создавать XML-документ из вложенных документов. Вы можете поместить атаку XInclude в любое значение данных в XML-документе, поэтому атака может быть выполнена в ситуациях, когда вы управляете только одним элементом данных, помещенным в XML-документ на стороне сервера.
Чтобы выполнить атаку XInclude, необходимо сослаться на пространство имен XInclude и указать путь к файлу, который требуется вовлечь. Например:
Некоторые приложения позволяют пользователям загружать файлы, которые затем обрабатываются на стороне сервера. Некоторые распространенные форматы файлов используют XML или содержат XML-подкомпоненты. Примерами XML-форматов являются форматы документов Office, такие как DOCX и форматы изображений, такие как SVG.
Например, приложение может разрешить пользователям загружать изображения и обрабатывать или проверять их на сервере после загрузки. Даже если приложение ожидает получить формат PNG или JPEG, используемая библиотека обработки изображений может поддерживать изображения SVG. Поскольку формат SVG использует XML, злоумышленник может отправить вредоносный образ SVG и таким образом получить возможность атаки уязвимостей XXE.
Использование XXE через загрузку файлов изображений:
Большинство запросов POST используют тип содержимого по умолчанию, созданный HTML-формами, такими как application/x-www-form-urlencoded. Некоторые сайты ожидают получения запросов в этом формате, но допускают другие типы содержимого, включая XML.
Например, если обычный запрос содержит следующее:
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
bar
Если приложение допускает запросы, содержащие XML в теле сообщения, и анализирует содержимое как XML, вы можете получить возможность для атаки XXE, просто переформатировав запросы для использования формата XML.
Как найти и проверить уязвимости XXE
Подавляющее большинство уязвимостей XXE можно быстро и надежно найти с помощью веб-сканера уязвимостей Burp Suite.
- Тестирование уязвимостей ХХЕ вручную, как правило, включает:
- Тестирование извлечения файлов путем определения внешней сущности на основе известного файла операционной системы и использования этого объекта в данных, возвращаемых в ответе приложения.
- Тестирование слепых уязвимостей XXE путем определения внешней сущности на основе URL-адреса системы, которой вы управляете, и мониторинга взаимодействия с этой системой. Клиент Burp Collaborator идеально подходит для этой цели.
- Тестирование на уязвимое включение пользовательских данных, отличных от XML, в серверный XML-документ с помощью атаки XInclude для попытки получения известного файла операционной системы.
Как предотвратить уязвимости XXE
Практически все уязвимости XXE возникают из-за того, что библиотека синтаксического анализа XML-приложения поддерживает потенциально опасные функции XML, которые приложению не нужны или не предназначены для использования. Самый простой и эффективный способ предотвратить атаки XXE — отключить эти функции.
Как правило, достаточно отключить разрешение внешних сущностей и отключить поддержку XInclude. Обычно это можно сделать с помощью параметров конфигурации или программного переопределения поведения по умолчанию. Дополнительные сведения об отключении ненужных возможностей см. в документации по библиотеке синтаксического анализа XML или API.
В качестве тренировочной площадки для проверки навыков эксплуатации таких уязвимостей вы можете воспользоваться специализированными лабораториями.
На DEDIC.SH доступны новейшие двухпроцессорные конфигурации выделенных серверов с процессорами Intel Scalable 2019 года:
- 2x Xeon Silver 4214 — суммарно 24 ядра
- 2x Xeon Gold 5218 — суммарно 32 ядра
- 2x Xeon Gold 6240 — конфигурация с 36 ядрами.
Стоимость сервера с двумя Xeon Silver 4214 — от 15210 руб/мес
Мы так же готовы собрать для Вас любую конфигурацию — напишите нам!
Если большие мощности выделенного сервера не требуются — VDS от 150 руб/мес — то, что вам нужно!