shiro權限分析
VSole2021-10-27 15:21:57
寫這個的時候昏昏沉沉的可能有些地方沒說清楚,可以看一下參考鏈接那個老哥說的很詳細。自己 就記錄一下。
CVE-2020-1957
漏洞代碼地址 https://github.com/threedr3am/learnjavabug/blob/master/shiro/auth-bypass(shiro%3C1.5.3)/pom.xml 參考文章 http://wjlshare.com/archives/1591 Apache Shiro <= 1.4.1 Spring 框架中只使用 Shiro 鑒權 先看一下靶場效果,直接訪問bypass會調到鑒權,加一個/就繞過了鑒權

看看filter的鑒權路徑咋寫的。

斷點先下起來再看,在這里getPathWithinApp

進入getRequestUri看看對uri的處理。在decodeAndCleanUriString中判斷了有無;號,在 normalize()中對uri進行了處理。可以看第二個分析比較詳細,這里就簡單說說了。就是對一些字 符進行了優化處理。然后保存在requestUri中,再講requestUri與需要鑒權的路徑做比較。

getChain(),直接跟,在這里就做比較了,因為我們添加了/所以比較失敗返回null,導致了權限 繞過 poc http://localhost:8080/bypass/ http://localhost:8080/login/..;/bypass

CVE-2020-11989
漏洞代碼地址
https://github.com/threedr3am/learnjavabug/blob/master/shiro/auth-bypass(shiro%3C1.5.3)/pom.xml
參考文章
http://wjlshare.com/archives/1591
漏洞產生的原因是因為 Spring 與 Shiro 之間對 url 的處理不同從而導致權限繞過
Apache Shiro <= 1.5.2
Spring 框架中只使用 Shiro 鑒權
需要后端特定的格式才可進行觸發
即:Shiro權限配置必須為 /xxxx/* ,同時后端邏輯必須是 /xxx/{variable} 且 variable 的類型
必須是 String
環境搭建參考參考文章
下個斷點進行調試分析
漏洞原理:利用shiro在做匹配的時候,如果是e0mlja/*格式,則只會匹配e0mlja目錄下,如果再
加一層目錄可繞過匹配,如e0mlja/123/123就繞過了e0mlja/*對123的匹配。也可以利用;取到;之前
的鏈接進行繞過。看看效果


從代碼來看,我們是想要訪問bypass下的目錄的,但是正常訪問會被攔截到登錄頁面。



環境是這么個環境,接下來就開始調試看看具體的內容了。在getPathWithinApplication下個斷點。

進入getRequestUri,看看對url的處理。

進入decodeAndCleanUriString()

根據運行的執行結果來看,這里是對uri進行了一次url解碼。利用indexof(59)來判斷是否存在;號, 有的話返回;前的內容,否則就返回uri的內容。

再進入normalize()函數

從ascii對照表中看到是對\的判斷。來看一下具體的處理。 (1)替換\\為/ (2)替換/.為/ (3)不是/開頭的話添加/

處理完了以后,滿足不存在// /./ /../ 這三種,才進行返回。 直接向下 到這里看看

簡單梳理一下邏輯 (1)先看是否存在filter的設置,不存在返回null (2)獲取我們的請求地址,簡單判斷,然后對我們需要鑒權的路徑進行一個遍歷,看看在不在其中。 (3)判斷完了如果都不存在,則返回null,退出函數。然后不做filter,選擇默認的。能看到是沒 有權限校驗的。



修復 在 Shiro 1.5.3 版本中對 getPathWithinApplication 進行了修改,取消了 url 解碼的函數,所 以我們這里的 uri 并不會被完全解碼,繞過bypass的鑒權 poc: http://localhost:8080/bypass/bypass/aaa%252Faaa http://localhost:8080/;/bypass/bypass/111
CVE-2020-13933
Apache Shiro < 1.6.0
Spring 框架中只使用 Shiro 鑒權
需要后端特定的格式才可進行觸發
即:Shiro權限配置必須為 /xxxx/* ,同時后端邏輯必須是 /xxx/{variable} 且 variable 的類型
必須是 String
我們知道shiro的上版本修復是省去了自動url解碼。這里還是存在繞過的可能。

還是下斷點來看一下,前面兩個已經分析的差不多了關鍵函數,所以這里直接來找不同看看。這里 對;進行了處理。返回了分號之前的內容,也就是我們的兩個bypass。這里通過跟蹤發現,還是繞過 了鑒權的uri。感覺和之前的/繞過有點契合。對比一下,高版本少了一次url的解碼。其他的就不多 說了 和前兩個分析一樣 poc http://localhost:8080/bypass/bypass/%3b123



CVE-2020-17523
Apache Shiro < 1.7.1
Spring 框架中只使用 Shiro 鑒權
需要后端特定的格式才可進行觸發
即:Shiro權限配置必須為 /xxxx/* ,同時后端邏輯必須是 /xxx/{variable} 且 variable 的類型
必須是 String
poc
http://localhost:8080//bypass/bypass/%20
這個就不過多重復分析了,還有一點需要注意的就是spring對uri的處理,否則傳入的錯誤路徑可能
會導致有問題。最后復現的時候需要注意java的版本,高版本可能會導致環境搭建不成功。

前面都是大同小異,來看看不同的 domatch這里,

這里自動將空格去除了。也就是說形成了/bypass/bypass/這種,而/*未匹配到東西,所以不會調到 鑒權頁面



poc http://localhost:8080/bypass/bypass/%20
VSole
網絡安全專家
