如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。
免责声明
本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。
前言
起因是看到都在流传/jeecg-boot/jmreport/save?previousPage=xxx&jmLink=YWFhfHxiYmI=这个payload,便想着去看看是咋回事,大概率就是拦截器里面的token验证绕过,jmreport老版本下的很多接口都是未授权访问的,导致之前爆出了不少漏洞,后来加了token验证,查看代码后发现不止一个地方可以进行权限绕过。
代码分析
具体代码逻辑就在JimuReportTokenInterceptor这个类中,下断点进行调试分析,请求之前披露的漏洞路由/jeecg-boot/jmreport/queryFieldBySql。
首先判断是否有xss payload特征。
如果访问的路由是/jmreport/shareView/,直接返回true,放行。
如果访问的路由不是/jmreport/shareView/,则看这个访问的路由有没有JimuNoLoginRequired注解,有的话也直接返回true,放行。
再判断有没有token传入,并验证token的有效性。
这里没有传入正确的token,接着往下走,this.jimuReportShareService.isSharingEffective方法中判断访问的路由在不在getShareUrls方法返回的List中,如果不在直接返回false。
我们访问的路由不在这个list中,继续往下走,就直接判断有没有传入previousPage参数了,没有的话拦截器会返回false,提示“Token校验失败,无权限访问!”。
现在加上previousPage参数进行访问,这里就会调用到this.jimuReportShareService.isShareingToken方法,只要这个方法返回true,拦截器就会返回true,放行了。
这里再加上网传的payload中的参数jmLink=YWFhfHxiYmI=,给var3赋值后,进行2个判断,只要我们传入的token不存在数据库里,并且访问的路由不是以/jmreport/view开头,就会返回true。
根据上述的分析,不难发现,不仅仅是jmLink参数可以造成权限绕过,还有其他两处地方同样也可以造成权限绕过。
漏洞复现
网传的payload,是jmLink参数参数造成的权限绕过。至于其他两处位置就放在星球的分析文章中。
POST /jeecg-boot/jmreport/queryFieldBySql?previousPage=xxx&jmLink=YWFhfHxiYmI=&token=123123 HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)
Accept: */*
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: application/json
Cache-Control: no-cache
Pragma: no-cache
Host: 192.168.131.100:8088
Content-Length: 21
{"sql":"select '1' "}
结语
虽然能实现权限绕过了,但上述的几种权限绕过方式只限于/jmreport下的路由,并且之前爆出来的rce的漏洞,官方也已经进行了修复,有权限访问的情况下也无法用之前的payload进行rce了。
版权归原作者 LiangYueSec 所有, 如有侵权,请联系我们删除。