Smartbi 最新漏洞+后利用打入内存马(手把手叫你如何仅仅从漏洞消息到分析 0day)
字数 1187 2025-09-01 11:25:53

Smartbi 未授权漏洞分析与内存马注入技术研究

一、漏洞概述

Smartbi 近期爆出一个前台未授权漏洞,该漏洞允许攻击者通过特定资源ID绕过身份验证,获取公共用户权限。结合历史后台RCE漏洞,攻击者可实现远程代码执行并注入内存马。

二、环境搭建

  1. 获取环境

    • 可从官网申请免费试用一个月
    • 下载后直接启动服务
    • 访问config.jsp进行初始配置
    • 配置完成后访问index页面登录
  2. 版本处理

    • 如需分析老版本漏洞,可通过系统监控加载老版本patch替换新版本文件

三、漏洞分析

1. 补丁分析

  1. 获取补丁

    • 从官方获取最新补丁文件
    • 补丁文件通常加密,需寻找解密流程
  2. 解密过程

    • 定位补丁解密机制
    • 解密后得到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. 漏洞验证

  1. 未授权访问

    • 退出登录状态
    • 直接访问share.jsp接口(接收resid参数)
    • 成功访问证明存在未授权漏洞
  2. 资源ID获取

    • 系统使用内置数据库,表结构未知
    • 可尝试创建资源并分享,获取其ID
    • 通过数据库查询定位resid字段

四、漏洞利用

1. 获取有效Cookie

  1. 利用流程

    • 使用有效resid访问接口
    • 系统返回有效cookie
    • 该cookie会将当前用户切换为public用户
  2. 代码分析

关键认证代码:

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

  1. 历史漏洞利用

    • 获取有效cookie后,可结合历史后台RCE漏洞执行命令
    • 通过特定接口实现远程代码执行
  2. 回显构造

    • 方法一:利用scanner对象回显命令执行结果
    • 方法二:通过header回显
    • 方法三:构造错误页面回显(将错误信息替换为命令执行结果)

五、内存马注入

1. 注入原理

利用Spring工具类的反射功能:

  1. 获取当前线程的ClassLoader
  2. 准备加载恶意字节码
  3. 使用Base64编码传输二进制数据

2. 注入流程

  1. 获取关键类

    • 通过反射获取当前线程上下文
    • 定位ClassLoader
  2. 加载字节码

    • 将恶意class文件转为Base64
    • 通过反射机制动态加载
  3. 内存马驻留

    • 注入的代码在内存中运行
    • 不落盘,难以检测

六、防护建议

  1. 及时更新

    • 应用官方最新补丁
    • 定期检查系统更新
  2. 权限控制

    • 加强身份验证机制
    • 对敏感接口实施二次认证
  3. 监控措施

    • 部署行为监控系统
    • 对异常资源ID访问进行告警
  4. 代码审计

    • 定期进行安全审计
    • 检查权限验证逻辑

七、免责声明

本文档仅用于安全研究和技术交流目的。任何未经授权的攻击行为均属违法,传播、利用文中所述信息造成的任何后果均由使用者自行承担。

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