CVE-2022-32532 Apache Shiro RegExPatternMatcher 认证绕过漏洞

1.漏洞描述

当Apache Shiro中使用RegexRequestMatcher进行权限配置,且正则表达式中携带"."时,未经授权的远程攻击者可通过构造恶意数据包绕过身份认证,导致配置的权限验证失效。

影响版本

Apache Shiro < 1.9.1

2.漏洞分析

环境搭建

GitHub - Lay0us1/CVE-2022-32532: Apache Shiro CVE-2022-32532 源码

利用vulfoce靶场

漏洞原理

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

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

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

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

源码分析

在shiro-1.90中存在一个RegExPatternMatcher类

RegexRequestMatcher和AntPathMatcher类似,提供请求路径匹配功能及拦截器参数解析的功能。而一般情况下RegexRequestMatcher类是不会在项目中出现,需要用户自己配置

分析RegexRequestMatcher用于匹配的代码。

可以看到,这里正如上面漏洞原理分析的一样,pattern存在带.的正则表达式匹配,若source中存在\r或\n字符时,将判断错误。

而在4ra1n师傅构造的漏洞场景中。

自定义了Filter,增加权限认证场景:

1、判断请求头中的Token是否匹配。

2、如果不存在Token或者Token头错误则认为认证失败。

并且配置了自定义的AccessControlFilter实现类,并将 PatternMatcher配置为RegExPatternMatcher。

同时自定义MyShiroFilterFactoryBean。

继承自ShiroFilterFactoryBean类;设置匹配规则为/permit/.*字符串,表示需要拦截/permit/下所有的路径。

在自定义controller中,配置了/permit/{value}这样从路径取参数的路由和/permit/*这样的通配路由

3.漏洞復現

当访问/permit/any,返回拒绝访问。

当访问/permit/a%0any或/permit/a%0dny时,返回success,即认证成功。

所以在如上满足使用了RegExPatternMatcher类,设置带有.的正则表达式等条件的场景下,利用该漏洞可实现权限认证绕过。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值