XML – отличная технология, однако при неправильном использовании может быть небезопасной. Лично я считаю, что причиной «дырявости» XML является перегруженность сложными элементами, которые дают безграничные возможности, но с другой стороны становятся причиной появления разного рода уязвимостей, в том числе связанных с инъекциями.
XML – отличная технология, однако при неправильном использовании может быть небезопасной. Лично я считаю, что причиной «дырявости» XML является перегруженность сложными элементами, которые дают безграничные возможности, но с другой стороны становятся причиной появления разного рода уязвимостей, в том числе связанных с инъекциями.
Рисунок 1: Приложение XMLfuzz
Что такое «инъекционные» сущности
«Инъекционные» сущности позволяет злоумышленнику вставлять свой собственный код в XML-документы (используя встроенный механизм XML) и получать доступ к любым ресурсам. XML-сущности в формате &entityname; используются в качестве текстовых вставок. Например, если сущность &name; связана с текстом John, то при отображении документа вместо <doc>Hello &name;!</doc> мы увидим <doc>Hello John!</doc>. Этот пример - один из самых тривиальных.
Другой пример: использование сущностей SYSTEM (их еще называют внешними). Системная сущность объявляется в начале документа как часть секции DTD:
<!DOCTYPE document [
<!ENTITY entity-name SYSTEM "URI/URL">
]>
При обработке секции DTD, что является стандартным функционалом для большинства фреймворков, злоумышленник может получить доступ к любому файлу локальной системы и иногда даже выполнить произвольные HTTP-запросы к внутренним серверам. Как вы могли догадаться, подобные атаки могут привести к полному компрометированию целевой системы.
Обнаружение проблем, связанных с «инъекционными» сущностями
Поиск подобных проблем – относительно простой процесс. Мы просто создаем документ с секцией DTD, содержащей как минимум одну внешнюю сущность, а в теле документа пытаемся использовать имя сущности различными способами для получения желаемого эффекта. Например, документ, показанный ниже, в случае уязвимости удаленного сервера, потенциально можно использовать для чтения содержимого файла /etc/shadow.
<!DOCTYPE document [
<!ENTITY get SYSTEM "/etc/shadow">
]>
<name>&get;</name>
При тестировании более сложных XML-структур для того, чтобы обойти фильтры, необходимо не только изменять URI, на который указывает сущность, но и использовать сущность саму по себе или в комбинации с корректными данными внутри элементов или атрибутов элементов. Весь процесс перебора может занять много времени, особенно, если проверяются большие документы, и лучше поручить процесс поиска инъекций специальной программе.
Использование Xmlfuzz
Xmlfuzz – продвинутый XML тестировщик, использующий метод черного ящика (fuzzer). Вначале программа анализирует структуру XML документа, а затем пытается найти уязвимость при помощи перебора различных вариантов входных параметров, включая «инъекционные» XML-сущности. Вся структура документа обходится рекурсивно и в процессе внедряются куски данных, которые могут привести к возникновению аномалий.
Рисунок 2: Процесс поиска уязвимостей
Поиск происходит оперативно даже на больших документах и может быть повторен необходимое количество раз. Уже проверенные документы можно протестировать повторно для нахождения более интересных сценариев. На входы задается валидный HTTP запрос и XML-документ (в теле запроса). Дальше все происходит автоматически.
Более подробно о том, как пользоваться утилитой, можно ознакомиться в статье «Fuzzing XML» на сайте Websecurify Learning Portal.
Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!