一、漏洞名稱:
Apache Shiro 身份驗證繞過漏洞復現
二、漏洞編號:
CVE-2020-1957,CVE-2020-17523
三、漏洞描述:
Apache Shiro多個版本中存在認證繞過漏洞,攻擊者可構造特殊的請求繞過身份驗證訪問目標服務,
四、影響版本:
Apache Shiro <= 1.7.0
五、漏洞分析
Shiro框架通過攔截器功能對用戶訪問權限進行控制,如anon,authc等攔截器,anon為匿名攔截器,不需要登錄即可訪問,authc為登錄攔截器,需要登錄才能訪問,Shiro的URL路徑運算式為Ant格式,匹配規則如下:
| Wildcard | Description |
|---|---|
| ? | 匹配任何單字符 |
| * | 匹配0或者任意數量的字符 |
| ** | 匹配0或者更多的目錄 |
CVE-2020-1957:
- 第一個問題點在于URL路徑的匹配機制的差異:在Shiro中
/hello/*可以匹配/hello/123,但無法匹配/hello/123/,而在spring框架的映射機制中/hello/123/也可以匹配到/hello/123,從而產生了繞過,在shiro1.5.0中修復了該漏洞 - 第二個問題點在于URL路徑獲取機制的差異:在shiro中只取分號前面的路徑,而在spring中會將分號前后的路勁進行拼接,從而產生繞過,
CVE-2020-17523 :
- 和 CVE-2020-1957 一樣,在
domatch()的匹配機制中對url和pattern做匹配時,shiro對url路徑做了去除空格的操作,與spring本身對URL的處理產生差異導致漏洞的產生
六、實驗環境及準備:
- 下載演示代碼,或者自己寫也行,這邊直接在github下載shiro的專案:
下載地址:https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic - 匯入到IDEA中修改shiro認證攔截規則和映射地址


七、復現步驟:
1. 末尾空格繞過

復現很簡單,主要在于代碼分析和跟蹤
-
第一個點入口在
AbstractShiroFilter的getExecutionChain函式中,

-
進而追蹤到
PathMatchingFilterChainResolver的getChain函式中,該函式作用根據URL路徑匹配中配置的url路徑運算式來匹配輸入的URL,判斷是否匹配攔截器,匹配成功將會回傳回應的攔截器執行鏈,讓ShiroFither執行權限操作的,其對于URL路徑運算式和輸入URL的匹配主要通過pathMathches函式進行匹配,到這里根據Ant的匹配規則就知道,這里不會匹配上任何攔截器,從而繞過了認證攔截,

-
繼續跟進的話,會到AntPathMatcher的doMatch函式中做具體匹配作業,感興趣的可以繼續研究,

-
Shiro的攔截過了之后就到了spring的路由分發程序,從DispatcherServlet#doService開始跟進

主要跟蹤獲取Handler的程式

最終跟到PatternsRequestCondition#getMatchingPattern,關鍵代碼如下,將pattern加上/再和URL進行匹配,這樣就正好匹配上了

2. 穿插分號繞過
升級shiro版本到1.5.0后,末尾斜杠的方法無法繞過

通過插入分號的方式成功繞過

代碼跟蹤
-
還是和上面一樣從同一個入口進去,跟蹤到獲取URL地址的地方
PathMatchingFilterChainResolver#getChain

-
一直可以跟進到URL規范化處理函式中

-
跟進到最終處理的函式中
WebUtils#decodeAndCleanUriString,對URL字串進行了截取

-
而在spring的URL處理中,對分號前后的字串進行了拼接,從
DispatcherServlet# doDispatch一直跟到UrlPathHelper#removeSemicolonContentInternal就可以看到URL獲取及清理的整個程序


由于兩個地方對URL清理的差異化導致shiro認證攔截器的繞過并能訪問到目標服務,
3. 末尾空格繞過

-
直接跟進到
AntPathMatcher.class中獲取路徑串列

-
繼續一直跟進到
tokenizeToStringArray函式中,可以看到去除空格的操作

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293513.html
標籤:其他
上一篇:機器學習在神策資料的應用
下一篇:攻防世界 WEB upload1
