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.11.0 或更高版本
- 开发者可通过修改 Spring boot 的路径匹配模式为 AntPathMatcher 缓解此漏洞:
spring.mvc.pathmatch.matching-strategy = ant_path_matcher
- 点赞
- 收藏
- 关注作者
评论(0)