Старый 16.02.2011, 19:57   #1
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию Атака XXE (XML eXternal Entity)

«Новое – это хорошо забытое старое» мигом вспомнилась мне поговорка, когда при оценке защищенности очередного веб-приложения успешно прошла атака XXE. Немедленно захотелось написать об этом пару слов, ибо:
- XML-транспорт занял одно из доминирующих мест по распространенности в распределенных приложениях (в т.ч. клиент-серверных веб-приложениях, кстати);
- ни один из 5 запущенных сканеров (специально не поленился и проверил) эту, в принципе достаточно простую с технической точки зрения, уязвимость не нашел;
- ни разу не слышал от коллег упоминаний о нахождении и/или эксплуатации этой уязвимости.
Итак, к делу.
Уверен, что возможность внедрения выражений XPath, равно как и внедрения XML-тэгов ни для кого не является новостью. Это первое, с чего хочется начать проверять целевое приложение, использующее xml. Однако есть еще один вектор атаки, о нем подробнее.

Начнем издалека. Стандартом определены два уровня правильности документа XML:

1) Well-formed документ. Well-formed документ соответствует всем общим правилам синтаксиса XML, применимым к любому XML-документу. И если, например, начальный тег не имеет соответствующего ему конечного тега, то это неправильно построенный документ XML.
2) Valid документ. Valid документ дополнительно соответствует некоторым семантическим правилам. Это более строгая дополнительная проверка корректности документа на соответствие заранее определённым, но уже внешним правилам. Обычно такие правила хранятся в специальных файлах — схемах, где самым подробным образом описана структура документа, все допустимые названия элементов, атрибутов и многое другое.

Основные форматы определения правил валидности xml-документов – это DTD и XML Schema. Остановимся на DTD. Есть два варианта связать документ с его схемой: либо указать ссылку на схему, либо поместить схему прямо в сам xml-документ, в его начало. Вот два примера:

Код:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE order SYSTEM "order.dtd">
<order>
<product>1234</product>
<count>1</count>
</order>

