CVE-2010-3863源码分析与漏洞复现


漏洞概述

CVE-2010-3863 是 Apache Shiro(原 JSecurity)框架中的路径标准化缺陷漏洞,影响版本为 Shiro 1.1.0 之前。攻击者通过构造包含冗余字符(如 **/./**、//../)的 URL 绕过权限校验逻辑,直接访问受保护的资源(如/admin接口)。本报告基于用户提供的源码进行详细分析。


技术细节分析

1. 漏洞成因
  • 路径匹配逻辑缺陷:Shiro 的权限校验逻辑依赖 AntPathMatcher 进行路径匹配,但未对请求 URI 进行规范化处理。攻击者可通过冗余字符构造非标准路径(如 /./admin),绕过权限检查。
  • 过滤器链配置问题ShiroFilterFactoryBean 中定义的路径规则(如 /admin/**)未与实际请求的规范化路径匹配,导致校验失效。
2. 源码分析
关键代码 1:Shiro 过滤器链配置(ShiroConfig.java)
1
2
3
4
5
6
7
8
9
10
11
@Bean(name = {"shiroFilter"})
ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager);
Map<String, String> map = new LinkedHashMap<>();
map.put("/doLogin", "anon"); // 允许匿名访问登录接口
map.put("/admin/**", "user"); // 要求用户认证访问 /admin 路径
map.put("/**", "anon"); // 其他路径允许匿名访问
bean.setFilterChainDefinitionMap(map);
return bean;
}

问题点

  • 权限规则 /admin/** 通过 AntPathMatcher 匹配请求 URI,但未对请求路径进行标准化处理。
  • 当请求路径为 /./admin/admin// 时,AntPathMatcher 将其视为与 /admin/** 不同的路径,导致 user 过滤器未触发,直接放行请求。
关键代码 2:用户控制器(UserController.java)
1
2
3
4
@RequestMapping("/admin")
public String helloPage() {
return "admin"; // 受保护的 admin 页面
}
  • 即使控制器明确定义了 /admin 接口,Shiro 的权限校验逻辑仍可能因路径未标准化而绕过。
关键代码 3:路径匹配逻辑(Shiro 内部实现推测)
1
2
3
4
// 旧版 Shiro 的 AntPathMatcher 逻辑(简化)
public boolean match(String pattern, String path) {
return path.startsWith(pattern); // 简单前缀匹配
}
  • 若请求路径为 /./adminAntPathMatcher 不会将其标准化为 /admin,直接匹配失败,绕过权限校验。

漏洞复现步骤

1.启动vulhub里的靶场

upload successful

2.访问8080端口,请求/admin,返回302

upload successful

3.构造恶意请求/./admin,会返回登陆成功

upload successful

修复方案

  1. 升级 Shiro 版本:升级至 **Shiro 1.1.0+**,该版本默认对请求路径进行标准化处理。
  2. 强制路径规范化:在 ShiroFilterFactoryBean 前添加自定义过滤器,强制标准化请求 URI:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class NormalizePathFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
    String uri = request.getRequestURI();
    String normalizedUri = UriUtils.normalizePath(uri); // 标准化路径
    request = new NormalizedHttpServletRequestWrapper(request, normalizedUri);
    chain.doFilter(request, response);
    }
    }
  3. 细化权限规则:避免使用宽松的 /** 规则,明确保护所有敏感路径。

总结

通过分析源码可知,CVE-2010-3863 的根源在于 Shiro 未对请求路径进行标准化处理,导致权限校验逻辑被绕过。修复需结合框架升级与路径规范化机制,确保权限规则与标准化后的路径严格匹配。开发者应始终对用户输入的路径进行规范化处理,避免类似漏洞。


CVE-2010-3863源码分析与漏洞复现
https://spinage.top/2025/06/28/CVE-2010-3863源码分析与漏洞复现/
作者
spinage
发布于
2025年6月28日
许可协议