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獲取漏洞環境
