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)
@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)
@RequestMapping("/admin")
public String helloPage() {
    return "admin"; // 受保护的 admin 页面
}
  • 即使控制器明确定义了 /admin 接口,Shiro 的权限校验逻辑仍可能因路径未标准化而绕过。
关键代码 3:路径匹配逻辑(Shiro 内部实现推测)
// 旧版 Shiro 的 AntPathMatcher 逻辑(简化)
public boolean match(String pattern, String path) {
    return path.startsWith(pattern); // 简单前缀匹配
}
  • 若请求路径为 /./adminAntPathMatcher 不会将其标准化为 /admin,直接匹配失败,绕过权限校验。

漏洞复现步骤

1.启动vulhub里的靶场

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

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


修复方案

  1. 升级 Shiro 版本:升级至 Shiro 1.1.0+,该版本默认对请求路径进行标准化处理。
  2. 强制路径规范化:在 ShiroFilterFactoryBean 前添加自定义过滤器,强制标准化请求 URI:
    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 未对请求路径进行标准化处理,导致权限校验逻辑被绕过。修复需结合框架升级与路径规范化机制,确保权限规则与标准化后的路径严格匹配。开发者应始终对用户输入的路径进行规范化处理,避免类似漏洞。

posted @ 2025-06-15 20:46  网安spinage  阅读(84)  评论(0)    收藏  举报