<?xml version="1.0"?>
<!DOCTYPE order [
<!ELEMENT count (#PCDATA)>
<!ELEMENT product (#PCDATA)>
<!ELEMENT order (product, count)>
]>
<order>
<product>1234</product>
<count>1</count>
</order>
Кроме того, в xml есть такое понятие как внешние сущности (external entities). Их можно использовать, например, для добавления в xml-документ содержимого внешних файлов. Например, можно определить внешнюю сущность current-date:
Код:
<!ENTITY current-date SYSTEM "http://www.getcurrenttime.com/timestamp.xml">
и перенести логику по вычислению текущей даты и времени на внешний сервис. Соответственно, использовать можно так:

Код:
<?xml version="1.0"?>
<!DOCTYPE order [
<!ELEMENT count (#PCDATA)>
<!ELEMENT product (#PCDATA)>
<!ELEMENT date (timestamp)>
<!ELEMENT timestamp (#PCDATA)>
<!ELEMENT order (product, count)>
<!ENTITY current-date SYSTEM "http://www.getcurrenttime.com/timestamp.xml">
]>
<order>
<product>1234</product>
<count>1</count>
<date>&current-date;</date>
</order>
Теперь вернемся к парсерам. Парсеры бывают валидирующими и невалидирующими. Вот что сказано в стандарте [http://www.w3.org/TR/REC-xml#include-if-valid] по поводу поведения парсера при наличии в документе ссылок на внешние сущности:
«When an XML processor recognizes a reference to a parsed entity, in order to validate the document, the processor must include its replacement text. If the entity is external, and the processor is not attempting to validate the XML document, the processor may, but need not, include the entity’s replacement text…»
То есть валидирующий парсер обязан включить содержимое внешнего файла. Действительно, для того, чтобы проверить структуру документа, парсер должен разрешить все внешние связи. А вот невалидирующий может включить содержимое внешнего файла по желанию.
На этом месте все уже должны догадаться об атаке.
Если в POST-запросе передается xml, можно делать такое:

Код:
<!ENTITY xxe SYSTEM «file:///dev/random» >]><inpu>&xxe;</input>
Делаем DoS.

Код:
<!ENTITY xxe SYSTEM «file:///path-to-tomcat-application/WEB-INF/web.xml» >]><input>xxe;</input>
Включаем содержимое xml-файла. Валидирующий парсер, очевидно, по итогам разбора выдаст ошибку. Таким образом, этот трюк пройдет только с невалидирующим парсером. Плюс к этому, значение параметра, в который вы внедряете ссылку на внешнюю сущность, должно возвращаться обратно (иначе вы никак не получете содержимое вставленного файла).

Код:
<!ENTITY xxe SYSTEM «file:///etc/passwd» >]><input>&xxe;</input>
Включаем содержимое обычного файла. Тут все очень зависит от парсера и содержимого файла:
- есть парсеры, которые требуют, чтобы внешние файлы были well-formed xml-документами (самый неудобный случай);
- остальные парсеры требуют, чтобы итоговый документ был well-formed (очевидно). В этом случае в подключаемом файле не должны встречаться специсимволы xml, которые нарушат синтаксис документа. Соответственно, этот трюк может сработать даже с валидирующим парсером (структура документа же нарушится).

Кроме того, необходимыми условиями срабатывания атаки являются:
- парсер должен уметь разрешать ссылки на внешние сущности; для многих простых парсеров это условие не выполняется;
- парсер должен иметь настройки, позволяющие ему разрешать ссылки на внешние сущности; например, известный парсер xerces изначально имел «удобные» настройки по умолчанию, но с некоторой версии (вот бы узнать, с какой) они эти настройки изменили, так что теперь по умолчанию xerces не будет разрешать такие ссылки; зато libxml имеет «удобные» настройки по умолчанию до сих пор.

Ссылки по теме:
1. Первое упоминание об атаке: http://www.securityfocus.com/archive/1/297714 .
2. Отличная презентация с конференции OWASP AppSec Germany 2010: XML External Entity Attacks.
3. Еще одна прекрасная презентация по теме с конференции OWASP Poland 2010: XML DTD Attacks.

Автор статьи: Петухов Андрей
__________________
Мой блог: http://qwazar.ru/.
Qwazar вне форума   Ответить с цитированием
Старый 17.02.2011, 05:27   #2
Nightmare
Banned
 
Регистрация: 06.07.2010
Сообщений: 162
Репутация: 10
По умолчанию

Андрей Петухов, это шутка? Очень известный человек на ik450
Nightmare вне форума   Ответить с цитированием
Старый 17.02.2011, 09:56   #3
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Не шутка. Работает в МГУ, нормальный чел.
__________________
Мой блог: http://qwazar.ru/.
Qwazar вне форума   Ответить с цитированием
Старый 17.02.2011, 15:31   #4
asddas
 
Аватар для asddas
 
Регистрация: 04.08.2010
Сообщений: 153
Репутация: 161
По умолчанию

Советую больше обратить внимание на "Ссылки по теме", хороший материал.
asddas вне форума   Ответить с цитированием
Старый 09.02.2012, 12:42   #5
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

Я единственное до сих пор не понимаю- бинарный файл как то можно прочитать и использовать чтобы парсер xml не обращал внимание на его содержимое?
tex вне форума   Ответить с цитированием
Старый 09.02.2012, 12:53   #6
Beched
 
Регистрация: 06.07.2010
Сообщений: 396
Репутация: 118
По умолчанию

Цитата:
Сообщение от tex Посмотреть сообщение
Я единственное до сих пор не понимаю- бинарный файл как то можно прочитать и использовать чтобы парсер xml не обращал внимание на его содержимое?
Можно, хитровывернувшись.
//Или нельзя?
Обсуждалось вкратце на семинаре d0znpp, он предположил, что можно прочитать файл, содержащий xml-ошибку, если она логируется в html-encoded формате. Т.е. прочитать лог ошибку доступа к файлу.
Beched вне форума   Ответить с цитированием
Старый 09.02.2012, 13:11   #7
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

про пхп нашел что можно использовать враппер php://filter и в base64 конвертировать сразу, но как быть напрмер с java и его SAX
tex вне форума   Ответить с цитированием
Старый 09.02.2012, 16:30   #8
Lostnull
 
Регистрация: 15.01.2012
Сообщений: 64
Репутация: 5
По умолчанию

вот по теме интересная презентация http://www.safesoa.org/data/dc-15-Orrin-v2.pdf
Lostnull вне форума   Ответить с цитированием
Старый 10.02.2012, 13:16   #9
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Много писал на тему дополнительных вроперов
http://oxod.ru/?p=353

особо радует ldap:// в libwml+ldap perl
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 10.02.2012, 15:30   #10
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

ковырял приложение на jboss- на сколько я понял там враперы jar, resource, http, ftp и все вроде? ldap отсутствует
tex вне форума   Ответить с цитированием
Ответ

Метки
уязвимости, xml, xxe

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot