首頁 > 運維 > 安全 > Apache Shiro 1.2.4反序列化漏洞實例分析

Apache Shiro 1.2.4反序列化漏洞實例分析

王林
發布: 2023-05-16 19:40:24
轉載
1053 人瀏覽過

0x00 Apache Shiro

這個元件的漏洞很久之前就爆出來了,但是最近工作又遇到了,剛好最近也在看Java反序列化的東西,所以決定拿出來再分析一下,期間也遇到了一些奇怪的問題。

網路上的分析文章大部分都是手動加入了commons-collections4-4.0的依賴,目的是為了使用ysoserial產生的CommonsCollections2這個payload,然而我遇到的情況是使用了CommonsBeanutils1就可以直接打成功,所以這裡我們不再重複網路上對CommonsCollections2的分析了。

0x01 偵錯分析

偵錯環境:

JDK 1.8.0_72

Tomcat 8.0.30

#首先我們把shiro的源碼clone回來,並切到有問題的分支上去。

git clone https://github.com/apache/shiro.git shiro-rootcd shiro-root
git checkout 1.2.0
登入後複製

為了能讓shiro自帶的sample跑起來,要對samples/web/pom.xml檔案做一些修改,需要將jstl的版本改為1.2,並且刪掉servlet-api的scope字段。把jstl-1.2.jar放到WEB-INF/lib目錄下。然後應該就可以跑起來並且調試了。

我們將斷點打到org.apache.shiro.mgt.DefaultSecurityManager中的resolvePrincipals方法,並且發送一個帶有rememberMe Cookie的請求,應該就可以斷下來了。

Apache Shiro 1.2.4反序列化漏洞实例分析

我們繼續跟進這個getRememberedIdentity方法: 

Apache Shiro 1.2.4反序列化漏洞实例分析繼續跟著getRememberedSerializedIdentity方法: 

Apache Shiro 1.2.4反序列化漏洞实例分析#在這個方法中,讀出了我們傳入的Cookie,並且進行了base64解碼: 

Apache Shiro 1.2.4反序列化漏洞实例分析接下來shiro會呼叫convertBytesToPrincipals並將base64解碼後的位元組數組作為參數傳入:

Apache Shiro 1.2.4反序列化漏洞实例分析

這裡透過函數名稱也能猜出來,進行了兩個操作,分別是解密和反序列化,我們先來看解密部分,經過簡單的調試後,發現是一個AES解密,並且存在一個預設秘鑰Base64.decode("kPH bIxk5D2deZiIxcaaaA==");,在shiro自帶的sample中,並沒有透過其他的方式設定這個秘鑰,所以這裡用的就是這個預設值。

而AES解密中遇到的IV也是從我們傳入的Cookie中的前幾個字節中取得的,於是我們可以輕易的建構出包含任意內容的Cookie值,解密好的明文就是序列化的內容,呼叫了deserialize進行反序列化。

最後會呼叫到org.apache.shiro.io.DefaultSerializer#deserialize方法進行反序列化:    
Apache Shiro 1.2.4反序列化漏洞实例分析

整個流程十分簡單,簡單概括一下就是:讀取cookie -> base64解碼-> AES解密-> 反序列化

所以我們的payload建構起來也是十分的簡單,完整的PoC我會放到我的GitHub上。

0x02 疑點解惑

在偵錯的過程中,遇到了一些問題,沒有成功的彈出計算器,這裡記錄一下。

1. 為什麼本機建置環境,使用CommonsBeanutils1打不成功,總是提示ClassNotFound異常?

這個問題我當時調試了好久,一度以為是payload有問題或者shiro的代碼因為年代久遠有了變化,因為當時遇到的case就是這個payload一發入魂的,表示十分的迷茫。後來發現了關鍵問題,我們從github上clone到的sample中,commons-beanutils這個依賴的版本是1.8.3,而ysoserial產生的payload的版本是1.9.2,所以在預設的sample中是無法打成功的。於是我修改版本號碼到1.9.2,一發入魂。

所以遇到的那個案例中,實際的依賴環境版本可能也是這樣的吧,所以才能直接打成功。

2. 假如我的依賴中就是沒有高版本的commons-beanutils和commons-collections之類的包,怎麼利用?

這個項目clone下來之後,可以看到是存在一個commons-collections的包的: 

Apache Shiro 1.2.4反序列化漏洞实例分析

嘗試使用ysoserial提供的CommonsCollections1時會拋出異常,無法成功

Apache Shiro 1.2.4反序列化漏洞实例分析調試時發現在這裡拋出的異常,為什麼無法將byte數組反序列化令人十分困惑

Apache Shiro 1.2.4反序列化漏洞实例分析

查了一下Java中Class.forName()以及ClassLoader.loadClass()的區別,發現forName()總是使用呼叫者的ClassLoader(),而loadClass()則是可以自己指定一個不同的ClassLoader。那shiro中的ClasssLoader是怎麼來的?是透過Thread.currentThread().getContextClassLoader();取得的,也就是WebappClassLoader。但是為啥提示無法加載byte array呢,搜索了一番看到了orange博客下面的討論,了解到了整個事情的真相:

Shiro resovleClass使用的是ClassLoader.loadClass()而非Class.forName(),而ClassLoader.loadClass不支援裝載數組類型的class。

以上是Apache Shiro 1.2.4反序列化漏洞實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板