shiro权限绕过总结
【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。





CVE-2016-6802
复现过程访问login.jsp如下
访问未授权路径account/index.jsp会跳转到登录界面:
在访问路径前加上/任意目录名/../,即可越权访问:http://127.0.0.1:8080/aaa/../samples-web-1.2.4/account/index.jsp
CVE-2020-1957
利用条件
Apache Shiro <= 1.5.1 Spring 框架中只使用 Shiro 鉴权利用方法/demo/..;/admin/index其中demo为授权路径,admin/index为鉴权路径原理:重点是;
shiro在验证权限时会被;截断,只验证;前面的路径,通过后将完整URL给spring进行路由分发,spring就正常对完整路径进行解析,就访问到admin/index漏洞环境修改 pom.xml 中的spring版本为 2.1.5.RELEASE,shiro版本1.5.1环境配置在 LoginController 中添加如下代码
在 ShiroConfig 中变为如下规则
漏洞演示直接访问demo可以
admin/index为鉴权路径
访问/demo/..;/admin/index即可绕过鉴权
CVE-2020-11989
利用条件:
Apache Shiro <= 1.5.2 需要后端特定的格式才可进行触发 即:Shiro权限配置必须为 /xxx/* ,同时后端逻辑必须是/xxx/{variable}且variable的类型必须是String利用方法admin/page%252fABCDEFG其中admin/page为鉴权路径,ABCDEFG为随意字符串漏洞环境:在上文的环境基础下,在 Shiro 包下的 ShiroConfig 中,添加规则校验
map.put(“/admin/*”,”authc”); 即当我们访问 /admin/xxxx 的路径的时候 Shiro 会对其进行权限校验。这里的规则是 /admin/* 所以 Shiro 并不会对多个目录进行权限校验,例如:/admin/aaa/bbb这种是不会对其进行权限校验的。环境配置在pom中修改shiro版本
然后配置shiroconfig文件和添加对应的前置条件
在 loginController 中添加如下代码 这里一定要 /xxxx/{} 的形式,且参数为 String @ResponseBody @GetMapping(“/admin/{name}”) public String namePage(@PathVariable String name){ return “Hello” + name; }
漏洞演示
原理:重点是%252f,中间件会先进行一次解码将admin/page%2fABCDEFG交给shiro,shiro解码为admin/page/ABCDEFG,因为authc拦截器设置的规则是admin/*,而admin/page/ABCDEFG为多个目录不符合拦截规则因此放过去了,然而spring处理admin/page%2fABCDEFG的时候会认为page%2fABCDEFG这一串是字符串,命中admin/{string}的规则,因此就转发到响应的路由实现绕过。
CVE-2020-13933
利用条件
Apache Shiro < 1.6.0 Spring 框架中只使用 Shiro 鉴权 需要后端特定的格式才可进行触发即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型必须是 String利用方法admin/%3BABCDEFG,其中admin为鉴权路径,ABCDEFG为随意字符串漏洞环境 同 CVE-2020-11989 环境,只要将版本改为 1.5.3 即可,修改 pom.xml
漏洞演示
admin/%3BABCDEFG经过解码为admin/;ABCDEFG,shiro会根据;进行截断,返回的 URI自然是/admin/,这个 URI 少了一个层级也无法命中拦截器map.put(“/hello/*”, “authc”);因此绕过拦截器。
CVE-2020-17510
测试环境
Shiro 1.6.0,SpringBoot 2.5.3
shiro控制路由添加map.put(“/hello/*”, “authc”);
logincontroller添加匹配规则:@GetMapping(“/hello/{name}”) public String hello(@PathVariable String name) { return “hello”; }
漏洞演示
当Shiro获得的uri为/hello时,是无法和/hello/*匹配的,所以就在/hello后面加上%2e,这样Shiro解码之后变成/hello/.,然后路径标准化成为/hello,绕过身份验证
CVE-2020-17523
利用条件
Apache Shiro < 1.7.1 Spring 框架中只使用 Shiro 鉴权 需要后端特定的格式才可进行触发 即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型必须是 String利用方法admin/%20,其中admin为鉴权路径漏洞环境 同 CVE-2020-11989 环境,pom.xml 中版本修改为 1.7.0 或及以下即可 漏洞演示http://127.0.0.1:8080/admin/%20,shiro对空格进行转换时,直接trim为空,不匹配admin/*,因此可绕过
看了以上漏洞复现可能有点混乱,但是绕过原理大同小异,实际操作中在不知道配置和版本的情况下可多试试,有些绕过方法可能适用多个版本,以下为两个实际案例。

如图,浏览器访问一个授权的接口如下:
在授权接口后面加上路径swagger-ui.html返回404,不知道是没用swagger还是swagger需要鉴权:
尝试在前面加一个..;进行绕过,返回结果不是404了,可能有的搞。
由于环境复杂可能存在代理服务器,于是再加两层尝试,成功访问到身份认证平台下的swagger接口信息:
点击controller,可以看到很多敏感接口路径,如获取在线用户信息,修改当前用户密码等:
访问获取在线用户信息接口:
把提醒的需要的参数都加上:
成功获取到在线用户信息:
将pagesize的数量加大,返回了多条在线用户信息,直接搜索admin用户,当其在线的时候得到了session,然后访问修改当前用户密码的接口,经过一些操作成功修改密码登陆admin账户……
一个shiro网站抓取登陆数据包,路径显示为a/login
因为登陆页面无忘记密码等其他可以点击的接口,所以在js里面随意找一个授权路径
此处选择static,在后面加上..;来验证是否禁用了..;
可以使用..;之后尝试猜解需要登陆才可以访问的主目录路径名如index,home等。将登陆路径替换成index
没有跳转到登录界面而显示404报错,已经大概可以说明存在绕过了,只是不存在index路径,接着尝试猜其他路径。存在home路径并且成功绕过登陆访问。
但是因为可能是主目录需要用户具体的cookie等身份信息去查询其所属数据,直接绕过登陆的话没有cookie也就没有信息
因此只能寻找一些其他接口。此处在burp插件里找是否有其他敏感接口。在访问了home目录后插件自动扫描了同层路径的敏感接口
此处随意选择一个接口构造进行查询,存在敏感数据。
swagger-ui.html里面也有部分敏感接口。


CVE-2016-6802在访问路径前加上/任意目录名/../,即可绕过访问
CVE-2020-1957/demo/..;/admin/index其中demo为授权路径,admin/index为鉴权路径 /.;/hello/aaaa
CVE-2020-11989admin/page%252fABCDEFG其中admin/page为鉴权路径,ABCDEFG为随意字符串 /hello/a%25%32%66a /;/test/hello/aaa
CVE-2020-13933admin/%3BABCDEFG,其中admin为鉴权路径,ABCDEFG为随意字符串
CVE-2020-17510admin/%2e
CVE-2020-17523admin/%20,其中admin为鉴权路径
CVE-2022-32532特定条件下的漏洞利用:当shiro使用了RegExPatternMatcher进行路由匹配时,由于Java的正则Pattern.matches解析.默认是不匹配r或者n的,因此当path中带有%0a时可绕过正则匹配 /permit/a%0any



监制:船长、铁子 策划:格纸 文案:kk 美工:青柠
原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/7497.html