1. 首页
  2. 红队技术

shiro权限绕过总结

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

导航栏
章节
内容

1
什么是shiro绕过
2
shiro绕过的前置知识
3
各个版本的绕过复现(2个实例)
4
payload总结
5
思路总结
01
什么是shiro绕过
shiro反序列化人尽皆知,因此现在很多shiro框架都没有使用易被猜解的key,也因此很多时候看到shiro框架都是大喜然后大悲,但是大悲之后还可以尝试其他的利用方法,比如shiro权限绕过,虽然不能直接getshell,但是在某些特定条件下或者找到了重要的接口后也能撕开口子起到大作用。在shiro权限绕过漏洞中,利用的问题是shiro拦截器先于spring   boot执行,并且二者的匹配模式不同,最终导致访问的url1和shiro处理的url2以及spring路由的url3不同,导致shiro拦截器起不到应有的作用从而被绕过。
02
shiro绕过的前置知识
shiro是做身份认证和权限管理的一款apache框架,可以和spring一起使用。shiro框架通过拦截器来实现对用户访问权限的控制和拦截。Shiro常见的拦截器有anon,authc等。    anon:匿名拦截器,不需登录就能访问,一般用于静态资源,或者移动端接口。如登陆,忘记密码,js等    authc:登录拦截器,需要登录认证才能访问的资源。我们通过在配置文件中配置需要登录才可访问的url,实现对url的访问控制。其中,url的路径表达式为Ant格式。?:匹配一个字符 *:匹配零个或多个字符串 **:匹配路径中的零个或多个路径


03
各个版本的绕过复现

CVE-2016-6802

漏洞详情由于获取的 ContextPath 没有标准化处理,如果出现一些特殊字符使ContextPath与实际不符,都会导致在 StringUtils.startsWithIgnoreCase() 方法判断时失效,直接返回完整的RequestURI。利用条件shrio<1.3.2利用方法在访问路径前加上/任意目录名/../,即可绕过访问

复现过程访问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/*,因此可绕过


      看了以上漏洞复现可能有点混乱,但是绕过原理大同小异,实际操作中在不知道配置和版本的情况下可多试试,有些绕过方法可能适用多个版本,以下为两个实际案例。

实例1-shiro绕过获取管理员session
某授权单位红队评估,信息搜集出来的网站大多都会跳转到统一身份认证平台进行登录,少有不跳转的都是官方网站那种没啥搞的。所以这个平台是关键点。访问账号申诉、忘记密码那些不需要授权的功能点,皆在api/uap/unauthorize路径下,猜测此路径设置不用鉴权的白名单。在此授权路径下尝试使用绕过方式绕过

如图,浏览器访问一个授权的接口如下:

在授权接口后面加上路径swagger-ui.html返回404,不知道是没用swagger还是swagger需要鉴权:

尝试在前面加一个..;进行绕过,返回结果不是404了,可能有的搞。

由于环境复杂可能存在代理服务器,于是再加两层尝试,成功访问到身份认证平台下的swagger接口信息:

点击controller,可以看到很多敏感接口路径,如获取在线用户信息,修改当前用户密码等:

访问获取在线用户信息接口:

把提醒的需要的参数都加上:

成功获取到在线用户信息:

将pagesize的数量加大,返回了多条在线用户信息,直接搜索admin用户,当其在线的时候得到了session,然后访问修改当前用户密码的接口,经过一些操作成功修改密码登陆admin账户……

实例2-使用burp插件获取敏感接口

一个shiro网站抓取登陆数据包,路径显示为a/login

因为登陆页面无忘记密码等其他可以点击的接口,所以在js里面随意找一个授权路径

此处选择static,在后面加上..;来验证是否禁用了..;

可以使用..;之后尝试猜解需要登陆才可以访问的主目录路径名如index,home等。将登陆路径替换成index

没有跳转到登录界面而显示404报错,已经大概可以说明存在绕过了,只是不存在index路径,接着尝试猜其他路径。存在home路径并且成功绕过登陆访问。

但是因为可能是主目录需要用户具体的cookie等身份信息去查询其所属数据,直接绕过登陆的话没有cookie也就没有信息

因此只能寻找一些其他接口。此处在burp插件里找是否有其他敏感接口。在访问了home目录后插件自动扫描了同层路径的敏感接口

此处随意选择一个接口构造进行查询,存在敏感数据。


swagger-ui.html里面也有部分敏感接口。

04
payload总结

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

05
思路总结
难点和关键点:如何找到需要鉴权的路径名或者接口1、利用fofa搜寻同样类型站点,利用弱口令进入同类型的站点后台,收集一波后台各种接口的URL,将这些URL拼接在目标站点。2、在JS里找授权路径,利用bp插件寻找敏感接口。3、使用swagger,actuator等路径尝试。4、常见框架目录爆破。
END

监制:船长、铁子   策划:格纸   文案:kk  美工:青柠

原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/7497.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息