Apache Shiro 权限绕过漏洞CVE-2020-11989的分析是怎样的

发布时间:2021-12-28 17:09:21 作者:柒染
来源:亿速云 阅读:267
# Apache Shiro 权限绕过漏洞CVE-2020-11989的分析

## 一、漏洞背景

Apache Shiro是一个强大且易用的Java安全框架,提供认证、授权、加密和会话管理等功能。2020年6月,Apache Shiro官方披露了一个高危权限绕过漏洞(CVE-2020-11989),该漏洞影响版本为1.5.3及以下,当Shiro与Spring框架结合使用时,攻击者可构造特殊请求绕过权限控制。

### 1.1 漏洞基本信息
- **CVE编号**:CVE-2020-11989  
- **漏洞类型**:权限绕过  
- **影响版本**:Apache Shiro ≤ 1.5.3  
- **CVSS评分**:9.8(Critical)  
- **漏洞公开时间**:2020年6月22日  

### 1.2 漏洞产生环境
当同时满足以下条件时易受攻击:
1. 使用Spring框架的`DispatcherServlet`(如Spring Boot)
2. 配置了Shiro的URL路径过滤规则
3. 存在静态资源目录(如`/static`、`/public`)

## 二、漏洞原理分析

### 2.1 Shiro的URL匹配机制
Shiro通过`PathMatchingFilterChainResolver`进行URL路径匹配,核心逻辑如下:

```java
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
    String requestURI = getPathWithinApplication(request);
    for (String pathPattern : filterChainManager.getChainNames()) {
        if (pathMatches(pathPattern, requestURI)) {
            return filterChainManager.proxy(originalChain, pathPattern);
        }
    }
    return null;
}

2.2 Spring的URL处理机制

Spring的DispatcherServlet在处理请求时会对路径进行规范化: 1. 解码URL编码字符(如%2e.) 2. 处理路径遍历符号(如/../) 3. 移除重复斜杠(如///

2.3 漏洞触发点

当攻击者构造如下请求时:

http://target.com/;/admin
  1. Shiro层:;/admin被当作完整路径进行匹配,若未配置该路径规则则放行
  2. Spring层:;被当作合法字符处理,最终路由到/admin控制器

2.4 根本原因

三、漏洞复现

3.1 环境搭建

<!-- pom.xml 依赖 -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.5.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.2 安全配置示例

@Bean
public ShiroFilterFactoryBean shiroFilter() {
    ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();
    Map<String, String> filterMap = new LinkedHashMap<>();
    filterMap.put("/admin/**", "authc"); // 需要认证
    filterMap.put("/static/**", "anon"); // 允许匿名访问
    factory.setFilterChainDefinitionMap(filterMap);
    return factory;
}

3.3 攻击向量

请求方式 恶意URL 绕过效果
GET http://target.com/;/admin 访问受保护的管理页面
POST http://target.com/static/..;/admin/update 通过静态目录绕过

3.4 实际攻击示例

curl -v "http://localhost:8080/;/admin"
* 注意观察响应码200(正常应为302跳转登录页)

四、修复方案

4.1 官方补丁

升级到Shiro 1.6.0及以上版本,主要修改: 1. 新增removeSemicolon()方法处理分号

private String removeSemicolon(String uri) {
    int semicolonIndex = uri.indexOf(';');
    return (semicolonIndex != -1) ? uri.substring(0, semicolonIndex) : uri;
}
  1. 修改getPathWithinApplication()方法调用链

4.2 临时缓解措施

// 自定义Filter继承AccessControlFilter
@Override
protected boolean isAccessAllowed(ServletRequest request, 
    ServletResponse response, Object mappedValue) {
    HttpServletRequest req = (HttpServletRequest) request;
    String uri = req.getRequestURI();
    if (uri.contains(";")) {
        return false; // 直接拒绝含分号的请求
    }
    return true;
}

4.3 最佳实践建议

  1. 采用白名单机制配置静态资源
  2. 避免使用/**通配符规则
  3. 结合Spring Security进行双重防护

五、深度技术分析

5.1 URL标准化对比

处理阶段 /%3badmin /;admin /static/../admin
浏览器编码 %3badmin ;admin static/../admin
Shiro解析 %3badmin ;admin static/../admin
Spring解析 ;admin ;admin admin

5.2 其他可能触发字符

除分号外,以下字符也需注意: - 反斜杠\(Windows路径特性) - Unicode编码字符(如\u002e) - URL双重编码(如%252e

5.3 同类漏洞对比

CVE编号 触发条件 影响范围
CVE-2020-1957 Spring+Shiro路径穿越 Shiro < 1.5.2
CVE-2020-11989 分号处理差异 Shiro ≤ 1.5.3
CVE-2021-41303 正则匹配缺陷 Shiro < 1.8.0

六、安全启示

  1. 框架组合风险:混合使用多个安全框架时需注意兼容性问题
  2. 深度防御原则:建议在网络层、应用层、数据层实施多重防护
  3. 标准化处理:所有安全组件应遵循统一的URL处理规范(RFC 3986)
  4. 持续监控:建议部署RASP方案实时拦截异常请求

附录

A. 参考链接

B. 检测工具

# 使用nmap检测
nmap -p 80,443 --script http-shiro-auth-bypass <target>

C. 时间线

”`

推荐阅读:
  1. Apache shiro框架怎么用
  2. 怎么在Apache中使用Shiro 框架

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

cve-2020-11989 apache shiro

上一篇:QT编写地图如何实现在线轮廓图

下一篇:java线程池如何合理设置最大线程数和核心线程数

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》