内置账号密码登录
因为自己搭建的环境存在一些问题,可能是版本过高的原因,(奇奇怪怪的问题,用户没有权限),所以目前仅仅做概念性验证,对漏洞的原理进行分析。
在未登录的情况下访问接口 /smartbi/vision/RMIServlet
[img=720,321.312]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522682.png[/img]
[img=720,293.03225806451616]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522683.png[/img]
我们可以比较明显的看到对应的处理类 CheckIsLoggedFilter
smartbi.freequery.filter.CheckIsLoggedFilter#doFilter
[img=720,305.4193548387097]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522684.png[/img]
从这里开始可能就是要进行比较详细的分析,首先是判断请求的路径是不是/vision/RMIServlet 是的话进入这个分支,然后判断请求体中是不是有以 windowUnloading 开头的字符串,这个跟另一种绕过方式有关,这里先不做分析
[img=720,232.47285886610373]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522685.png[/img]
接下来依次判断是否有通过 POST 或者 GET 方法来获取参数 className methodName 如果没有的话,就对参数 encode 进行解码,对相关参数进行赋值
[img=720,289.5558223289316]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522686.png[/img]
这里有一个判断,对类和方法进行鉴权操作,如果是 true 就会继续判断是否登录,只需要满足 FilterUtil.needToCheck 返回 false 就可以
smartbi.util.FilterUtil#needToCheck
[img=720,306.4630225080386]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522687.png[/img]
我们就注意到从数据库登录的操作也是不需要鉴权就可以进行访问的
smartbi.usermanager.UserManagerModule
[img=720,159.25581395348837]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522689.png[/img]
smartbi.usermanager.UserManagerModule#loginFromDB
[img=720,75.42857142857143]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522690.png[/img]
smartbi.usermanager.SecurityServiceImpl#loginFromDB
[img=720,303.8961038961039]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522691.png[/img]
这里直接比较的是从数据库中查询出的密码,所以我们就可以直接利用内置的账号和 MD5密码登录
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
[img=720,144.85207100591717]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522692.png[/img]
[img=720,322.5058731401723]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522693.png[/img]
admin 也是可以登录成功的
[img=720,321.8757327080891]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522694.png[/img]
为什么不用原本的登录模式登录,首先原本的登录模式登录是不知道对应的账号和密码的其次我们再对原本的登录逻辑进行简单的分析
smartbi.usermanager.UserManagerModule#clickLogin
[img=720,190.4950495049505]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522695.png[/img]
smartbi.usermanager.UserManagerModule#login
[img=720,298.92857142857144]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522696.png[/img]
smartbi.usermanager.SecurityServiceImpl#login
[img=720,267.32099758648434]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522697.png[/img]
主要的处理登录逻辑在这一部分
smartbi.usermanager.SecurityServiceImpl#loginDB
[img=720,296.6237942122186]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522698.png[/img]
smartbi.usermanager.UserBO#isPasswordValidate
[img=720,408.70237437879626]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522699.png[/img]
这里在进行比较的时候
首先 String passwordInLib = this.user.getPassword(); 是从数据库中查找用户的密码,根据用户的密码开头的第一位字符,来进行处理比较
[img=720,284.94284158954815]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522700.png[/img]
我们已经知道数据库中对应的值是 0a 但是并没有任何一个值对应的 MD5 的值是a 所以正常无法登录内置用户
漏洞修复
http://192.168.222.133:18080/smartbi/vision/sysmonitor.jsp
[img=720,292.0220298977183]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522701.png[/img][img=720,336.09375]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522702.png[/img]
同样的 POC 已经无法利用成功了,我们关注一下修复的代码内容
[img=720,320.8756841282252]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202307251522703.png[/img]
更多网安技能的在线实操练习,请点击这里>>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |