CVE-2016-6802
https://xz.aliyun.com/t/11633#toc-13
https://su18.org/post/shiro-2/#cve-2016-6802
https://github.com/apache/shiro/commit/b15ab927709ca18ea4a02538be01919a19ab65af
0x00 概述
Shiro
未对ContextPath
做路径标准化导致权限绕过,原理与CVE-2010-3863
相同,并且位置在同一处。
影响范围:
- shiro < 1.3.2
0x01 漏洞分析
org.apache.shiro.web.util.WebUtils#getPathWithinApplication
之前我们关注的是 getRequestUri
,这一次是getContextPath
我们可以看到这里是没有对 ContextPath 进行标准化的,直接url 解码之后就返回了。
这里用 vulhub 中 1.2.4 shiro 的环境代码做一个演示,需要做一些改动:
- 给 springboot 设置 contextpath
- 因为如果不设置的话,
request.getContextPath
不会获取到值
- 因为如果不设置的话,
- 配置一下shiro 权限设置
此时如果想要访问/admin
需要请求/myapp1/admin
,正常逻辑,应该是在getPathWithinApplication
中将前置的 contextPath
去除掉然后返回路径和配置中的模式进行匹配,但是当前因为没有对 contextPath
进行标准化,就导致前置路径没有去除掉,直接和过滤器中模式进行匹配。
如图可以看到此时请求路由为/soft98/../myapp1/admin
,这个是可以被正常解析的,但是 shiro 这里的处理,导致StringUtils.startsWithIgnoreCase(requestUri, contextPath)
失败,所以直接返回了/myapp1/admin
,这样就和/**
的模式进行了匹配,所以直接就不需要认证就访问了。
在 su18 师傅的文章里,他对request.getContextPath()
进行了分析,实际在取值时,会根据/
进行逐级递加,然后将标准化之后的路径和配置中存在的contextPath
进行匹配,匹配成功会返回对应的值。
0x02 修复分析
修复的方法和CVE-2010-3863
也一样,就是对路径进行规范化。