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

F4DE

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

    • Tomcat

    • Shiro

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

    • 反序列化

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

Shiro权限绕过2

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

# 简介

漏洞影响范围:shiro < 1.5.2

# 配置

        <!-- shiro dependence -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.2</version>
        </dependency>

shiro config同上一篇文章。

# 分析

访问/admin/,已经无法绕过shiro过滤器的拦截:

image-20210318204406613

访问/;/admin,成功绕过shiro拦截:

image-20210318204649795

# shiro

还是在org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain,打下断点,发送请求:

image-20210318205038597

主要在getPathWithApplication方法里:

image-20210318205119386

这里会获取到请求的contextPath和requestUri,获取到uri为/;/admin之后进入decodeAndCleanUriString方法中:

image-20210318205306717

decodeAndCleanUriString方法中把请求的uri按分号进行截断:

image-20210318205340398

/;/admin经过shiro的处理之后,我们请求的路由就变成了/,由于/路由下没有设置过滤器,所以就shiro的过滤器无法匹配,绕过了shiro的权限认证。

# Spring

依然在org.springframework.web.util.UrlPathHelper#getLookupPathForRequest方法中打下断点,发送请求开始调试:

image-20210319003838013

这次主要跟入getPathWithinApplication方法:

image-20210319003935113

再跟入getRequestUri方法:

image-20210319004024544

主要看decodeAndCleanUriString方法,这个方法中对请求的路由做了一些处理:

image-20210319004119307

跟入第一个方法removeSemicolonContent,经过这部分代码处理之后/;/admin变成了//admin,在这个方法中,会把;到后面第一个/之间的字符串全部去掉(包括;),比如/;xxx/经过处理之后就变成了//:

image-20210319004437224

再跟入第三个方法getSanitizedPath,在获取到//的索引值之后,直接删除该索引上对应的字符,//admin也就变了/admin:

image-20210319004636257

最后也就返回了/admin的路由,之后就是正常匹配 hanlderMethod 的过程了,不再赘述:

image-20210319004921899

# 修复

1.5.2版本的org.aoache.shiro.web.util.WebUtils#getRequestUri方法如下:

public static String getRequestUri(HttpServletRequest request) {
        String uri = (String)request.getAttribute("javax.servlet.include.request_uri");
        if (uri == null) {
            uri = valueOrEmpty(request.getContextPath()) + "/" + valueOrEmpty(request.getServletPath()) + valueOrEmpty(request.getPathInfo());
        }

        return normalize(decodeAndCleanUriString(request, uri));
    }

uri获取的规则变成了ContextPath 、ServletPath、PathInfo三者拼接而成:

image-20210319092755726

getServletPath方法可以正确处理分号,再经过后续方法处理,/;/admin就被正常处理为了/admin,之后就会被shiro的过滤器正常拦截。

Shiro权限绕过1
Shiro权限绕过3

← Shiro权限绕过1 Shiro权限绕过3→

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