一、前言
什么是shiro?
????????shiro是一個Apache的Java安全框架
它的作用是什么?
????????Apache Shiro 是一個強大且靈活的 Java 安全框架,用于處理身份驗證、授權、密碼管理以及會話管理等功能
二、shiro550反序列化原理
1、用戶首次登錄并勾選記住密碼功能,第一個請求包會多一個remember-me的參數
2、然后第一個回包中就會將用戶登錄信息進行>>序列化>>AES加密>>base64編碼,并將該值存到Cookie的rememberMe參數中,并返回給客戶端
3、當客戶端發起第二個請求包時,該數據包中的Cookie就會攜帶rememberMe和它的值(密文)
然后服務端取出Cookie中的密文進行>>base64解碼>>AES解密>>反序列化,然后就能取出用戶登錄信息進行校驗
三、漏洞原因
在AES加解密的過程中,使用的是相同的秘鑰,而在shiro版本<=1.2.24的版本中使用了固定的密鑰kPH+bIxk5D2deZiIxcaaaA==,
所以攻擊者就能通過相同的方式偽造Cookie中的密文,寫入惡意代碼,在服務端對Cookie中的數據進行反序列化時就會執行惡意代碼。
圖示:
?
四、利用思路總結
在我們知道shiro550版本框架存在反序列化漏洞后,就可以通過下面方式實現命令執行:
1、客戶端首次用賬號密碼登錄,勾選記住密碼
2、響應包中的set-Cookie中存放著加密的用戶信息密文
3、客戶端再次訪問服務端,請求包中的Cookie中就會存在rememberMe:?加密的用戶信息密文
4、攔截這個請求包
5、構造payload(如CC鏈),將payload>>序列化>>AES加密>>base64編碼
6、用構造的payload密文替換請求包中的rememberMe中的加密的用戶信息密文
7、放包(請求包),服務端接收到我們更改后的請求包
8、JVM取出Cookie中的rememberMe中的密文進行>>base64解碼>>AES解密>>反序列化
9、反序列化的readObject()觸發CC鏈,實現命令執行