前言
結(jié)合自身經(jīng)歷,在使用正則表達(dá)式去匹配流量特征時(shí),由于正則表達(dá)式中元字符“.”不匹配換行符(\n、\r)導(dǎo)致一直提取不上所需的流量。而如今,之前踩過(guò)的坑卻出現(xiàn)在了Apache Shiro框架之中……
漏洞描述
6月29日,Apache 官方披露 Apache Shiro 權(quán)限繞過(guò)漏洞(CVE-2022-32532),當(dāng) Apache Shiro 中使用 RegexRequestMatcher 進(jìn)行權(quán)限配置,且正則表達(dá)式中攜帶“.”時(shí),未經(jīng)授權(quán)的遠(yuǎn)程攻擊者可通過(guò)構(gòu)造惡意數(shù)據(jù)包繞過(guò)身份認(rèn)證。
相關(guān)介紹
Apache Shiro 是一個(gè)功能強(qiáng)大且易于使用的 Java 安全框架,它可以執(zhí)行身份驗(yàn)證、授權(quán)、加密和會(huì)話管理,可以用于保護(hù)任何應(yīng)用程序——從命令行應(yīng)用程序、移動(dòng)應(yīng)用程序到最大的 web 和企業(yè)應(yīng)用程序。
利用范圍
Apache Shiro < 1.9.1
漏洞分析
環(huán)境搭建
這里使用此漏洞提交者4ra1n 師傅的漏洞demo(https://github.com/4ra1n/CVE-2022-32532)進(jìn)行復(fù)現(xiàn)分析。
漏洞原理
在漏洞分析之前,先了解一下相關(guān)漏洞產(chǎn)生原理。
在正則表達(dá)式中元字符.是匹配除換行符(\n、\r)之外的任何單個(gè)字符。
要匹配包括 \n 在內(nèi)的任何字符,需使用像(.|\n)的模式。
結(jié)合4ra1n師傅的分析,在java中的正則默認(rèn)情況下.也同樣不會(huì)包含\n、\r字符,因此在一些場(chǎng)景中,使用正則.的規(guī)則就有可能被繞過(guò)。
新增Pattern.DOTALL模式后,正則表達(dá)式.就可以匹配任何字符包括換行符。
源碼分析
結(jié)合shiro源碼和漏洞場(chǎng)景分析,在shiro-core-1.9.0.jar中存在一個(gè)RegExPatternMatcher類。
org.apache.shiro.util.RegExPatternMatcher.class。
RegexRequestMatcher和AntPathMatcher類似,提供請(qǐng)求路徑匹配功能及攔截器參數(shù)解析的功能。而一般情況下RegexRequestMatcher類是不會(huì)在項(xiàng)目中出現(xiàn),需要用戶自己配置。
分析RegexRequestMatcher用于匹配的代碼。
可以看到,這里正如上面漏洞原理分析的一樣,pattern存在帶.的正則表達(dá)式匹配,若source中存在\r或\n字符時(shí),將判斷錯(cuò)誤。
而在4ra1n師傅構(gòu)造的漏洞場(chǎng)景中。
自定義了Filter,增加權(quán)限認(rèn)證場(chǎng)景:
1、判斷請(qǐng)求頭中的Token是否匹配。
2、如果不存在Token或者Token頭錯(cuò)誤則認(rèn)為認(rèn)證失敗。
并且配置了自定義的AccessControlFilter實(shí)現(xiàn)類,并將 PatternMatcher配置為RegExPatternMatcher。
同時(shí)自定義MyShiroFilterFactoryBean。
繼承自ShiroFilterFactoryBean類;設(shè)置匹配規(guī)則為/permit/.*字符串,表示需要攔截/permit/下所有的路徑。
在自定義controller中,配置了/permit/{value}這樣從路徑取參數(shù)的路由和/permit/*這樣的通配路由。
漏洞復(fù)現(xiàn)
當(dāng)訪問(wèn)/permit/any,返回拒絕訪問(wèn)。
當(dāng)訪問(wèn)/permit/a%0any或/permit/a%0dny時(shí),返回success,即認(rèn)證成功。
所以在如上滿足使用了RegExPatternMatcher類,設(shè)置帶有.的正則表達(dá)式等條件的場(chǎng)景下,利用該漏洞可實(shí)現(xiàn)權(quán)限認(rèn)證繞過(guò)。