Smartbi 最新漏洞+后利用打入内存马(手把手叫你如何仅仅从漏洞消息到分析 0day)
字数 1187 2025-09-01 11:25:53
Smartbi 未授权漏洞分析与内存马注入技术研究
一、漏洞概述
Smartbi 近期爆出一个前台未授权漏洞,该漏洞允许攻击者通过特定资源ID绕过身份验证,获取公共用户权限。结合历史后台RCE漏洞,攻击者可实现远程代码执行并注入内存马。
二、环境搭建
-
获取环境:
- 可从官网申请免费试用一个月
- 下载后直接启动服务
- 访问config.jsp进行初始配置
- 配置完成后访问index页面登录
-
版本处理:
- 如需分析老版本漏洞,可通过系统监控加载老版本patch替换新版本文件
三、漏洞分析
1. 补丁分析
-
获取补丁:
- 从官方获取最新补丁文件
- 补丁文件通常加密,需寻找解密流程
-
解密过程:
- 定位补丁解密机制
- 解密后得到zip文件,包含明文patch和更新后的class文件
2. 漏洞原理
根本原因:系统权限验证机制缺陷,通过特定资源ID可绕过身份验证
关键参数:resid(资源ID)
漏洞接口:/smartbi/vision/createresource.jsp
示例请求:
http://localhost:18080/smartbi/vision/createresource.jsp?restype=themewizard&resid=THEME.demo2019.CSAC
3. 漏洞验证
-
未授权访问:
- 退出登录状态
- 直接访问share.jsp接口(接收resid参数)
- 成功访问证明存在未授权漏洞
-
资源ID获取:
- 系统使用内置数据库,表结构未知
- 可尝试创建资源并分享,获取其ID
- 通过数据库查询定位resid字段
四、漏洞利用
1. 获取有效Cookie
-
利用流程:
- 使用有效resid访问接口
- 系统返回有效cookie
- 该cookie会将当前用户切换为public用户
-
代码分析:
关键认证代码:
public boolean autoLoginByPublicUser() {
String userName = "public";
if (this.getUserByName(userName) == null) {
return false;
} else {
if (this.stateModule.getSystemId() == null) {
this.stateModule.setSystemId("DEFAULT_SYS");
}
IUser serviceUser = this.getUserById("SERVICE");
if (serviceUser == null) {
throw (new SmartbiException(UserManagerErrorCode.NOT_EXIST_USER)).setDetail("SERVICE");
} else if (this.stateModule.getCurrentUser() != null && this.stateModule.getCurrentUser().getId() == "PUBLIC") {
return true;
} else {
this.stateModule.setCurrentUser(serviceUser);
this.stateModule.removeSessionAttribute("SMARTBIX_STATE");
return this.switchUser(userName);
}
}
}
设置用户会话:
public void setCurrentUser(IUser user) {
this.getState().setUser(user);
this.setSessionAttribute("user", user == null ? null : user.getName());
this.updateSessionLocale(user);
}
2. 后台RCE
-
历史漏洞利用:
- 获取有效cookie后,可结合历史后台RCE漏洞执行命令
- 通过特定接口实现远程代码执行
-
回显构造:
- 方法一:利用scanner对象回显命令执行结果
- 方法二:通过header回显
- 方法三:构造错误页面回显(将错误信息替换为命令执行结果)
五、内存马注入
1. 注入原理
利用Spring工具类的反射功能:
- 获取当前线程的ClassLoader
- 准备加载恶意字节码
- 使用Base64编码传输二进制数据
2. 注入流程
-
获取关键类:
- 通过反射获取当前线程上下文
- 定位ClassLoader
-
加载字节码:
- 将恶意class文件转为Base64
- 通过反射机制动态加载
-
内存马驻留:
- 注入的代码在内存中运行
- 不落盘,难以检测
六、防护建议
-
及时更新:
- 应用官方最新补丁
- 定期检查系统更新
-
权限控制:
- 加强身份验证机制
- 对敏感接口实施二次认证
-
监控措施:
- 部署行为监控系统
- 对异常资源ID访问进行告警
-
代码审计:
- 定期进行安全审计
- 检查权限验证逻辑
七、免责声明
本文档仅用于安全研究和技术交流目的。任何未经授权的攻击行为均属违法,传播、利用文中所述信息造成的任何后果均由使用者自行承担。