学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

渗透技巧 1年前 (2022) admin
628 0 0

在搜文章的过程中看到先知上的《CVE-2022-22978 Spring Security RegexRequestMatcher 认证绕过及转发流程分析》,刚好自己对spring了解不多。就跟着学习一下文中作者对spring的高低版本对业务转发的分析,记录一下笔记。



>>>环境搭建

环境搭建非常简单,可以直接参考上面提到的文章内容或者白帽汇的《Spring Security RegexRequestMatcher 认证绕过漏洞分析(CVE-2022-22978)》。也可以直接使用零号靶场:http://galaxy.pingan.com.cn/pingan/range/detail/3789


>>>漏洞分析

正则中,通常用点号.来匹配任意字符,但是默认情况下,它不会匹配换行符的(linux下n)。而在RegexRequestMatcher中,就采用了默认匹配,导致可以向url中插入%0a(n)或%0d(d)就绕过正则匹配,从而绕过Spring Security的认证,成功请求后端资源。
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
可以看到在有漏洞的5.6.3版本中,DEFAULT = 0,而在5.6.4版本中设置了DEFAULT = Pattern.DOTALL。

通过使用Pattern.DOTALL,就改变了正则中.的默认匹配行为,使得.会匹配包括n、r在内的任意字符。

Spring 2.5.3的测试结果


将依赖改为spring 2.5.3,使用同样的payload进行测试,这时可以绕过Spring Security的认证,但是请求无法找到后端资源进行处理。

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

这时候要想搞明白为什么在不同版本下程序会由不同的表现,就需要去看一看spring处理路由的代码了。

调试跟踪


以2.7.2版本的代码来进行调试跟踪。

在Dispatcher中找到获取Handler的位置下断


学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

一路跟踪下来,最终会来到pathPatternsCondition分支,而在2.5.3版本中,会进入patternsCondition分支。

它们分别调用PathPatternsCondition#getMatchingConditionPatternsCondition#getMatchingCondition

version2.7.2 – PathPatternsCondition


一路往下跟踪,最终由于路由配置中使用了*,对应WildcardPathElement,在其中不会利用正则匹配,而是匹配到所在位置有内容,则返回true。

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程


version2.5.3 – PatternsCondition


而在PatternsCondition#getMatchingCondition中,一路跟踪,Spring会取出对应位置,然后进行字符串的正则匹配。

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

而this.pattern为java.util.regex.Pattern对象,在默认情况下它同样只会匹配换行符之外的字符。所以对于此处传入的路径无法正确匹配,返回false,最终导致无法找到handler。


学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

>>>区别


综上所述,其实2.7.2和2.5.3两个版本的不同在于,在RequestMappingInfo#getMatchingCondition中,由于前期创建的RequestMappingInfo有差异,导致进入了不同的分支。


RequestMappingInfo取自RequestMappingHandlerMapping.mappingRegistry,关于MappingRegistry的注册过程直接参考:https://blog.csdn.net/weixin_42859458/article/details/118332596


直接在registerHandlerMethod中下断,回溯调用栈可以发现RequestInfo通过getMappingForMethod创建。


学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

最终调用到RequestMappingInfo.Builder#build

在这里面2.7.2和2.5.3的实现就有所不不同了

2.7.2中this.options.patternPatser!=null,进入if块,创建了PathPatternsReuqestCondition,而patternsCondition为null。

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

在2.5.3则情况相反,this.options.patternParser == null,进入else块,创建PatternsCondition,而pathPatternsCondition为null。

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程


正则表达式单行模式


单行模式(single line mode): 使得 通配符点”.” 匹配所有字符,包括换行符(默认情况下,点是不会匹配换行符的)。不过这个模式不被Javascript和Ruby支持。
所以其实就算Spring Security没有做升级修复,也可以通使用单行模式,增加对换行符的匹配,从而避免被绕过。


参考

1. Spring Security RegexRequestMatcher 认证绕过漏洞分析(CVE-2022-22978)

https://nosec.org/home/detail/5006.html

2. CVE-2022-22978 Spring Security RegexRequestMatcher 认证绕过及转发流程分析

https://xz.aliyun.com/t/11473



银河实验室

学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

银河实验室(GalaxyLab)是平安集团信息安全部下一个相对独立的安全实验室,主要从事安全技术研究和安全测试工作。团队内现在覆盖逆向、物联网、Web、Android、iOS、云平台区块链安全等多个安全方向。
官网:http://galaxylab.pingan.com.cn/



往期回顾


技术

Hadoop 未授权REST API漏洞利用参考

技术

Tomcat WebSocket内存马实现原理

技术

利用Outlook规则,实现RCE

技术

内网渗透软件-BloodHound使用指南



PSRC双11闯关挑战开启!翻倍奖励+闯关奖励High翻全场!学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程
学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程


点赞、分享,感谢你的阅读▼ 


▼ 点击阅读原文,进入官网

原文始发于微信公众号(平安集团安全应急响应中心):学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程

版权声明:admin 发表于 2022年10月8日 下午6:00。
转载请注明:学习笔记 | Spring Security RegexRequestMatcher 认证绕过及转发流程 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...