Smartbi 远程代码执行漏洞复现(QVD-2025-31926)

1、 漏洞描述

近日,奇安信CERT监测到官方修复Smartbi 远程代码执行漏洞(QVD-2025-31926),该漏洞源于攻击者可通过默认资源ID绕过身份验证获取权限,配合后台接口实现远程代码执行,可能导致服务器被完全控制、数据泄露或业务系统沦陷。鉴于该漏洞影响范围较大,建议客户尽快做好自查及防护。

2、影响范围

影响版本

Smartbi <= 11.0.99471.25193

3、补丁分析

官网发布了新的补丁,我们可以从补丁入手,看他修复了什么

https://www.smartbi.com.cn/patchinfo

下载到的补丁是经过加密的

具体解密方法可参考:

Smartbi 最新认证绕过导致RCE漏洞分析

解密

下载为 jar 包:

7-31 的补丁内容:

找到漏洞路径/vision/share.jsp以及对应补丁代码

4、漏洞源码分析

这里获取一个资源ID resid,如果这个资源ID符合isPublicShareResourceByShareType ,不管当前会话是否已登录,都将当前用户切换为public用户

也就是说未登录的用户,访问资源时,会获得 public的权限。

注:

如果没有添加库,就会如下图所示,找不到对应的方法、类

如果要看到完整的代码,需要把 lib 库添加到项目结构中:

具体要添加的库:

E:\Smartbi\Tomcat\lib

E:\Smartbi\Tomcat\webapps\smartbi\WEB-INF\lib

这样就可以看到完整的源码了

接着上文,跟进 autoLoginByPublicUser

该方法的作用: 如果系统允许匿名访问,则使用内部 SERVICE 账户临时授权,把当前用户切换为 public 用户。

跟进 setCurrentUser,

跟进 switchUser

所以总结一下:我们需要找到一个资源 ID 符合 isPublicShareResourceByShareType,不管登录与否,都可以获得public用户的 session

跟进 isPublicShareResourceByShareType

跟进 shareRecord

shareRecord.getPublicshared()

shareRecord.getEnabled()

总结满足 isPublicShareResourceByShareType 的条件:

  1. relateid不为空
  2. shareType不为空
  3. shareRecord.getPublicshared() == 1表示公开分享
  4. shareRecord.getEnavled() == true
    1. deleted != 1分享不能被删除
    2. cancelled != 1分享不能被取消
    3. enddate == null为 null 就是永不过期

具体的构造需要找到对应的参数:

c_deleted!=1 and c_cancelled!=1 and c_publicshared=1

继续跟入loadByRelateid

根据 relateid 字段查询一条 ShareRecord 记录

去查找:“ShareRecord.getShareRecordByRelateid”

表名 :t_share_record

列名 : c_relateid

构造查询语句:

select c_relateid from t_share_record where c_deleted != 1 and c_cancelled != 1 and c_publicshared = 1

可能由于我没有安装演示库,导致什么都查不到

看其他师傅的文章里是可以查询到结果的

通过以上方法获取到有效 session 就可以在后台调用任意 js 代码达到远程代码执行的目的

由于我没有获得有效的 session,后续就不复现了,,

借用 @漫漫安全路 师傅的文章:

参考:

【已复现】Smartbi 远程代码执行漏洞(QVD-2025-31926)安全风险通告

Smartbi 最新认证绕过导致RCE漏洞分析

smartbi远程代码执行漏洞复现(QVD-2025-31926) - Zephyr07 - 博客园