写这个的时候昏昏沉沉的可能有些地方没说清楚,可以看一下参考链接那个老哥说的很详细。自己
就记录一下。
CVE-2020-1957
漏洞代码地址
https://github.com/threedr3am/learnjavabug/blob/master/shiro/auth-bypass(shiro%3C1.5.3)/pom.xml
参考文章
http://wjlshare.com/archives/1591
Apache Shiro <= 1.4.1
Spring 框架中只使用 Shiro 鉴权
先看一下靶场效果,直接访问bypass会调到鉴权,加一个/就绕过了鉴权
看看filter的鉴权路径咋写的。
断点先下起来再看,在这里getPathWithinApp
进入getRequestUri看看对uri的处理。在decodeAndCleanUriString中判断了有无;号,在normalize()中对uri进行了处理。可以看第二个分析比较详细,这里就简单说说了。就是对一些字
符进行了优化处理。然后保存在requestUri中,再讲requestUri与需要鉴权的路径做比较。
getChain(),直接跟,在这里就做比较了,因为我们添加了/所以比较失败返回null,导致了权限
绕过
poc
http://localhost:8080/bypass/
http://localhost:8080/login/..;/bypass
CVE-2020-11989
漏洞代码地址
https://github.com/threedr3am/learnjavabug/blob/master/shiro/auth-bypass(shiro%3C1.5.3)/pom.xml
参考文章
http://wjlshare.com/archives/1591
漏洞产生的原因是因为 Spring 与 Shiro 之间对 url 的处理不同从而导致权限绕过
Apache Shiro <= 1.5.2
Spring 框架中只使用 Shiro 鉴权
需要后端特定的格式才可进行触发即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型
必须是 String
环境搭建参考参考文章
下个断点进行调试分析漏洞原理:利用shiro在做匹配的时候,如果是e0mlja/*格式,则只会匹配e0mlja目录下,如果再
加一层目录可绕过匹配,如e0mlja/123/123就绕过了e0mlja/*对123的匹配。也可以利用;取到;之前
的链接进行绕过。看看效果
从代码来看,我们是想要访问bypass下的目录的,但是正常访问会被拦截到登录页面。
环境是这么个环境,接下来就开始调试看看具体的内容了。在getPathWithinApplication下个断点。
进入getRequestUri,看看对url的处理。
进入decodeAndCleanUriString()
根据运行的执行结果来看,这里是对uri进行了一次url解码。利用indexof(59)来判断是否存在;号,
有的话返回;前的内容,否则就返回uri的内容。
再进入normalize()函数
从ascii对照表中看到是对的判断。来看一下具体的处理。
(1)替换\为/
(2)替换/.为/
(3)不是/开头的话添加/
处理完了以后,满足不存在// /./ /../ 这三种,才进行返回。
直接向下 到这里看看
简单梳理一下逻辑
(1)先看是否存在filter的设置,不存在返回null
(2)获取我们的请求地址,简单判断,然后对我们需要鉴权的路径进行一个遍历,看看在不在其中。(3)判断完了如果都不存在,则返回null,退出函数。然后不做filter,选择默认的。能看到是没
有权限校验的。
修复在 Shiro 1.5.3 版本中对 getPathWithinApplication 进行了修改,取消了 url 解码的函数,所
以我们这里的 uri 并不会被完全解码,绕过bypass的鉴权
poc:
http://localhost:8080/bypass/bypass/aaa%252Faaa
http://localhost:8080/;/bypass/bypass/111
CVE-2020-13933
Apache Shiro < 1.6.0
Spring 框架中只使用 Shiro 鉴权
需要后端特定的格式才可进行触发即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型
必须是 String
我们知道shiro的上版本修复是省去了自动url解码。这里还是存在绕过的可能。
还是下断点来看一下,前面两个已经分析的差不多了关键函数,所以这里直接来找不同看看。这里
对;进行了处理。返回了分号之前的内容,也就是我们的两个bypass。这里通过跟踪发现,还是绕过
了鉴权的uri。感觉和之前的/绕过有点契合。对比一下,高版本少了一次url的解码。其他的就不多
说了 和前两个分析一样
poc
http://localhost:8080/bypass/bypass/%3b123
CVE-2020-17523
Apache Shiro < 1.7.1
Spring 框架中只使用 Shiro 鉴权
需要后端特定的格式才可进行触发即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型
必须是 String
poc
http://localhost:8080//bypass/bypass/%20这个就不过多重复分析了,还有一点需要注意的就是spring对uri的处理,否则传入的错误路径可能
会导致有问题。最后复现的时候需要注意java的版本,高版本可能会导致环境搭建不成功。
前面都是大同小异,来看看不同的 domatch这里,
这里自动将空格去除了。也就是说形成了/bypass/bypass/这种,而/*未匹配到东西,所以不会调到
鉴权页面
poc
http://localhost:8080/bypass/bypass/%20
注:本文转自e0m安全屋
原文始发于微信公众号(合天网安实验室):shiro权限分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论