先声明一下,免杀还是会更的,不过中间可能会穿插一下渗透的内容!!!
踩坑点:
在一开始翻阅了CSDN之后,发现不同文章之间存在出入,于是最后去了CVE的官方文档,和参考一些国外的底层代码审计人员的报告,发现原理和CSDN上的部分文章存在出入,但是POC是相同的。最后在参考国外文章之后修正了报告
CVE-2020-1957原理:
在Spring和Shiro(版本<1.5.2)搭配使用的时候会产生权限绕过漏洞。
在黑客传入的POC : https://........./test/..;/admin/ 中,它的框架检验代码如下:
- 先通过这段代码,在uri.indexOf(“;”)中,将截断 ;后面的请求。
- 然后通过normalize()这个函数,对反斜线进行替换,//,/./,/../ 都替换为 /
- 过getPathWithinApplication()函数的处理,最终Shiro 需要校验的URL 就是
/test/..
然后传入到getChain()函数中进行校验
其中Shiro组件只对/admin/** 这样的path进行了匹配,其他都会放行。
所以我们最原始的请求 https://........./test/..;/admin/ 就成功进入到了SpringBoot的校验中(这也是整个漏洞的产生原理)
然后SpringBoot就会对这个URL进行检查
又因为SpringBoot的getPathWithinServletMapping()函数通常是返回的Servletpath
所以就直接返回了/admin/ 这样的URL, 至此,就饶过了身份验证。
漏洞复现:
本次复现环境使用的是Vulhub靶场! 首先对登录界面进行抓包。
这时候我们直接去访问/Admin 这个界面是肯定会有拦截的(因为被Shrio的过滤器匹配到了)
302跟进之后发现,他又跳转到了我们的登录界面
然后我们用我们的POC去访问,成功绕过身份验证。
检测工具:
由于此漏洞并没有特别大的影响,在网上并没有搜索到对应的工具。
本人尝试了使用渊龙SEC曾哥spring工具,以及其他Shiro工具也并未能检测出漏洞。
所以只能收录为一个POC,在后续的武器开发之中能加入这一POC检测。
修复建议:
将Shiro版本进行升级。在新版本的Shiro中GetRequestURL是由contextPath()+ servletPath()+ pathinfo() 这三个函数组合而成,当黑客传入https://........./test/..;/admin/ POC之后,在Shiro的过滤之下,返回的路径将会变成/admin/成功匹配,不会放行,成功防止了权限的绕过。
参考文章:
Shiro权限绕过漏洞分析(CVE-2020-1957) - FreeBuf网络安全行业门户
https://www.cnblogs.com/backlion/p/14055274.html
shiro权限绕过漏洞分析(cve-2020-1957) | Spoock