Contents
- 1 Что такое внедрение внешних сущностей XML?
- 2 Как возникают уязвимости XXE?
- 3 Какие существуют типы атак XXE?
- 4 Использование XXE для извлечения файлов
- 5 Использование XXE для проведения SSRF-атак
- 6 Слепые XXE-уязвимости
- 7 Поиск скрытой поверхности атаки для инъекции XXE
- 8 Как найти и протестировать уязвимости XXE
- 9 Как предотвратить уязвимости XXE
Что такое внедрение внешних сущностей XML?
Внедрение внешнего объекта XML (также известное как XXE) — это уязвимость веб-безопасности, позволяющая злоумышленнику вмешиваться в обработку XML-данных приложением. Это часто позволяет злоумышленнику просматривать файлы в файловой системе сервера приложений и взаимодействовать с любыми внутренними или внешними системами, к которым может получить доступ само приложение.
В некоторых ситуациях злоумышленник может эскалировать атаку XXE, чтобы скомпрометировать базовый сервер или другую внутреннюю инфраструктуру, используя уязвимость XXE для выполнения атак с подделкой запросов на стороне сервера (SSRF).
Лаборатории
Если вы уже знакомы с основными понятиями, лежащими в основе уязвимостей XXE, и просто хотите попрактиковаться в их эксплуатации на реальных, преднамеренно уязвимых целях, вы можете получить доступ ко всем лабораторным работам в этом разделе по ссылке ниже.
Как возникают уязвимости XXE?
Некоторые приложения используют формат XML для передачи данных между браузером и сервером. Приложения, которые делают это, практически всегда используют стандартную библиотеку или API платформы для обработки XML-данных на сервере. Уязвимости XXE возникают из-за того, что спецификация XML содержит различные потенциально опасные функции, а стандартные синтаксические анализаторы поддерживают эти функции, даже если они обычно не используются приложением.
Внешние XML-сущности — это тип пользовательских XML-сущностей, определенные значения которых загружаются извне DTD, в котором они объявлены. Внешние объекты особенно интересны с точки зрения безопасности, поскольку они позволяют определять объект на основе содержимого пути к файлу или URL-адреса.
Какие существуют типы атак XXE?
Существуют различные типы атак XXE:
- Использование XXE для извлечения файлов , где определяется внешний объект, содержащий содержимое файла и возвращаемый в ответе приложения.
- Использование XXE для выполнения SSRF-атак , когда внешний объект определяется на основе URL-адреса серверной системы.
- Эксплуатация скрытой эксфильтрации данных XXE вне полосы пропускания, при которой конфиденциальные данные передаются с сервера приложений в систему, контролируемую злоумышленником.
- Использование слепого XXE для извлечения данных с помощью сообщений об ошибках , где злоумышленник может вызвать сообщение об ошибке синтаксического анализа, содержащее конфиденциальные данные.
Использование XXE для извлечения файлов
Чтобы выполнить атаку с внедрением XXE, которая извлекает произвольный файл из файловой системы сервера, вам необходимо изменить отправленный XML двумя способами:
- Введите (или отредактируйте)
DOCTYPE
элемент, определяющий внешний объект, содержащий путь к файлу. - Отредактируйте значение данных в XML, которое возвращается в ответе приложения, чтобы использовать определенный внешний объект.
Например, предположим, что приложение для покупок проверяет наличие товара на складе, отправляя на сервер следующий XML-код:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
Приложение не обеспечивает особой защиты от атак XXE, поэтому вы можете использовать уязвимость XXE для извлечения /etc/passwd
файла, отправив следующую полезную нагрузку XXE:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
Эта полезная нагрузка 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-атак
Помимо извлечения конфиденциальных данных, другим основным воздействием атак XXE является то, что они могут использоваться для выполнения подделки запросов на стороне сервера (SSRF). Это потенциально серьезная уязвимость, из-за которой серверное приложение может выполнять HTTP-запросы к любому URL-адресу, к которому может получить доступ сервер.
Чтобы использовать уязвимость XXE для выполнения атаки SSRF , вам необходимо определить внешний XML-объект с помощью URL-адреса, на который вы хотите нацелиться, и использовать определенный объект в значении данных. Если вы можете использовать определенный объект в значении данных, возвращаемом в ответе приложения, вы сможете просмотреть ответ от URL-адреса в ответе приложения и, таким образом, получить двустороннее взаимодействие с серверной системой. Если нет, то вы сможете выполнять только слепые SSRF – атаки (которые все еще могут иметь критические последствия).
В следующем примере XXE внешний объект заставит сервер сделать внутренний HTTP-запрос к внутренней системе в инфраструктуре организации:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
Слепые XXE-уязвимости
Многие экземпляры уязвимостей XXE скрыты. Это означает, что приложение не возвращает значения каких-либо определенных внешних сущностей в своих ответах, поэтому прямой поиск файлов на стороне сервера невозможен.
Слепые XXE-уязвимости по-прежнему можно обнаружить и использовать, но требуются более продвинутые методы. Иногда вы можете использовать внеполосные методы, чтобы найти уязвимости и использовать их для кражи данных. И иногда вы можете инициировать ошибки синтаксического анализа XML, которые приводят к раскрытию конфиденциальных данных в сообщениях об ошибках.
Поиск скрытой поверхности атаки для инъекции XXE
Поверхность атаки для уязвимостей XXE-инъекций во многих случаях очевидна, поскольку обычный HTTP-трафик приложения включает запросы, содержащие данные в формате XML. В других случаях поверхность атаки менее заметна. Однако, если вы посмотрите в нужных местах, вы найдете поверхность атаки XXE в запросах, которые не содержат никакого XML.
XВключить атаки
Некоторые приложения получают данные, отправленные клиентом, встраивают их на стороне сервера в XML-документ, а затем анализируют документ. Пример этого возникает, когда данные, отправленные клиентом, помещаются во внутренний запрос SOAP, который затем обрабатывается серверной службой SOAP.
В этой ситуации вы не можете выполнить классическую XXE-атаку, потому что вы не контролируете весь XML-документ и поэтому не можете определить или изменить DOCTYPE
элемент. Тем не менее, вы могли бы использовать XInclude
вместо этого. XInclude
является частью спецификации XML, которая позволяет создавать XML-документ из вложенных документов. Вы можете поместить XInclude
атаку в любое значение данных в XML-документе, поэтому атаку можно выполнять в ситуациях, когда вы контролируете только один элемент данных, помещенный в XML-документ на стороне сервера.
Чтобы выполнить XInclude
атаку, вам нужно указать XInclude
пространство имен и указать путь к файлу, который вы хотите включить. Например:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
XXE-атаки через загрузку файлов
Некоторые приложения позволяют пользователям загружать файлы, которые затем обрабатываются на стороне сервера. Некоторые распространенные форматы файлов используют XML или содержат подкомпоненты XML. Примерами форматов на основе XML являются форматы офисных документов, такие как 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
<?xml version=”1.0″ encoding=”UTF-8″?><foo>bar</foo>
Если приложение допускает запросы, содержащие XML в теле сообщения, и анализирует содержимое тела как XML, то вы можете добраться до скрытой поверхности атаки XXE, просто переформатировав запросы для использования формата XML.
Как найти и протестировать уязвимости XXE
Подавляющее большинство уязвимостей XXE можно быстро и надежно найти с помощью веб-сканера уязвимостей Burp Suite .
Ручное тестирование на наличие уязвимостей XXE обычно включает:
- Тестирование извлечения файла путем определения внешнего объекта на основе известного файла операционной системы и использования этого объекта в данных, которые возвращаются в ответе приложения.
- Тестирование слепых XXE-уязвимостей путем определения внешнего объекта на основе URL-адреса системы, которую вы контролируете, и мониторинга взаимодействия с этой системой. Клиент Burp Collaborator идеально подходит для этой цели.
- Тестирование на уязвимость включения предоставленных пользователем данных, отличных от XML, в XML-документ на стороне сервера с использованием атаки XInclude для попытки извлечения известного файла операционной системы.
Примечание
Имейте в виду, что XML — это просто формат передачи данных. Убедитесь, что вы также тестируете любую функциональность на основе XML на наличие других уязвимостей, таких как XSS и SQL-инъекция . Вам может потребоваться закодировать полезную нагрузку с помощью escape-последовательностей XML, чтобы избежать нарушения синтаксиса, но вы также можете использовать это, чтобы запутать свою атаку , чтобы обойти слабые средства защиты.
Как предотвратить уязвимости XXE
Практически все уязвимости XXE возникают из-за того, что библиотека синтаксического анализа XML приложения поддерживает потенциально опасные функции XML, которые приложению не нужны или не собираются использоваться. Самый простой и эффективный способ предотвратить атаки XXE — отключить эти функции.
Как правило, достаточно отключить разрешение внешних сущностей и отключить поддержку XInclude
. Обычно это можно сделать с помощью параметров конфигурации или путем программного переопределения поведения по умолчанию. Обратитесь к документации по вашей библиотеке синтаксического анализа XML или API, чтобы узнать, как отключить ненужные возможности.