zoukankan      html  css  js  c++  java
  • shiro权限绕过

    shiro权限绕过

    什么是shiro

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    shiro权限绕过的原因

    Apache Shiro是一个Java的安全管理框架,可以和spring一起使用。这次的权限绕过漏洞就出在和spring boot搭配这里。

    shiro框架通过拦截器来实现对用户访问权限的控制和拦截。Shiro常见的拦截器有anon,authc等。

    1. anon:匿名拦截器,不需登录就能访问,一般用于静态资源,或者移动端接口。
    2. authc:登录拦截器,需要登录认证才能访问的资源。

    我们通过在配置文件中配置需要登录才可访问的url,实现对url的访问控制。其中,url的路径表达式为Ant格式。

    shiro权限绕过的限制条件

    • 网站同时使用shiro和spring
    • shiro满足特定的版本

    CVE-2016-6802

    shiro版本:shiro < 1.5.0

    shiro与spring的URI中末尾的/不同导致的权限绕过

    其中*表示匹配零个或多个字符串,/*可以匹配/hello,但匹配不到/hello/因为*通配符无法匹配路径。

    假设/hello接口设置了authc拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*的URL路径表达式将无法正确匹配,放行。然后进入到spring(Servlet)拦截器,而spring中 /hello 形式和 /hello/形式的URL访问的资源是一样的,从而导致了绕过。

    CVE-2020-1957

    shiro版本:shiro < 1.5.2

    #绕过的payload
    /xxx/..;/hello/aaaa
    /.;/hello/aaaa
    

    通过网络判断,网站处理URI时会先经过 shiro 处理,再转发到 springboot 进行路由分发工作。而在shiro中,在对URI中的;进行处理时会将URI进行截断,然后对/xxx/..进行权限校验,校验通过之后再由springboot进行路由分发,然后springboot会将URI/xxx/..;/hello/aaaa解释为/hello/aaaa,这样我们就可以成功访问到原本访问不到的接口了。

    大致流程如下:

    用户发起请求/xxx/..;/hello/aaaa—–>shiro处理之后返回/xxx/..通过校验的—–>springboot处理/xxx/..;/hello/aaaa返回/hello/aaaa,最后访问到需要权限校验的资源。

    CVE-2020-11989

    shiro版本:shiro < 1.5.3

    这里的 shiro 拦截器需要变成map.put("/hello/*", "authc");,这里有两种poc,都是可以绕过

    #绕过的payload
    /hello/a%25%32%66a
    /;/test/hello/aaa
    

    利用;绕过的大致流程和上面基本一致,而利用编码绕过的流程如下:

    /hello/a%25%32%66a——>传入到shiro自动解码一次变成//hello/a%2fa——>经过 decodeRequestString 变成/hello/a/a

    由于这里我们的拦截器是map.put("/hello/*", "authc");,这里需要了解一下shiro的URL是ant格式,路径是支持通配符表示的。

    ?:匹配一个字符
    *:匹配零个或多个字符串
    **:匹配路径中的零个或多个路径
    

    /*只能命中/hello/aaa这种格式,无法命中/hello/a/a,所以经过 shiro 进行权限判断的时候自然无法命中。

    而在spring当中,理解的 servletPath/hello/a%2fa,所以自然命中@GetMapping("/hello/{name}")这个mapping,又springboot转发到响应的路由当中。

    %25 -- %

    %32 -- 2

    %66 -- f

    %2f -- /

    %3b -- ;

    CVE-2020-13933

    shiro版本: shiro < 1.6.0

    #绕过的payload
    /hello/%3baaaa
    

    上面的代码进来之后,通过 shiro 处理之后变成了/hello/;aaaa,然后shiro会根据;进行截断,返回的 URI自然是/hello/,这个 URI 自然无法命中拦截器map.put("/hello/*", "authc");自然就过了

    SpringBoot默认不解析任何脚本文件,因此一般通过shiro权限绕过进入后台也很难通过文件上传getshell

    参考连接

    shiro权限绕过漏洞详细分析

    shiro权限绕过剖析

    cve-2020-17523

    shiro权限绕过历史

  • 相关阅读:
    Jmeter中使用HTTP信息头管理器发送json格式请求体的接口
    Jmeter工具使用初体验
    python接口测试中常见的两种接口依赖处理方式
    https类型接口,关闭认证(verify=False)情况下消除告警的方法
    当接口请求体带有中文字符时,执行脚本报错的解决办法
    java 温习之字符串(获取两个字符串的最大公共字串)
    java读取.properties配置文件的几种方法
    git
    eclipse安装git
    eclipse 安装springide插件
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/15498635.html
Copyright © 2011-2022 走看看