F4DE F4DE
首页
技术
笔记
随笔
关于
友链
归档

F4DE

Web Security
首页
技术
笔记
随笔
关于
友链
归档
  • Java安全

    • Tomcat

    • Shiro

      • Shiro权限绕过1
      • Shiro权限绕过2
      • Shiro权限绕过3
      • Shiro权限绕过4
        • 简介
        • 配置
        • 分析
          • shiro
          • Spring
        • 修复
      • Shiro反序列化
      • 利用TemplatesImpl改造CC6攻击Shiro
      • 通过动态类加载解决【通过Tomcat全局存储进行回显】在Shiro中的Header过长问题
      • 在Shiro中使用无CommonsCollections依赖的CommonsBeanUtils利用链
    • 字节码

    • 反序列化

  • 技术
  • Java安全
  • Shiro
F4DE
2021-03-22

Shiro权限绕过4

Shiro漏洞复盘系列--1.6.0版本以下的权限绕过复现分析。(CVE-2020-13933)

# 简介

影响版本:shiro < 1.6.0

限制条件:

  • 匹配非固定路由,比如/admin/{name}

# 配置

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.2.6.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
 <groupId>org.apache.shiro</groupId>
 <artifactId>shiro-web</artifactId>
 <version>1.5.3</version>
</dependency>
    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager());
        // 配置认证权限
        bean.setLoginUrl("/login");
        HashMap<String, String> map = new HashMap<>();
        map.put("/login", "anon");
        map.put("/user", "anon");
        map.put("/admin/*", "authc");
        bean.setFilterChainDefinitionMap(map);
        return bean;
    }


    @ResponseBody
    @RequestMapping("/admin/{name}")
    public String admin(String name) {
        return "hello admin";
    }

# 分析

正常访问/admin/auth,被shiro拦截:

image-20210322235122836

访问/admin/%3bauth,绕过shiro拦截:

image-20210322235210614

# shiro

来看shiro对于URL处理的部分,跟入getServletPath:

image-20210322235758954

URL会先被URLdecode一次:

image-20210323000407759

%3b --> ;,然后进入shiro的;号截断过程:

image-20210323000522704

之后会判断处理的结果是否以/结尾,如是,则去之:

image-20210323000703735

之后会进入URL和pattern的匹配逻辑中:

image-20210323000931573

/admin/*无法匹配/amdin,所以就导致了shiro的权限绕过:

image-20210323104331242

# Spring

来到Spring的部分,org.springframework.web.util.UrlPathHelper#getLookupPathForRequest:

image-20210323112848660

跟进getPathWithinServletMapping方法:

image-20210323112933541

再跟进getPathWithinApplication方法,再跟进其中的getRequestUri:

image-20210323113042970

image-20210323113107844

在decodeAndClenUriString方法中会进行URL的处理:

image-20210323113151080

这三个方法的具体逻辑不再赘述,之前的文章就已经分析过了,由于此时的URL中为%3b,是经过URL编码的;号,所以在removeSemicolonContent方法中并不会被截断,之后在decodeRequestString中进行URLdeocde:

image-20210323113437660

最后getPathWithinServletMapping方法的最终返回值就为/admin/;auth:

image-20210323113713247

由于Map设置为/admin/{name},那么此时的/admin/;auth就可以匹配该规则({name}就为;auth),然后获取到对应的Controller,请求被Spring正常处理:

image-20210323114050123

如果这样来看,如果Spring的路由设置方式为固定路由的话(比如/admin/auth),则无法进行匹配,最终会返回404。

# 修复

shiro层会将URL先进行decode,然后进入分号截断;Spring层会先将URL进行分号截断,之后再进行deocde,正是两者的这个差异导致的漏洞的发生。

  • 可以通过修改匹配规则,比如/admin/**来解决

    image-20210323134745085

    image-20210323134635432

  • shiro1.6.0的解决方案是增加了一个类InvalidRequestFilter来对;号进行拦截:

    image-20210323134857922

    但是我本地使用shiro1.6.0版本测试的时候发现%3b仍然可以绕过(待解决):

    image-20210323184115519

    image-20210323184139893

Shiro权限绕过3
Shiro反序列化

← Shiro权限绕过3 Shiro反序列化→

最近更新
01
在Shiro中使用无CommonsCollections依赖的CommonsBeanUtils利用链
04-19
02
CommonsBeanUtils
04-19
03
基于Tomcat全局存储进行回显
04-16
更多文章>
Theme by Vdoing | Copyright © 2020-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×