OWASP Top 10: A4 XXE Атака внешнего объекта XML
Этичный Хакер
XML представляет собой полезный ресурс для отправки данных из службы в службу и для внутренней обработки данных, но с чем угодно, как только вмешивается пользовательский ввод, все становится опасным. Обработка этих файлов сопряжена с неотъемлемым риском из-за того, что XML-процессоры по умолчанию имеют включенные внешние объекты. Не все знают об этих настройках, что делает это потенциально опасным. Внешние объекты можно использовать для захвата файлов или даже выполнения кода. Излишне говорить, что мы не хотим, чтобы это произошло.
Что такое атака XXE?
Атака XXE происходит, когда злоумышленники отправляют данные в одном из форматов XML, которые они контролируют (например, загрузка XML, запрос SOAP или даже файл DOCX, который они могут загрузить, поскольку они состоят из документов XML после их извлечения). Злоумышленник может вставить то, что называется внешним объектом, в XML и вызвать этот объект в одном из узлов. Это может привести к тому, что система выполнит внешний объект и, например, выполнит код. Мы показали пример ниже:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY smbConf SYSTEM "file:///smb.conf"> ]>
<TestDocument>
<name>test</name>
<lastName>&smbConf<lastName>
Теперь я специально добавил внешний объект &smbConf во второй узел моего документа, поскольку хотел прояснить, что атаки XXE могут происходить в любом узле документа.

Типы атак XXE
- Извлечение файлов с помощью XXE
Как вы, возможно, заметили из примера, приведенного выше, существует две части атаки XXE для извлечения файлов, поскольку это был пример этого. Прежде всего, мы должны отметить включение внешнего объекта
<!DOCTYPE fakeDocType [ <!--ENTITY smbConf SYSTEM "file:///smb.conf"--> ]>
И, во-вторых, нам нужно включить этот объект в один из узлов документа.
<lastName>&smbConf</lastName>
Атакующий XML содержит внешний объект с именем smbConf, который попытается получить файл конфигурации smb. Как указывалось ранее, затем мы проверяем каждый возможный узел для этого внешнего объекта, чтобы увидеть, сможем ли мы захватить файл и отобразить его как злоумышленника.
- Выполнение SSRF-атак с использованием XXE
Другим потенциально опасным способом, которым XXE может повлиять на организацию, является выполнение SSRF-атаки с уязвимостью XXE. Когда это происходит, сервер вынужден выполнять HTTP-запрос от имени злоумышленника со всевозможными серьезными побочными эффектами.
Если мы хотим выполнить SSRF-атаку через XXE, нам нужно определить, какой URL-адрес мы хотим, чтобы сервер выполнил запрос, например, так:
<!DOCTYPE fakeDocType [ <!--ENTITY adminPanel SYSTEM "http://192.168.1.12/admin/"--> ]>
Как мы можем видеть в приведенном выше примере, процессор XXE выполнит запрос к серверу, работающему во внутренней сети, который содержит панель администратора, доступ к которой возможен только по внутренней сети. Теперь эта панель администратора может быть просмотрена злоумышленником с помощью SSRF. Однако, если данные не возвращаются, слепой SSRF все еще может быть возможен.
- Слепые атаки XXE
Так же, как и уязвимости blind SSRF, существуют уязвимости blind XXE. Внешний объект все еще может быть обработан, но это не означает, что он должен возвращать данные. Эти типы уязвимостей сложнее найти и использовать, но с помощью некоторых более креативных методов злоумышленники все равно могут находить и использовать эти проблемы.
- Определение местоположения скрытой поверхности атаки для атак XXE
Может показаться, что уязвимы только непосредственно контролируемые пользователем XML-файлы, но ничто не может быть дальше от истины! Злоумышленники могут использовать то, что известно как злоумышленники xinlcude. Именно здесь злоумышленники вставляют вектор атаки XXE в параметр, отличный от XML, и сервер позже объединит входные данные в XML-файл. Однако в этой ситуации вы можете только вставить свою строку атаки в XML-файл и не контролировать ее целиком, поэтому вам придется проявить творческий подход, поскольку вы не можете переопределить или изменить doctype. К счастью, спецификация XML приходит на помощь, поскольку мы можем использовать ее часть, называемую разделом xinlcude. Примером атаки xcinlcude может быть:
<fakeElement xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///smb"/></foo>
Как я могу обнаружить внешние объекты XML?
Мы должны использовать инструменты анализа исходного кода adept, которые будут сканировать наш код и сообщать нам о проблемах. Мы также должны отметить любую точку входа для файлов XML, таких как импорт файлов XML, загрузка файлов DOCX, загрузка изображений SVG и конечные точки SOAP. Мы должны убедиться, что протестировали все эти точки входа в XXE, и не ограничиваться только обычными проблемами XXE, которые мы знаем, но и искать слепые проблемы XXE, поскольку их сложнее тестировать и для них требуется другая стратегия. Нам нужно изучить все возможности, чтобы это включало все, что может содержать уязвимость, SAML, DTD, SOAP, ... а также тщательно протестировать эти конечные точки, убедившись, что они тестируются для каждого узла XML.
Если злоумышленник может контролировать только часть XML-документа, он должен стремиться протестировать атаки xinclude.
Сценарии атаки XXE
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE sshKey [<!ELEMENT sshKey ANY > <!ENTITY key SYSTEM "file:///.ssh/id_rsa" >]> <foo>&xxe;</foo>
Первый сценарий атаки, который мы хотим начать с злоумышленника, который хочет украсть закрытые SSH-ключи своей жертвы, поэтому они запускают атаку XXE с помощью внешнего объекта, который попытается захватить файл id_rsa у жертвы, который является их закрытым ключом, что позволяет им, возможно, создавать подключения к другим серверам, еслиони также могут получить файл known_hosts из папки .ssh, используя ту же технику.
В нашем втором сценарии атаки мы хотим посетить URL-адрес на веб-сервере, к которому можно подключиться только с хоста, находящегося в той же сети, чтобы предотвратить кражу хакерами конфиденциальных незащищенных данных, за которыми они охотятся. В этом примере это будет список данных кредитной карты.
<!DOCTYPE fakeDocType [ <!--ENTITY xxe SYSTEM "http://127.0.0.1/creditCards/"--> ]>
Веб-сервер содержит сам список, поэтому атаке SSRF даже не нужно пытаться достичь другого сервера, а вместо этого можно подключиться по IP-адресу обратной связи.
Все это хорошие теоретические примеры, но я считаю, что практические примеры и примеры из реальной жизни работают лучше всего, поэтому мы рассмотрим отчет CVE от CVE-2018-12463, который является более старым CVE, в котором описывается, как одна плохая реализация интерпретатора XML может вызвать серьезные проблемы. В этом случае уязвимость XXE привела к возможности чтения файлов и выполнения SSRF-атак от пользователя, не прошедшего проверку подлинности, что еще больше усугубляет эту уязвимость.
https://www.cvedetails.com/cve/CVE-2018-12463/
Даже крупные игроки с большими бюджетами не застрахованы от этой уязвимости, и это именно то, что IBM обнаружила в своем приложении WebSphere. Была обнаружена уязвимость XXE, которая позволяла злоумышленникам потреблять ресурсы и получать в свои руки конфиденциальные пользовательские данные. CVE-2021-20454 - отличный пример того, почему мы должны быть очень усердны в нашем тестировании XXE и, возможно, даже должны рассмотреть другие форматы данных, такие как JSON.
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-20454