文章总结: 文章分析了正则表达式中点号不能匹配换行符的特性导致的安全漏洞,特别关注了ApacheShiro和SpringSecurity框架中的鉴权绕过问题。通过CVE-2022-32532和CVE-2022-22978两个案例,展示了如何使用%0a%0d绕过URL路径鉴权,并提供了修复方案,如在pattern中添加DOTALL标志。文章提醒开发者在处理URL匹配时需注意换行符可能带来的安全风险。 综合评分: 100 文章分类: 漏洞分析,WEB安全,代码审计,漏洞POC,应用安全
【JAVA安全研究】鉴权绕过 %0a%0d 的 “隐形陷阱” Spring与Shrio中 Matcher的鉴权绕过 CVE-..
原创
Shelter1234
安全研究员
2025年12月20日 12:58 浙江
我们知道在表达式中”.”是一个特殊字符,表示匹配任意单个字符,”*”星号表示匹配其前面的字符 0次或多次。
但是注意了”.” 有一个字符不能做到匹配!——”\n” 换行符
且看下面的代码
flag1输出的true 是匹配上了的
但是flag2由于字符中含有”\n”换行符,没有匹配上。
如果想要匹配上换行符,需要这么做,给pattern加上添加 Pattern.DOTALL 标志(0x20)
输出
那么这种匹配上的差异会带来什么样的安全问题呢!
举个例子像shiro spring这样的框架,在做鉴权的时候大多用的就是正则匹配 ,如果用户输入了%0a%0d 在这种差异下是不是会产生绕过呢!
实战审计
Apache Shiro 身份认证绕过漏洞 (CVE-2022-32532)
在shiro-core-1.9.0.jar中存在一个RegExPatternMatcher类
shiro-core
org.apache.shiro.util.RegExPatternMatcher.class。
在shiro的调用链中
getChain get requestURL后 交给RegExPatternMatcher去处理,传入的pattern也是我们定义好的表达式(在my filter中)
假如我们有如下的接口—–使用url路径的方式进行传参<—仅仅这种的才影响
正常访问下被拒绝
使用%0a或%d绕过
后续修复
https://github.com/apache/shiro/commit/6bcb92e06fa588b9c7790dd01bc02135d58d3f5b
给pattern 加上看dotALL
Spring Security RegexRequestMatcher 认证绕过漏洞(CVE-2022-22978)
在漏洞影响版本中
org.springframework.security.web.util.matcher.RegexRequestMatcher的patten编译如下
pattern的调用如下,是对url进行匹配
那么假如我们有如下的pringSecurityConfig鉴权配置,
也就是说/admin/ 下是需要鉴权才能访问的。
我们可以利用换行符进行绕过
不使用换行符的情况下
使用 %0a%0d 进行绕过,访问没有被禁止成功访问到manage页面
看一看执行的流程
这里循环提取做pattern匹配
在RegexRequestMatcher中对request的url进行matches
参考链接
https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22978/README.zh-cn.md
https://github.com/DeEpinGh0st/CVE-2022-22978
https://github.com/Lay0us/CVE-2022-32532
查看原文:《【JAVA安全研究】鉴权绕过 %0a%0d 的 “隐形陷阱” Spring与Shrio中 Matcher的鉴权绕过 CVE-..》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论