shiro CVE-2020-11989&CVE-2020-13933复现分析
2020-09-02 17:40:29 Author: xz.aliyun.com(查看原文) 阅读量:522 收藏

shiro漏洞分析

几周前报告了CVE-2020-13933漏洞,正好前两天有师傅发了文章,分享了姿势,因此来学习下

CVE-2020-11989

在分享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调试

更新后利用getServletPathgetPathInfo进行获取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,接着才去去除,从而导致了漏洞

shiro 1.6.0

比对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)](


文章来源: http://xz.aliyun.com/t/8223
如有侵权请联系:admin#unsafe.sh