shiro身份认证漏洞研究

举报
亿人安全 发表于 2023/08/29 14:48:18 2023/08/29
【摘要】 Apache Shiro 身份认证绕过漏洞 (CVE-2022-32532)Apache Shiro 是一个强大且易用的 Java 安全框架,通过它可以执行身份验证、授权、密码和会话管理。使用 Shiro 的易用 API,您可以快速、轻松地保护任何应用程序 —— 从最小的移动应用程序到最大的 WEB 和企业应用程序。2022年6月29日,Apache官方披露Apache Shiro权限绕过漏...

Apache Shiro 身份认证绕过漏洞 (CVE-2022-32532)

Apache Shiro 是一个强大且易用的 Java 安全框架,通过它可以执行身份验证、授权、密码和会话管理。使用 Shiro 的易用 API,您可以快速、轻松地保护任何应用程序 —— 从最小的移动应用程序到最大的 WEB 和企业应用程序。

2022年6月29日,Apache官方披露Apache Shiro权限绕过漏洞(CVE-2022-32532),当Apache Shiro中使用RegexRequestMatcher进行权限配置,且正则表达式中携带"."时,未经授权的远程攻击者可通过构造恶意数据包绕过身份认证,导致配置的权限验证失效。

影响版本:

Apache Shiro <1.9.1

漏洞检测

在config\pom.xml的version标签中查看当前使用的shiro版本号。

漏洞原理

在正则表达式中元字符.是匹配除换行符(\n、\r)之外的任何单个字符。

要匹配包括 \n 在内的任何字符,需使用像(.|\n)的模式。

在java中的正则默认情况下.也同样不会包含\n、\r字符,因此在一些场景中,使用正则.的规则就有可能被绕过。

新增Pattern.DOTALL模式后,正则表达式.就可以匹配任何字符包括换行符。

在shiro-core-1.9.0.jar中存在一个RegExPatternMatcher类,提供请求路径匹配功能及拦截器参数解析的功能。pattern存在带.的正则表达式匹配,若source中存在\r或\n字符时,将判断错误。

漏洞利用

1、访问站点

直接访问ip:端口,抓包如下


2、get方式/permit/any不加token

把抓到的包放到重发模块,以get方式/permit/any

访问被拒绝

3、get方式/permit/any加token

把抓到的包放到重发模块,以get方式/permit/any,并加token进行身份认证

访问成功


4、使用 %0a 进行权限绕过

把抓到的包放到重发模块,以get方式/permit/a%0any

访问成功


修复建议

目前Apache官方已发布此漏洞修复版本,建议用户尽快升级至Apache Shiro 1.9.1及以上版本。

https://github.com/apache/shiro/releases/tag/shiro-root-1.9.1

Apache Shiro身份验证绕过漏洞(CVE-2022-40664)

漏洞简介:

Apache Shiro是一款功能强大且易于使用的Java安全框架,主要包含身份验证、授权、加密和会话管理等功能,可用于保护任何应用程序。

身份验证:用户登录

授权:访问控制

加密:保护或隐藏数据不被窥探

会话管理:管理每个用户的状态

Apache Shiro身份验证绕过漏洞,是通过RequestDispatcher转发或包含时Shiro中的身份验证绕过而产生的漏洞。在Apache Shiro 1.10.0之前,攻击者可构造恶意代码利用该漏洞绕过shiro的身份验证,从而获取用户的身份权限

影响范围

Apache Shiro < 1.10.0

修复建议

直接升级,升级补丁链接如下:

https://shiro.apache.org/download.html

漏洞复现

该漏洞是代码中函数逻辑问题导致的。当代码中存在一些特殊的调用和逻辑时,就可能触发该漏洞,因此远程请求是合法请求,没有恶意特征,安全厂商暂无法提取规则。

APACHE SHIRO身份认证绕过漏洞(CVE-2023-22602)

漏洞概述

近日,发现Apache官方修复了一个身份认证绕过漏洞。当在2.6+版本的Spring Boot中使用Apache Shiro,且Shiro与Spring Boot使用不同的路径匹配模式时,无需身份验证的攻击者可以用此漏洞构造特制的HTTP请求绕过身份验证访问后台功能,请相关用户采取措施进行防护。

