0x01 Apache Shiro
Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。
0x02 漏洞簡介
2021年2月1日,Apache Shiro官方發布漏洞通告,漏洞編號為:CVE-2020-17523。
當Apache Shiro與Spring框架結合使用時,攻擊者可以通過構造特殊的HTTP請求數據包,繞過身份認證匹配規則。
0x03 漏洞復現
環境搭建
使用tomcat部署shiro1.7.0.war包。
公眾號回復shiro
獲取下載鏈接。
復現過程
訪問admin下面的資源/admin/1
跳轉到登錄界面:
使用payload:/admin/%20
繞過身份驗證,成功訪問admin頁面:
0x04 漏洞分析
漏洞成因
代碼中,Shiro會對請求的uri進行鑒權操作,Shiro的校驗uri的函數為PathMatches
,當PathMatches
返回true
時才會進入鑒權。
然而PathMatches("/admin/*","/admin/ ")
返回結果為false
,因此訪問/admin/
這個uri時Shiro不會進行鑒權操作,
但是Spring接收到的uri則是/admin/%20
,會正常返回響應admin page
。
代碼分析
代碼執行過程中調用tokenizeToStringArray
方法,而當調用此方法時trimTokens
參數值為true
:
而在tokenizeToStringArray
方法中,trimTokens
為true
時調用了trim()
函數,去除了空格字符,導致未進行鑒權操作:
簡單總結下,在存在漏洞Shiro版本中,執行tokenizeToStringArray
方法時trimTokens
值為true
,導致uri中的空格字符被清除,因此代碼並沒有經過鑒權處理,然而Spring接受到的uri:/admin/%20
會正常返回響應,最終導致身份驗證被繞過。
利用Shiro與Spring處理uri的不同規則繞過身份驗證。
0x05 影響版本
Apache Shiro < 1.7.1
0x06 修復方案
官方修復方案中,將tokenizeToStringArray
方法中的trimTokens
置為false
建議升級到Apache Shiro 1.7.1版本
公眾號回復shiro獲取漏洞環境