(XXE) Внедрение внешних сущностей XML
В этом разделе мы объясним, что такое XXE (внедрение внешних сущностей XML), рассмотрим распространённые примеры, расскажем, как находить и эксплуатировать различные виды XXE-инъекций, и подытожим способы предотвращения атак XXE.
Что такое внедрение внешних сущностей XML (XXE)?
Внедрение внешних сущностей XML, также известное как XXE, — это уязвимость веб-безопасности, позволяющая злоумышленнику вмешиваться в обработку приложением XML-данных. Часто это позволяет просматривать файлы в файловой системе сервера приложения и взаимодействовать с любыми внутренними или внешними системами, к которым само приложение имеет доступ.
В некоторых ситуациях злоумышленник может эскалировать XXE-атаку до компрометации базового сервера или другой серверной инфраструктуры, используя уязвимость XXE для выполнения атак SSRF (подделка серверных запросов).
Лабораторные работы
Если вы уже знакомы с базовыми концепциями уязвимостей XXE и хотите попрактиковаться на реалистичных целевых системах с преднамеренными уязвимостями, вы можете получить доступ ко всем лабораторным работам в этой теме по ссылке ниже.
Как возникают уязвимости XXE?
Некоторые приложения используют формат XML для передачи данных между браузером и сервером. Такие приложения почти всегда используют стандартную библиотеку или платформенный API для обработки XML на сервере. Уязвимости XXE возникают потому, что спецификация XML содержит различные потенциально опасные возможности, и стандартные парсеры поддерживают эти возможности, даже если приложение обычно их не использует.
Внешние сущности XML — это разновидность пользовательских сущностей XML, значения которых загружаются извне DTD (Document Type Definition — определение типа документа), в котором они объявлены. Внешние сущности особенно интересны с точки зрения безопасности, поскольку позволяют определить сущность на основе содержимого файлового пути или URL.
Какие существуют типы атак XXE?
Существует несколько типов атак XXE:
Эксплуатация XXE для извлечения файлов, при которой внешняя сущность определяется как содержимое файла и возвращается в ответе приложения.
Эксплуатация XXE для выполнения атак SSRF, при которой внешняя сущность определяется на основе URL внутренней системы.
Эксплуатация «слепой» XXE для внеполосной эксфильтрации данных, при которой конфиденциальные данные передаются с сервера приложения на систему, контролируемую злоумышленником.
Эксплуатация «слепой» XXE для извлечения данных через сообщения об ошибках, при которой злоумышленник может вызвать сообщение об ошибке парсинга, содержащее конфиденциальные данные.
Эксплуатация XXE для извлечения файлов
Чтобы выполнить XXE-инъекцию, извлекающую произвольный файл из файловой системы сервера, нужно изменить отправляемый XML двумя способами:
Ввести (или отредактировать) элемент
DOCTYPE, который определяет внешнюю сущность, содержащую путь к файлу.Изменить значение данных в XML, которое возвращается в ответе приложения, чтобы использовать определённую внешнюю сущность.
Например, предположим, что приложение интернет-магазина проверяет наличие товара на складе, отправляя на сервер следующий XML:
Приложение не применяет специальных защит от XXE-атак, поэтому вы можете использовать уязвимость XXE для извлечения файла /etc/passwd, отправив следующую XXE-полезную нагрузку:
Эта XXE-нагрузка определяет внешнюю сущность &xxe;, значение которой — содержимое файла /etc/passwd, и использует сущность внутри значения productId. Это приводит к тому, что ответ приложения включает содержимое файла:
Эксплуатация XXE для выполнения атак SSRF
Помимо извлечения конфиденциальных данных, другой основной эффект атак XXE состоит в том, что их можно использовать для выполнения SSRF (подделка серверных запросов). Это потенциально серьёзная уязвимость, при которой серверное приложение можно заставить делать HTTP-запросы к любому URL, доступному серверу.
Чтобы эксплуатировать XXE-уязвимость для выполнения SSRF-атаки, нужно определить внешнюю XML-сущность, используя URL, на который вы хотите нацелиться, и использовать определённую сущность в значении данных. Если вы можете использовать сущность в значении, которое возвращается в ответе приложения, вы сможете видеть ответ от URL внутри ответа приложения и, таким образом, получить двустороннее взаимодействие с внутренней системой. Если нет, вы сможете выполнять только «слепые» SSRF-атаки (которые всё ещё могут иметь критические последствия).
В следующем примере XXE внешняя сущность заставит сервер выполнить внутренний HTTP-запрос к системе в инфраструктуре организации:
Слепые XXE-уязвимости
Многие случаи XXE-уязвимостей являются «слепыми». Это означает, что приложение не возвращает значения каких-либо определённых внешних сущностей в своих ответах, поэтому прямое извлечение серверных файлов невозможно.
«Слепые» XXE можно всё же обнаруживать и эксплуатировать, но для этого требуются более продвинутые техники. Иногда можно использовать внеполосные методы (out-of-band), чтобы обнаружить уязвимости и эксфильтровать данные. Также иногда можно вызвать ошибки парсинга XML, которые приводят к раскрытию конфиденциальных данных в сообщениях об ошибках.
Как найти скрытую поверхность атаки для XXE-инъекций
Поверхность атаки для уязвимостей XXE во многих случаях очевидна, поскольку обычный HTTP-трафик приложения включает запросы, содержащие данные в формате XML. В других случаях поверхность атаки менее заметна. Однако, если искать в нужных местах, вы найдёте поверхность атаки XXE в запросах, которые не содержат явного XML.
Атаки XInclude
Некоторые приложения принимают данные, отправленные клиентом, встраивают их на серверной стороне в XML-документ, а затем парсят документ. Примером этого является ситуация, когда клиентские данные помещаются в серверный SOAP-запрос, который затем обрабатывается серверной службой SOAP.
В этой ситуации вы не можете провести классическую XXE-атаку, поскольку вы не контролируете весь XML-документ и не можете определить или изменить элемент DOCTYPE. Однако вы можете использовать XInclude(XInclude — механизм включения частей документов XML). XInclude — часть спецификации XML, позволяющая собирать XML-документ из поддокументов. Вы можете поместить атаку XInclude в любое значение данных XML-документа, поэтому её можно выполнить в ситуациях, когда вы контролируете лишь один фрагмент данных, помещаемый в серверный XML-документ.
Чтобы выполнить атаку XInclude, необходимо сослаться на пространство имён XInclude и указать путь к файлу, который нужно включить. Например:
Атаки XXE через загрузку файла
Некоторые приложения позволяют пользователям загружать файлы, которые затем обрабатываются на сервере. Некоторые распространённые форматы файлов используют XML или содержат XML-подкомпоненты. Примеры форматов на основе XML — офисные форматы документов, такие как DOCX, и форматы изображений, такие как SVG.
Например, приложение может позволять загружать изображения и обрабатывать или проверять их на сервере после загрузки. Даже если приложение ожидает получить формат вроде PNG или JPEG, используемая библиотека обработки изображений может поддерживать изображения SVG. Поскольку формат SVG использует XML, злоумышленник может отправить вредоносное SVG-изображение и таким образом получить доступ к скрытой поверхности атаки уязвимостей XXE.
Атаки XXE через модифицированный тип содержимого
Большинство запросов POST используют тип содержимого по умолчанию, генерируемый HTML-формами, например application/x-www-form-urlencoded. Некоторые сайты ожидают получать запросы в этом формате, но допускают и другие типы содержимого, включая XML. Например, если обычный запрос содержит следующее:
То вы можете попробовать отправить следующий запрос с тем же результатом:
Если приложение допускает запросы, содержащие XML в теле сообщения, и парсит тело как XML, то вы можете получить доступ к скрытой поверхности атаки XXE, просто переформатировав запросы в XML.
Как находить и тестировать XXE-уязвимости
Подавляющее большинство XXE-уязвимостей можно быстро и надёжно обнаружить с помощью веб-сканера уязвимостей Burp Suite.
Ручное тестирование XXE-уязвимостей обычно включает:
Тестирование на извлечение файлов путём определения внешней сущности на основе известного системного файла и использования этой сущности в данных, которые возвращаются в ответе приложения.
Тестирование на «слепые» XXE-уязвимости путём определения внешней сущности на основе URL системы, которую вы контролируете, и мониторинга взаимодействий с этой системой. Для этой цели идеально подходит Burp Collaborator.
Тестирование на небезопасное включение пользовательских не-XML-данных в серверный XML-документ с помощью атаки XInclude, пытаясь извлечь известный системный файл.
Как предотвратить XXE-уязвимости
Практически все XXE-уязвимости возникают потому, что библиотека парсинга XML в приложении поддерживает потенциально опасные возможности XML, которые приложению не нужны и не предполагаются к использованию. Самый простой и эффективный способ предотвратить XXE-атаки — отключить эти возможности.
Обычно достаточно отключить разрешение внешних сущностей и поддержку XInclude. Это обычно можно сделать через параметры конфигурации или программно, переопределив поведение по умолчанию. Подробности о том, как отключить ненужные возможности, смотрите в документации к вашей библиотеке или API парсинга XML.
Last updated