XML eXternal Entity (XXE) в Java

Современный XML очень мощен. Но его мощность таит в себе и угрозы. Не все знают, что парсинг внешнего XML внутри приложения может таить в себе различные опасности. Одна из таких угроз — XXE (XML eXternal Entity). Попробуем разобраться, что же из себя представляет эта угроза.

Стандарт XML определяет концепцию, называемую ENTITY. Она может быть разных типов, но нас в большей степени интересует тип SYSTEM, который позволяет получать доступ внешнему содержимому. Например, обратите внимание на этот XML:

Если мы попытаемся считать этот XML файл, то у нас в field1 будет содержимое файла “/etc/passwd”. Таким образом можно считать любой другой файл, к которому у приложения есть доступ.

В качестве наглядного примера попробуем реализовать эксплуатацию этой уязвимоста на Java. Реализуем всё в виде JUnit-теста. Заготовка будет выглядеть вот так:

Наш класс MyObject с аннотациями:

Мы будем использовать JAXB для считывания XML-файла. К счастью (или к сожалению), по умолчанию настройки парсера установлены такие, что считывание внешних сущностей не допускается, поэтому нам придётся включить их. Но я бы не стал надеяться на такие настройки в среде production, лучше отключать подобную возможность вручную в коде.

Для начала создадим временный файл и запишем туда секретное слово:

Теперь создадим XML:

Готовимся считывать XML, тут ничего экстраординарного:

По умолчанию поддержка внешних сущностей XML (XML External Entity) отключена, поэтому включаем её вручную

Считываем XML в MyObject:

Сравниваем значение field1 с секретным словом… О, ужас…

Конечный результат файла “XxeTest.java”:

Как видим, уязвимость эксплуатируется довольно легко, так что не забывайте отключать поддержку внешних сущностей для ваших парсеров XML:

Исходные коды на GitHub

Также не забывайте правильно очищать пароли из памяти в Java после использования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *