前言
Magento 是当前网络上最受欢迎的电子商务解决方案之一,截至2023年末,全球超过 140000 个 Magento 实例正在运行。2024年6月11日,Adobe 发布的安全公告指出,Adobe Commerce/Magento 存在一个严重的未经认证的 XML 实体注入问题(CVE-2024-34102),其 CVSS 评分高达 9.8,充分表明了这一漏洞的极端危急性。
为了深入了解此漏洞的危害性,本文将对其进行全面分析,并构建概念验证工具(PoC)来验证漏洞的实际可利用性。通过这种方式,将详细揭示漏洞的潜在影响及可能带来的安全风险,为读者提供深入的理解,帮助其在实际应用中采取有效的防护措施。
该漏洞的严重性主要体现在以下几个方面:
- 敏感信息泄露:攻击者能够从 Magento 中提取包含用于签署 JWT 的加密密钥的 app/etc/env.php 文件。这一泄露使得攻击者有能力伪造管理员 JWT,从而以管理员身份滥用受影响实例的 Magento API。
- 远程代码执行的风险:此漏洞可以与近期涉及 PHP 过滤器链的研究结合利用,从而通过 CVE-2024-2961 漏洞实现远程代码执行(RCE)。对此,应特别感谢 Charles Fol 的贡献。
- 广泛的影响:攻击者通过利用 XXE 漏洞,能够提取任何本地文件或远程 URL 的内容,造成严重的安全隐患。
为了进一步了解未打补丁版本的 Magento 与已打补丁版本之间的关键差异,从 Magento GitHub 仓库下载了未打补丁的 magento2-2.4.7.zip 和已打补丁的 magento2-2.4.7-p1.zip 文件。通过解压这些文件并在两个目录上运行 DiffMerge,发现了关于该漏洞的重要线索:
2.4.7-p1 中的新增更改
通过公开信息,清楚地意识到该漏洞与实例化 SimpleXMLElement 类有关。PHP 对该类的文档显示,dataIsURL 是可以传递给 SimpleXMLElement 构造函数的参数,允许从外部源加载 XML。单独阻止 dataIsURL 并不足以解决问题,因为该漏洞在没有此限制的情况下同样可以被利用。缓解措施则集中在阻止关键字 sourceData。基于这些信息,花费大量时间搭建 Magento 的开发环境,并寻找能够引导实例化带有可控参数的 SimpleXMLElement 的反序列化工具。
在处理复杂的反序列化问题时,强烈建议建立一个可以通过设置断点调试代码的开发环境。针对 Magento 2,使用了包含 XDebug 的 Docker 镜像,并为 PhpStorm 配置了相应的设置。在启动 Docker 镜像后,可以使用以下命令安装并填充 Magento 示例数据:
./scripts/composer create-project --repository-url=https://repo.magento.com/magento/project-community-edition=2.4.7 /home/magento#2.4.7是漏洞版本
./scripts/magento setup:install --base-url=http://magento2.test/ --db-host=mysql --db-name=magento_db --db-user=magento_user --db-password="PASSWD#" --admin-firstname=admin --admin-lastname=admin --admin-email=admin@admin.test --admin-user=admin --admin-password=admin1! --language=en_US --currency=USD --timezone=America/Chicago --use-rewrites=1 --search-engine opensearch --opensearch-host=opensearch --opensearch-port=9200
./scripts/magento sampledata:deploy
./scripts/magento setup:upgrade
在 Magento 2 的代码库中搜索 Simplexml\Element.*sourceData 时,确定了以下几个可能的攻击目标位置:
~/Downloads/magento2-2.4