浅谈Apache shiro 权限绕过漏洞(CVE-2023-34478)
字数 1864 2025-08-06 08:34:54
Apache Shiro 权限绕过漏洞(CVE-2023-34478)深度分析
0x00 漏洞背景
Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能。CVE-2023-34478 是一个与路径解析差异相关的权限绕过漏洞,影响非 Spring 框架特定场景下的 Shiro 使用。
0x01 漏洞描述
该漏洞允许攻击者通过构造特定格式的请求路径,在非 Spring 框架环境下(如 Jersey)绕过 Shiro 的身份验证机制。这是由于 Shiro 与 Jersey 框架对路径解析处理方式不同导致的。
0x02 技术原理分析
2.1 Shiro 请求解析机制
Shiro 的请求解析主要发生在 org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 方法中:
-
路径获取:通过
getPathWithinApplication方法获取应用程序内的 URI 相对路径- 使用
request.getServletPath() + request.getPathInfo()获取原始 URI - 调用
removeSemicolon移除分号 - 调用
normalize方法处理路径
- 使用
-
路径规范化:
normalize方法会处理路径穿越符 (../或./),确保路径不会超出应用范围 -
过滤器链匹配:最终根据处理后的 URL 进行路径匹配,确定需要执行的过滤器链
2.2 Jersey 请求解析机制
Jersey 的请求处理流程:
-
核心处理:通过
ApplicationHandler.handle方法处理请求,最终调用this.runtime.process(request) -
路由阶段:
- 使用
Stages.process()方法处理请求 - 主要依赖
org.glassfish.jersey.server.internal.routing.RoutingStage解析请求 URI
- 使用
-
路径处理特点:
- 调用
encodedRelativePath获取编码后的相对路径 - 使用
stripMatrixParams剔除 URI 中的矩阵参数 - 关键差异:Jersey 不会对路径穿越符 (
../) 进行额外处理
- 调用
2.3 解析差异导致的安全问题
当 Shiro 和 Jersey 同时使用时:
- Shiro 会规范化路径中的
../,认为请求是合法的 - Jersey 不处理
../,直接按原始路径路由 - 这种差异导致攻击者可以构造特殊路径绕过 Shiro 的认证检查
0x03 漏洞复现
环境配置示例
- Shiro 配置:
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean() {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager());
bean.setLoginUrl("/login");
bean.setSuccessUrl("/index");
bean.setUnauthorizedUrl("/unauthorizedurl");
Map<String, String> map = new LinkedHashMap<>();
map.put("/doLogin/", "anon");
map.put("/api/**", "authc"); // 要求认证
bean.setFilterChainDefinitionMap(map);
return bean;
}
- Jersey 资源类:
@GET
@Path("/{path : .*}") // 匹配任意路径
public Response getUser(@PathParam("path") @Encoded String path) {
return Response.ok().entity(path).build();
}
攻击方式
- 正常访问
/api/page会被重定向到登录页面(302) - 构造特殊请求:
/api/../page或 URL 编码形式/api/%2e%2e/page- Shiro 解析为
/api/page,要求认证 - Jersey 解析为
/page,绕过认证检查
- Shiro 解析为
0x04 修复方案
Shiro 官方修复
- 引入
InvalidRequestFilter过滤器 - 在
isValid方法中增加containsTraversal检查:- 检测
./、../等路径穿越符 - 考虑 URL 编码绕过情况(如
%2e%2e/)
- 检测
其他安全建议
-
Spring Security 参考方案:
- 使用
StrictHttpFirewall拦截非法请求 - 拦截内容包括:
- 分号 (
;,%3b,%3B) - 斜杠 (
%2f,%2F) - 反斜杠 (
\,%5c,%5B) - URL 编码的百分号 (
%25) - 英文句点 (
.,%2e,%2E)
- 分号 (
- 使用
-
通用防御措施:
- 保持框架版本更新
- 实施多层防御机制
- 对关键接口进行额外权限校验
0x05 总结
CVE-2023-34478 展示了当安全框架与其他 Web 框架配合使用时,由于路径解析逻辑差异可能导致的安全问题。开发者应当:
- 充分了解各框架的请求处理机制
- 及时应用安全补丁
- 实施深度防御策略
- 对关键接口进行独立权限验证
该漏洞也提醒我们,在微服务架构中,不同组件间的安全假设必须保持一致,否则可能产生安全边界被突破的风险。