在 Web 安全領域,反序列化漏洞一直是威脅等級極高的存在,而 Apache Shiro 框架中的 Shiro550 漏洞(CVE-2016-4437),更是因利用門檻低、影響范圍廣,成為滲透測試中頻繁遇到的經典漏洞。本文將從 “原理拆解” 和 “實戰 SOP” 兩個維度,帶你徹底搞懂 Shiro550 漏洞,同時提供可直接落地的標準化操作流程。?
一、基本信息與原理?
Shiro550 漏洞,它并非框架功能的缺陷,而是“加密邏輯”與“反序列化”機制結合產生漏洞。?
1. 漏洞基本信息?
CVE 編號:CVE-2016-4437?影響范圍:Apache Shiro 1.2.4 及以下版本?漏洞類型:反序列化遠程代碼執行(RCE)?核心觸發點:Shiro 框架的 “RememberMe”(記住我)功能?
2. 漏洞原理: “記住我” 功能的加密解密邏輯?
Shiro 的 “RememberMe” 功能本是為了提升用戶體驗 —— 用戶登錄時勾選 “記住我”,下次訪問系統無需重新輸入賬號密碼,直接通過 Cookie 中的身份信息完成驗證。但正是這個功能的加密解密流程,埋下了漏洞的隱患。?
(1)正常流程:用戶身份信息的 “加密存儲”?
當用戶勾選 “RememberMe” 登錄時,Shiro 會按以下步驟處理用戶身份信息,最終生成 Cookie:?
用戶身份信息(如用戶名、權限)→ 序列化(將Java對象轉為字節流)→ AES加密(需使用框架內置的固定密鑰Key)→ Base64編碼(轉為可讀字符串)→ 寫入RememberMe Cookie?
(2)危險流程:服務端的 “解密反序列化”?
下次用戶訪問時,服務端會按 “反向流程” 驗證 RememberMe Cookie,而漏洞就出在這一步:?
- 讀取請求中RememberMe Cookie的值 → Base64解碼(還原為AES加密后的字節流)→
AES解密(用相同的固定Key,還原為序列化后的字節流)→ 反序列化(將字節流還原為Java對象)? - 這里的關鍵問題的是:Shiro 框架在 1.2.4 及以下版本中,使用了 “硬編碼的固定 AES
密鑰”!開發者如果沒有手動修改默認密鑰,攻擊者就能利用這個已知的 Key,構造惡意的序列化數據 —— 先將 “惡意代碼(如執行命令)”
封裝成 Java 對象,按正常流程進行序列化、AES 加密(用默認 Key)、Base64 編碼,然后將構造好的字符串放入RememberMe Cookie 中發送給服務端。? - 服務端接收到 Cookie 后,會毫無防備地執行 “解密→反序列化” 操作,此時惡意 Java 對象被還原,其中的惡意代碼也就被執行了
—— 這就是 Shiro550 漏洞的核心原理:利用已知的固定密鑰,構造惡意序列化數據,觸發服務端反序列化 RCE。?
(3)抓包驗證:從數據包看 “RememberMe” 的痕跡?
理解原理后,我們可以通過抓包直觀看到 “RememberMe” 的交互過程:?
請求包:用戶勾選 “RememberMe” 登錄時,POST 請求的 Cookie 字段會新增rememberMe=on(此時還未生成加密后的身份信息);?響應包:服務端驗證通過后,會在 Set-Cookie 中先返回rememberMe=deleteMe(這是 Shiro 的常規清理操作),隨后生成真正的加密身份信息,返回rememberMe=xxxxx(長串密文)—— 這串密文就是經過 “序列化→AES 加密→Base64 編碼” 后的結果。?
如果看到這樣的 Cookie 交互,就可以初步判斷目標系統可能使用了 Shiro 框架,為后續漏洞驗證提供了線索。?
二、Shiro550 漏洞實戰 SOP:4 步搞定漏洞驗證與利用?
在實際生產或滲透測試中,我們需要一套標準化的操作流程(SOP),既能高效驗證漏洞,又能避免遺漏關鍵步驟。以下流程可直接復制粘貼到工作文檔中,按步驟執行即可。?
第一步:識別 “RememberMe” 功能是否存在?
漏洞的前提是目標系統啟用了 “RememberMe” 功能,因此第一步要確認該功能是否存在:?
訪問目標系統的登錄頁面(如http://xxx.com/login);?觀察登錄表單中是否有 “記住我”“自動登錄” 等選項(文字可能不同,但核心是 “記住登錄狀態” 的功能);?若有該選項,直接勾選并嘗試登錄(無需知道正確賬號密碼,后續驗證不依賴登錄成功);?用 Burp Suite 等工具抓包,查看請求包的 Cookie 字段中是否有rememberMe=on(登錄請求),或響應包的 Set-Cookie 中是否有rememberMe=deleteMe/ 長串密文 —— 存在則說明 “RememberMe” 功能已啟用。?
第二步:驗證目標是否使用 Apache Shiro 框架?
“RememberMe” 功能并非 Shiro 獨有,因此需要進一步確認框架是否為 Shiro:?
方法 1:從響應頭識別(最直接)?
查看登錄請求的響應頭(Response Headers),若存在以下字段,則大概率是 Shiro:?
Set-Cookie: JSESSIONID=xxxx; Path=/; HttpOnly(常規 Session,但需結合其他特征);?部分版本會在響應頭中直接暴露 Shiro 相關標識(如X-Shiro-Version,但并非所有版本都有)。?
方法 2:從 Cookie 特征識別?
若響應包中出現rememberMe=deleteMe,這是 Shiro 框架的 “標志性特征”—— 其他框架幾乎不會用 “deleteMe” 作為 RememberMe Cookie 的臨時值,因此看到該字段,可 90% 確定是 Shiro。?
方法 3:主動探測(輔助驗證)?
若上述方法無法確認,可構造一個無效的 RememberMe Cookie(如rememberMe=test)發送給服務端:?
若響應包中返回rememberMe=deleteMe,則說明服務端在處理 Shiro 的 RememberMe Cookie,進一步確認是 Shiro 框架;?若無任何響應,則可能不是 Shiro,或 “RememberMe” 功能未正常啟用。?
第三步:驗證 Shiro 版本是否 <=1.2.4?
Shiro550 漏洞僅影響 1.2.4 及以下版本,因此版本驗證是關鍵(若版本高于 1.2.4,直接排除該漏洞):?
方法 1:從框架文件暴露識別?
訪問目標系統可能存在的 Shiro 相關靜態文件,如:?
http://xxx.com/shiro.css(部分系統會暴露框架默認樣式文件);?http://xxx.com/WEB-INF/lib/shiro-core-1.2.4.jar(若存在文件泄露,可直接看到版本號);?
若文件中包含1.2.x(x<=4),則確定版本符合漏洞條件。?
方法 2:從漏洞響應特征識別(無版本泄露時用)?
由于 Shiro 1.2.4 及以下版本使用固定 AES 密鑰,而 1.2.5 及以上版本修復了該問題(允許自定義密鑰,但默認仍有風險,不過 550 漏洞特指 1.2.4 及以下),因此可通過 “密鑰驗證” 間接判斷版本:?
使用 Shiro 漏洞驗證工具(如 ShiroExploit),嘗試用默認密鑰(Shiro 1.2.4 及以下的固定密鑰)發送測試請求;?若工具返回 “密鑰匹配” 或 “可能存在漏洞”,則說明版本 <=1.2.4;若返回 “密鑰不匹配”,則版本可能高于 1.2.4,或開發者修改了默認密鑰。?
方法 3:從官方更新日志反推(輔助)?
- 若目標系統是公開項目,可查詢其使用的 Shiro 版本(如 GitHub 倉庫的 pom.xml、package.json),對照
Shiro 官方更新日志:Shiro 1.2.5 版本于 2016 年 5 月發布,明確修復了 “RememberMe”
功能的反序列化漏洞,因此版本在 1.2.5 之前的均存在風險。?
第四步:使用自動化工具獲取 Key 并執行攻擊?
當確認 “存在 RememberMe 功能 + 是 Shiro 框架 + 版本 <=1.2.4” 后,即可通過工具自動化獲取密鑰并執行攻擊(手動構造數據效率低,工具可大幅提升成功率)。?
常用工具:ShiroExploit、ysoserial(需配合使用)?
操作步驟:?
準備工具:下載 ShiroExploit(如 v2.5 版本,支持自動爆破密鑰和執行命令),確保本地 Java 環境正常(工具依賴 Java 運行);?配置目標信息:打開工具,輸入目標 URL(如http://xxx.com/login),選擇 “RememberMe” Cookie 的位置(工具會自動識別,無需手動填寫);?爆破密鑰:工具內置 Shiro 1.2.4 及以下版本的默認密鑰列表,點擊 “爆破密鑰”—— 若成功匹配到密鑰(如kPH+bIxk5D2deZiIxcaaaA==),則說明漏洞可利用;?執行命令:選擇 “命令執行” 模塊,輸入要執行的命令(如whoami、ping xxx.xxx.xxx.xxx,建議先執行 ping 測試連通性),點擊 “執行”;?驗證結果:若命令執行成功(如 ping 測試在本地 Wireshark 中捕獲到數據包,或whoami返回服務器用戶名),則漏洞驗證完成;若執行失敗,可嘗試更換密鑰或檢查目標是否有防火墻攔截。?
注意事項:?
若目標系統修改了 Shiro 默認密鑰,工具爆破失敗,則無法利用 Shiro550 漏洞,需考慮其他漏洞;?生產環境中測試需獲得授權,禁止未授權滲透測試,避免觸犯法律。?
實戰平臺:
1.vulhub靶場:需要配置,具體請參考其他文章
2.vulfocus在線靶場:https://vulfocus.cn(在線靶場,注冊賬號可直接開啟環境)
工具推薦:
1.ShiroExploit
2.shiro_attack-4.7.0-SNAPSHOT-all (一體化工具,非常好用)(GitHub上有很多,我整理了一個版本比較新,并且可正常運行的放在“資源”里面,需要自取~)
三、總結:從原理到實戰的核心邏輯?
-
Shiro550 漏洞的本質,是 “固定密鑰 + 反序列化” 的雙重風險 —— 框架硬編碼的 AES
密鑰讓攻擊者可構造惡意數據,而服務端未對反序列化數據進行校驗,直接執行還原操作,最終導致 RCE。? -
而實戰 SOP 的核心邏輯,是 “層層篩選”:先確認功能存在,再驗證框架類型,接著鎖定版本范圍,最后通過工具高效利用。這套流程不僅適用于
-
Shiro550 漏洞,也可遷移到其他 Web 漏洞的驗證中 —— 先明確漏洞觸發條件,再逐步排除非目標,最終精準定位可利用漏洞。?
-
對于開發者而言,防范 Shiro550 漏洞的方法也很明確:升級 Shiro 到 1.2.5 及以上版本,同時手動修改 AES
密鑰(避免使用默認密鑰),從根本上切斷攻擊者構造惡意數據的可能性。