shiro权限分析

admin 2021年10月27日08:01:05评论62 views字数 2515阅读8分23秒阅读模式
写这个的时候昏昏沉沉的可能有些地方没说清楚,可以看一下参考链接那个老哥说的很详细。自己就记录一下。

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会调到鉴权,加一个/就绕过了鉴权

shiro权限分析

shiro权限分析

看看filter的鉴权路径咋写的。

shiro权限分析

断点先下起来再看,在这里getPathWithinApp

shiro权限分析

进入getRequestUri看看对uri的处理。在decodeAndCleanUriString中判断了有无;号,在

normalize()中对uri进行了处理。可以看第二个分析比较详细,这里就简单说说了。就是对一些字

符进行了优化处理。然后保存在requestUri中,再讲requestUri与需要鉴权的路径做比较。

shiro权限分析

getChain(),直接跟,在这里就做比较了,因为我们添加了/所以比较失败返回null,导致了权限

绕过

poc
http://localhost:8080/bypass/
http://localhost:8080/login/..;/bypass

shiro权限分析

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的匹配。也可以利用;取到;之前

的链接进行绕过。看看效果

shiro权限分析

shiro权限分析

从代码来看,我们是想要访问bypass下的目录的,但是正常访问会被拦截到登录页面。

shiro权限分析

shiro权限分析

shiro权限分析

环境是这么个环境,接下来就开始调试看看具体的内容了。在getPathWithinApplication下个断点。

shiro权限分析


进入getRequestUri,看看对url的处理。

shiro权限分析

进入decodeAndCleanUriString()

shiro权限分析

根据运行的执行结果来看,这里是对uri进行了一次url解码。利用indexof(59)来判断是否存在;号,有的话返回;前的内容,否则就返回uri的内容。

shiro权限分析

再进入normalize()函数

shiro权限分析

从ascii对照表中看到是对的判断。来看一下具体的处理。
(1)替换\为/
(2)替换/.为/
(3)不是/开头的话添加/

shiro权限分析

处理完了以后,满足不存在// /./ /../ 这三种,才进行返回。
直接向下 到这里看看

shiro权限分析

简单梳理一下逻辑
(1)先看是否存在filter的设置,不存在返回null
(2)获取我们的请求地址,简单判断,然后对我们需要鉴权的路径进行一个遍历,看看在不在其中。

(3)判断完了如果都不存在,则返回null,退出函数。然后不做filter,选择默认的。能看到是没

有权限校验的。

shiro权限分析

shiro权限分析

shiro权限分析

修复

在 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解码。这里还是存在绕过的可能。

shiro权限分析

还是下断点来看一下,前面两个已经分析的差不多了关键函数,所以这里直接来找不同看看。这里

对;进行了处理。返回了分号之前的内容,也就是我们的两个bypass。这里通过跟踪发现,还是绕过

了鉴权的uri。感觉和之前的/绕过有点契合。对比一下,高版本少了一次url的解码。其他的就不多

说了 和前两个分析一样

poc
http://localhost:8080/bypass/bypass/%3b123

shiro权限分析

shiro权限分析

shiro权限分析

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的版本,高版本可能会导致环境搭建不成功。

shiro权限分析

前面都是大同小异,来看看不同的 domatch这里,

shiro权限分析

这里自动将空格去除了。也就是说形成了/bypass/bypass/这种,而/*未匹配到东西,所以不会调到鉴权页面

shiro权限分析

shiro权限分析

shiro权限分析

poc
http://localhost:8080/bypass/bypass/%20


注:本文转自e0m安全屋


shiro权限分析
“阅读原文”体验免费靶场!

原文始发于微信公众号(合天网安实验室):shiro权限分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年10月27日08:01:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   shiro权限分析http://cn-sec.com/archives/600894.html

发表评论

匿名网友 填写信息