几周前报告了CVE-2020-13933漏洞,正好前两天有师傅发了文章,分享了姿势,因此来学习下
在分享13933之前,先看下11989,因为11989的修补并不完全,导致被绕过产生了13933
利用demo搭建
IDEA配置好tomcat,然后点击build,可以直接下载所需要配置,完成后点击run即可开始运行
漏洞原理为shiro和Spring获取到的URL不相同,导致shiro鉴权后认为该URL有权限访问,Spring则会将用户前往该URL
首先定位shiro获取URL的位置
org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain
在此处打下断点,然后发送payload/;/srpingboot_shiro_war_exploded/admin/page
可以看到,getPathWithinApplication
得到的地址为/
,跟进
通过计算表达式,返回contextPath
为/;/srpingboot_shiro_war_exploded
,和我们的payload是相同的
查看requestUri
,返回值为/
,跟进查看
方法首先获取request的属性,返回了null,接着对url进行了获取并拼接,然后返回经过decodeAndCleanUriString
处理后的url
可以看到经过拼接后的值为正常的获取的值,显然是decodeAndCleanUriString
产生的漏洞
查看经过处理后的值,结果返回/
,跟进查看
在方法内部,将会根据ascii=59,也就是;
进行截断,包括;
,因此返回了/
,而shiro认为该路径是存在访问权限的,因此允许访问
接下来查看Spring如何处理
org.springframework.web.util.UrlPathHelper#getServletPath
直接表达式计算,可以看到,Spring获取的是/admin/page
,因此访问到了未授权的页面
将pom.xml中的1.5.2替换为1.5.3,将src/main/java/org/syclover/srpingbootshiroLoginController中的后台验证/admin/page
替换为/admin/{name}
,然后重新build并运行即可
成功复现了漏洞
通过11989的分析,可以看到出问题的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication
,shiro1.5.3进行了修改,直接在这里下断点,然后dubug调试
更新后利用getServletPath
和getPathInfo
进行获取URL,然而真正的漏洞点并不在此
可以看到拼合后URL是没问题的,再看经过removeSemicolon
处理后
可以看到只保留了/admin/
,可以在控制器里添加/admin/
路由进行测试,
@GetMapping("/admin/")
public String admin2() {
return "please login, admin";
}
访问是不会有权限验证的,当然,在后面添加上参数的话就需要权限了
跟进removeSemicolon
同样,将;
后的内容截断,包括;
再看下Spring如何处理
Spring没有问题,获取到的是/admin/;page
,然后将;page
作为一整个字符串,匹配/admin/{name}
路由,导致越权
再看下是怎么处理URL的
`org.springframework.web.util.UrlPathHelper#decodeAndCleanUriString
removeSemicolonContent # 去除;及以后部分
decodeRequestString # 进行urldecode解码
getSanitizedPath # 将//替换为/
而shiro则相反
首先进行了urldecode,接着才去去除,从而导致了漏洞
比对1.5.3和1.6.0,对URL的获取上并没有任何改变
不同的是增加了一个InvalidRequestFilter类,作用是对分号、反斜杠和非ASCII字符进行过滤
org.apache.shiro.web.filter.InvalidRequestFilter
再进行漏洞测试
CVE-2020-13933虽然是CVE-2020-11989的绕过,然而两者的绕过内容却不同
11989针对于/admin/page
,这种固定路由,shiro得到的地址为/
,因此认为可以访问,Spring得到的地址为/admin/page
,从而定位到未授权的页面
13933则是匹配非固定地址路由,比如/admin/{name}
,因为shiro得到的是/admin/
,认为可以访问,而Spring得到的是/admin/;page
,如果也采取固定路由,则会因为找不到;page
,从而返回404
shiro < 1.6.0的认证绕过漏洞分析(CVE-2020-13933)
Apache Shiro 权限绕过漏洞CVE-2020-13933)
Apache Shiro权限绕过漏洞分析(CVE-2020-11989)
[Apache Shiro 身份验证绕过漏洞 (CVE-2020-11989)](