Apache Shiro是一个功能强大且易于使用的Java安全框架,功能包括身份验证、授权、加密和会话管理。使用Shiro的API,可以轻松地、快速地保护任何应用程序,范围从小型的移动应用程序到大型的Web和企业应用程序。

参考链接:

https://lists.apache.org/thread/dzj0k2smpzzgj6g666hrbrgsrlf9yhkl

影响范围

受影响版本

  • Apache Shiro < v1.11.0

不受影响版本

  • Apache Shiro >= v11.0

漏洞检测

  • 人工检测

相关用户可通过版本检测的方式判断当前应用是否存在风险。

①在config\pom.xml的version标签中查看当前使用的shiro版本号:

②在pom.xml的version标签中查看当前使用的Spring Boot版本号:

漏洞分析:

在Shiro中,ShiroFilter 是整个 Shiro 的入口点,用于拦截需要安全控制的请求进行处理。使用filterChainDefinitions(filterChainDefinitions是Shiro连接约束配置,通过对应的参数定义权限相关的filter Chain,验证顺序是自上而下,从左往右)声明url和filter对应的权限控制关系。

常见的filterChainDefinitions参数如下:

参数

对应的Filter

作用

身份验证相关

authc

org.apache.shiro.web.filter. authc.FormAuthentication Filter

表示需要认证通过后才可以访问

logout

org.apache.shiro.web.filter. authc.LogoutFilter

表示退出成功后重定向的地址

anon

org.apache.shiro.web.filter. authc.AnonymousFilter

表示可以非登陆状态下匿名使用,一般静态资源和登陆接口会用到比较多

授权相关

<br/>

<br/>

roles

org.apache.shiro.web.filter. authz.RolesAuthorizationF ilter

表示必须拥有相关角色才可以访问

perms

org.apache.shiro.web.filter. authz.PermissionsAuthoriz ationFilter

表示必须拥有相关权限

这里使用注解的方式,通过Shiro的Filter工厂,设置对应的过滤条件和跳转条件:

@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean(){
    ShiroFilterConfiguration shiroFilterConfiguration = new ShiroFilterConfiguration();
    shiroFilterConfiguration.setStaticSecurityManagerEnabled(true);

    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
    bean.setShiroFilterConfiguration(shiroFilterConfiguration);

    bean.setSecurityManager(securityManager());
    bean.setLoginUrl("/login");
    bean.setSuccessUrl("/index");
    bean.setUnauthorizedUrl("/unauthorizedurl");
    Map<String, String> map = new LinkedHashMap<>();
    map.put("/doLogin", "anon");
    map.put("/admin/*", "authc");
    bean.setFilterChainDefinitionMap(map);
    return  bean;
}

相关的路由Controller:

@GetMapping("/admin/page")
public String admin() {
    return "admin page";
}


@GetMapping("/admin/{*path}")
public String adminBypass(@PathVariable String path) {
    System.out.println(path);
    return "admin Bypass page";
}

根据上面filterChainDefinitions的配置,当访问/admin/下的目录时,如果没有认证通过,会重定向到login页面:

根据前面的分析,同样的,路由/admin/{*path}正常情况下也覆盖了:

根据前面的分析,实际上, {*spring} 是可以匹配剩余所有path的,类似 /** ,只是功能更强,可以获取到这部分动态匹配到的内容。

结合这一点,因为1.11.0 及之前版本的 Shiro 只兼容 Spring 的ant-style路径匹配模式(pattern matching),而/admin/*只能匹配他的下级目录,结合两种模式的区别在特定场景下可以绕过了对应的权限控制:

除此之外,应该还有其他的绕过场景。

对比下shiro1.11.0跟1.10.1的改动,可以发现主要是通过Spring动态的读取文件留下的扩展接口来将路径匹配模式修改为 AntPathMatcher :

这里简单的做下测试,将shiro版本修改成1.11.0:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.11.0</version>
</dependency>

同样的尝试访问/admin/{*path}接口,此时返回500异常:

查看对应的Exception日志,可以看到提示AntPathMatcher不支持{*path}这种方式,说明已经切换路径匹配模式为 AntPathMatcher 了:

修复建议

  1. 升级到 1.11.0 或更高版本
  2. 开发者可通过修改 Spring boot 的路径匹配模式为 AntPathMatcher 缓解此漏洞:
spring.mvc.pathmatch.matching-strategy = ant_path_matcher
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。