Руководство по XXE Injection. Часть 1
В данной статье пойдет речь об инъекции XXE. Читатели узнают о том, как правильно выполнить эту атаку и найти все возможные уязвимости системы.
Знакомство с XML
XML расшифровывается как «Extensible Markup Language», это самый распространенный язык для хранения и транспортировки данных. Он не содержит никаких предопределенных тегов, таких как <p>, <img> и т.д. Все теги определяются пользователем в зависимости от данных, которые они представляют, например. <адрес электронной почты></Почта>, <сообщение></сообщение>.
- Версия: указывает на то, какая версия стандарта XML используется.Допустимые значения: 1.0.
- Кодирование: указывает на кодировку, которая будет использоваться. Кодировка по умолчанию, используемая в XML, — это UTF-8.Допустимые значения: UTF-8, UTF-16, ISO-10646-UCS-2, ISO-10646-UCS-4, Shift_JIS, ISO-2022-JP, с ISO-8859-1 до ISO-8859-9, EUC-JP.
- Автономность: язык информирует парсер, если документ имеет какую-либо ссылку на внешний источник или есть какая-либо ссылка на внешний документ. Значение по умолчанию: отключено.Допустимые значения: включено, отключено.
Что такое Entity?
Подобно переменным в языках программирования, есть XML Entity. Это определенный способ представления данных, которые находятся внутри XML-документа. Существуют различные встроенные сущности («entities») в языке XML, такие как < и >, которые используются в различном большем или меньшем размере в языке XML. Все это метасимволы, которые обычно представлены с помощью сущностей, появляющихся в данных. Внешние сущности XML («XML external entities») — это сущности, расположенные вне DTD.
Внешняя сущность использует ключевое слово SYSTEM и указывает на URL-адрес, из которого должно быть загружено значение сущности. Например:
<!ENTITY ignite SYSTEM "URL">
В этом примере «Ignite» — это имя сущности, «SYSTEM» — это используемое ключевое слово, «URL» — это URL-адрес, который пользователь хочет получить, выполнив атаку XXE.
Что такое определение типа документа?
Определение типа документа («DTD» или «Document Type Definition») используется для объявления структуры XML-документа, типов значений данных, которые он может содержать, и т.д. DTD может присутствовать внутри XML-файла или находиться отдельно. Он объявляется в начале XML-строки с помощью <!DOCTYPE>.
Существует несколько типов DTD, и тот, который интересует читателей, — это внешние DTD.
- SYSTEM: Идентификатор системы позволяет пользователю указать внешнее расположение файла, содержащего объявление DTD.
<!DOCTYPE ignite SYSTEM "URL" [...] >
<!DOCTYPE raj PUBLIC "URL"
Как читатели могут увидеть, они начинаются с ключевого слова PUBLIC, за которым следует специализированный идентификатор. Публичные идентификаторы используются для идентификации записи в каталоге.
Знакомство с XXE
Атаки типа ХХE осуществляются на основании заявления в порядке разбора своего входного XML. В них входные данные XML, содержащие ссылку на внешнюю сущность, обрабатываются слабо настроенным синтаксическим анализатором XML. Как и в межсайтовом скриптинге (XSS), хакер пытается внедрить скрипты аналогичным образом: он вставляет их в XML-сущности, чтобы получить важную информацию о системе.
DTD же используется для объявления структуры XML-документа, типов значений данных, которые он может содержать, и т.д. DTD может присутствовать внутри XML-файла или находиться отдельно. Он объявляется в начале XML-строки с помощью <!DOCTYPE>.
Полезная нагрузка внешней сущности XML отправляется на сервер, а сервер пересылает эти данные синтаксическому анализатору XML, который анализирует XML-запрос и предоставляет серверу желаемый вывод. Затем сервер возвращает этот вывод злоумышленнику (схема представлена на фото).
Возможности и влияние атаки на систему
XML External Entity (XXE) представляет серьезную угрозу для компании или веб-разработчика. XXE всегда входил в ТОП-10 списка OWASP. Это распространенная уязвимость, так как многие веб-сайты используют XML в строках и при транспортировке данных, и если контрмеры не будут приняты, то их информация может быть скомпрометирована. Есть различные типы атак:
Оценка CVSS XXE составляет 7,5 балла, а степень угрозы атаки указана как средняя.
- CWE-611: Неверное ограничение внешней сущности XML.
- CVE-2019-12153: Локальный файл SSRF.
- CVE-2019-12154: Удаленный файл SSRF.
- CVE-2018-1000838: Атака «Billion Laugh».
- CVE-2019-0340: Проведение XXE с помощью загрузки файлов.
Проведение атаки XXE для выполнения SSRF
Подделка запросов на стороне сервера (SSRF) – это веб-уязвимость, при которой хакер вводит серверные HTML-коды, чтобы получить контроль над сайтом или перенаправить вывод на сервер злоумышленника. Типы файлов для проведения SSRF-атак следующие:
Локальные файлы
Это файлы, которые присутствуют на домене веб-сайта, такие как «robots.txt», «server-info.txt» и т.д. Итак, пользователь начнет использовать «bWAPP» с целью проведения атаки XXE на заданном уровне.
Теперь он запустит свой BurpSuite и произведет перехват после нажатия на кнопку «Any Bugs?». Получен следующий результат:
Пользователь видит, что фильтр не применяется, поэтому можно провести атаку XXE. Он отправляет запрос на ретранслятор и там будет выполнять свою атаку. Пользователь попытается узнать, какое поле является уязвимым или доступным для инъекции. В целом есть два нулевых поля, то есть «login» и «secret».
Итак, пользователь проверяет их следующим образом:
На вкладке «Repeater» пользователь отправляет запрос с настройками по умолчанию и будет наблюдать за выводом на вкладке «Response».
Там написано: «bee’s secret has been reset», так что кажется, что логин поддается инъекции. Стоит проверить это, изменив его со значения «bee», а затем отправив запрос.
Теперь пользователь снова откроет вкладку «Response» и будет наблюдать за выводом.
Там написано: «ignite’s secret has been reset», что дает пользователю понять, что логин является доступным для инъекции. Теперь он готов совершить свою атаку.
Когда пользователь уже знает, какое поле является доступным для инъекции, он попробует получить файл «robots.txt». Для этого он будет использовать следующую полезную нагрузку:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE reset [ <!ENTITY ignite SYSTEM "http://192.168.1.15/bWAPP/robots.txt"> ]> <reset><login>&ignite;</login><secret>Any bugs?</secret></reset>
Понимание полезной нагрузки
Пользователь объявил doctype с именем «reset», а затем внутри него объявил сущность с именем «ignite». Он использует системный идентификатор, а затем вводит URL-адрес, чтобы получить «robots.txt». Затем в логине пользователь вводит «& ignite;», чтобы добраться до желаемой информации.
После вставки вышеуказанного кода пользователь нажмет на кнопку «Send» и получит вывод, как показано ниже на вкладке «Response».
Как читатели могут увидеть в приведенном выше выводе, пользователь получил всю информацию, которая присутствует в «robots.txt». Это говорит ему о том, что SSRF локального файла возможен для осуществления с помощью XXE.
Итак, теперь надо понять, как все это сработало. Во-первых, пользователь ввел полезную нагрузку, и она была передана на сервер, и поскольку нет никаких фильтров, чтобы предотвратить XXE, сервер отправляет запрос XML-парсеру, а затем возвращает вывод анализируемого XML-файла. В этом случае «robots.txt» был получен злоумышленником с помощью XML-запроса.
Удаленные файлы
Это файлы, в которые злоумышленник внедряет удаленно размещенные вредоносные скрипты с целью получения доступа от имени администратора или другой важной информации. Пользователь попытается получить файл /etc/passwd, для чего введет следующую команду:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE reset [ <!ENTITY ignite SYSTEM "file:///etc/passwd"> ]><reset><login>&ignite;</login><secret>Any bugs?</secret></reset>
После ввода вышеуказанной команды, как только пользователь нажмет на кнопку «Send», ему будет доступен файл «passwd»!
Атака XXE Billion Laugh (DoS)
Эти атаки нацелены на XML-парсеры, в которых как хорошо сформированные, так и действительные XML-данные приводят к сбою системных ресурсов при анализе. Эта атака также известна как «XML-бомба» или «XML DoS». Прежде чем ее выполнить, стоит разузнать, почему она известна под именем «Billion Laugh».
«В первый раз, когда эта атака была осуществлена, злоумышленник использовал «lol» в качестве данных сущности и вызывал его несколько раз в нескольких следующих сущностях. Это заняло экспоненциальное количество времени, и его результатом стала успешная DoS-атака, приведшая к падению веб-сайта. Из-за использования «lol» и многократного его вызова, что привело к миллиардам запросов, атака получила название «Billion Laugh»».
Перед использованием полезной нагрузки нужно с ней детально ознакомиться.
В этом случае пользователь видит, что в 1 раз он объявил сущность с именем «ignite», а затем вызывает ее же в нескольких других сущностях, образуя таким образом цепочку обратных вызовов, которая перезагружает сервер. Во 2 раз он вызвал «entity &ignite 9»: пользователь вызвал (таким образом) «ignite 9» вместо просто «ignite», поскольку «ignite 9» вызывает «ignite 8», «ignite 8» вызывает «ignite 7» и так далее. Таким образом, выполнение запроса займет экспоненциальное количество времени, и в результате сайт будет сломан.
Вышеприведенная команда приводит к осуществлению DoS-атаки. Результат, который получил пользователь, следующий:
Теперь после ввода XML-команды пользователь не увидит никаких выходных данных в поле «Response», а также поле «bee» станет недоступным и будет полностью отключено.
Проведение атаки ХХЕ с помощью загрузки файлов
Атака XXE может быть выполнена с помощью метода загрузки файлов. Пользователь продемонстрирует это с помощью лаборатории порта Swigger «эксплуатируя атаку ХХЕ через загрузку изображения». Полезная нагрузка, которую он будем применять, следующая:
<?XML version="1.0" standalone="yes"?> <!DOCTYPE reset [ <!ENTITY xxe SYSTEM "file:///etc/hostname"> ] > <svg width="500px" height="500px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <text font-size="40" x="0" y="100">&xxe;</text> </svg>
Понимание полезной нагрузки: пользователь будет создавать файл SVG, так как только файлы изображений принимаются в области загрузки. Основной синтаксис SVG-файла приведен выше, и в нем человек добавил текстовое поле.
Пользователь сохранит приведенный выше код как «payload.svg». Теперь на Portswigger он перейдет на пост и комментарий, а затем добавит сделанную полезную нагрузку в поле «Аватар».