您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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;
}
Spring的DispatcherServlet
在处理请求时会对路径进行规范化:
1. 解码URL编码字符(如%2e
→.
)
2. 处理路径遍历符号(如/../
)
3. 移除重复斜杠(如//
→/
)
当攻击者构造如下请求时:
http://target.com/;/admin
;/admin
被当作完整路径进行匹配,若未配置该路径规则则放行;
被当作合法字符处理,最终路由到/admin
控制器;
在RFC 3986中属于合法字符但处理不规范<!-- 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>
@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;
}
请求方式 | 恶意URL | 绕过效果 |
---|---|---|
GET | http://target.com/;/admin |
访问受保护的管理页面 |
POST | http://target.com/static/..;/admin/update |
通过静态目录绕过 |
curl -v "http://localhost:8080/;/admin"
* 注意观察响应码200(正常应为302跳转登录页)
升级到Shiro 1.6.0及以上版本,主要修改:
1. 新增removeSemicolon()
方法处理分号
private String removeSemicolon(String uri) {
int semicolonIndex = uri.indexOf(';');
return (semicolonIndex != -1) ? uri.substring(0, semicolonIndex) : uri;
}
getPathWithinApplication()
方法调用链// 自定义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;
}
/**
通配符规则处理阶段 | /%3badmin |
/;admin |
/static/../admin |
---|---|---|---|
浏览器编码 | %3badmin | ;admin | static/../admin |
Shiro解析 | %3badmin | ;admin | static/../admin |
Spring解析 | ;admin | ;admin | admin |
除分号外,以下字符也需注意:
- 反斜杠\
(Windows路径特性)
- Unicode编码字符(如\u002e
)
- URL双重编码(如%252e
)
CVE编号 | 触发条件 | 影响范围 |
---|---|---|
CVE-2020-1957 | Spring+Shiro路径穿越 | Shiro < 1.5.2 |
CVE-2020-11989 | 分号处理差异 | Shiro ≤ 1.5.3 |
CVE-2021-41303 | 正则匹配缺陷 | Shiro < 1.8.0 |
# 使用nmap检测
nmap -p 80,443 --script http-shiro-auth-bypass <target>
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。