用途限制聲明,本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具,嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果,作者及發布平臺不承擔任何責任。滲透測試涉及復雜技術操作,可能對目標系統造成數據損壞、服務中斷等風險。讀者需充分評估技術能力與潛在后果,在合法合規前提下謹慎實踐。
這次我們主要介紹反序列化漏洞,其中兩種比較常見的反序列化漏洞,Java反序列化漏洞和php反序列化漏洞,接下來著重介紹這兩種反序列化漏洞。
一、Java 反序列化漏洞
Java 作為面向對象的編譯型語言,其序列化格式為二進制流(不可直接閱讀),漏洞觸發依賴readObject()方法(反序列化核心方法),且通常需要構造 “利用鏈(Gadget Chain)”—— 串聯多個類的方法,最終觸發惡意代碼執行,比 PHP 反序列化更復雜但危害范圍更廣。
1. 漏洞核心原理
(1)Java 序列化機制
Java 通過java.io.Serializable接口標記可序列化類,序列化由ObjectOutputStream.writeObject()完成(生成二進制流),反序列化由ObjectInputStream.readObject()完成(恢復對象)。
關鍵特性:若類重寫了readObject()方法,反序列化時會優先執行該方法中的邏輯—— 這是漏洞的核心觸發點。
(2)利用鏈(Gadget Chain)的必要性
Java 的安全設計較嚴謹,單個類的readObject()通常無法直接執行命令(如無Runtime.getRuntime().exec()這類危險代碼)。因此,攻擊者需要 “串聯多個合法類的方法”,形成一條 “利用鏈”:從readObject()出發,通過調用鏈觸發反射(Java 的反射機制可動態調用任意類的任意方法),最終執行惡意命令。
簡單理解:利用鏈 =?readObject()?→ 類 A 方法 → 類 B 方法 → ... → 反射執行命令。
(3)漏洞觸發流程
攻擊者分析目標 Java 程序依賴的第三方庫(如 Apache Commons Collections、Jackson)或框架(如 Struts2、WebLogic),尋找可串聯成利用鏈的類;
構造惡意對象:基于利用鏈,創建包含惡意邏輯的序列化對象(如通過反射執行calc.exe的對象);
將惡意二進制流通過請求(如 HTTP POST、T3 協議)傳入目標程序;
目標程序調用readObject()反序列化該流,觸發利用鏈,執行惡意代碼。
2. 典型代表案例
(1)里程碑漏洞:Apache Commons Collections 反序列化漏洞(CVE-2015-7501)
漏洞背景:2015 年披露,影響 Apache Commons Collections 3.1~3.2.1 版本(該庫是 Java 生態中最常用的工具庫之一,幾乎所有企業級 Java 項目都會依賴),是 Java 反序列化漏洞的 “開山之作”,直接推動了后續所有 Java 反序列化漏洞的研究。
漏洞原理(核心利用鏈):
關鍵類:TransformedMap( Commons Collections 中的映射類)、InvokerTransformer(實現Transformer接口,可通過反射調用方法)。
TransformedMap在反序列化時,會調用其transformValue()方法,而該方法會執行Transformer接口的transform()方法;
攻擊者將TransformedMap的Transformer設置為InvokerTransformer,并指定InvokerTransformer通過反射調用Runtime.getRuntime().exec()(執行系統命令);
當TransformedMap被反序列化時,transform()觸發InvokerTransformer的反射邏輯,最終執行命令。
利用方式:
攻擊者通過工具(如 ysoserial,專門生成 Java 反序列化利用鏈的工具)生成包含TransformedMap和InvokerTransformer的惡意二進制流,通過 HTTP 參數或協議(如 Struts2 的params參數)傳入目標程序,觸發readObject()后執行命令。
危害:覆蓋全球數百萬依賴 Commons Collections 的 Java 應用(如 Struts2、WebLogic、JBoss),導致大規模 RCE 攻擊,至今仍是滲透測試中的 “必測漏洞”。
(2)企業級漏洞:WebLogic T3 協議反序列化漏洞(CVE-2017-10271)
漏洞背景:影響 Oracle WebLogic Server 10.3.6.0、12.1.3.0、12.2.1.1、12.2.1.2 版本(WebLogic 是 Oracle 推出的企業級應用服務器,廣泛用于金融、政府、大型企業)。
漏洞原理:WebLogic 的T3協議(用于 WebLogic 服務器與客戶端 / 其他服務器通信)在處理序列化數據時,會調用readObject()反序列化數據。攻擊者可利用 WebLogic 內部的wls9_async_response組件,構造包含惡意利用鏈(如基于 Commons Collections 或 WebLogic 自身類的鏈)的序列化數據,通過 T3 協議發送給服務器。
利用方式:
攻擊者無需認證,直接向 WebLogic 的 T3 端口(默認 7001)發送惡意二進制流,服務器反序列化時觸發利用鏈,執行命令(如nc反彈 shell)。
危害:企業級服務器直接被遠程控制,可能導致核心業務數據泄露、業務中斷,甚至內網橫向滲透(因為 WebLogic 通常部署在企業內網)。
一、PHP 反序列化漏洞
PHP 作為腳本語言,其序列化格式為明文可閱讀的字符串,漏洞觸發高度依賴 PHP 的 “魔術方法”(具有特殊功能的預定義方法,通常以__開頭),本質是 “可控輸入觸發危險魔術方法”。
1. 漏洞核心原理
(1)PHP 序列化格式
PHP 對象序列化后會生成類似如下的字符串,結構清晰(便于攻擊者構造惡意數據):
php
// 格式:O:類名長度:"類名":屬性個數:{屬性1類型:屬性1值;屬性2類型:屬性2值;...}O:5:"User":2:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";}// 含義:類名User(長度5),2個屬性:username(字符串,值admin)、password(字符串,值123456)
(2)關鍵觸發點:魔術方法
PHP 在反序列化過程中會自動觸發特定魔術方法,若這些方法中包含 “危險操作”(如eval()、system()、文件寫入等),且方法依賴的屬性值可由攻擊者控制,則漏洞成立。常見危險魔術方法:
__wakeup():反序列化之前觸發(最核心的觸發點之一);
__destruct():對象被銷毀時觸發(反序列化后若對象無引用,會自動觸發);
__toString():對象被當作字符串使用時觸發(如echo $obj、字符串拼接);
__call():調用不存在的方法時觸發;
__get():訪問不存在的屬性時觸發。
(3)漏洞觸發流程
攻擊者分析目標 PHP 程序,找到包含 “危險魔術方法” 的類(如存在__wakeup()調用eval($this->cmd)的類);
構造惡意對象:將危險方法依賴的屬性(如$cmd)設為惡意代碼(如system("whoami"));
將惡意對象序列化為字符串,通過請求參數(如 Cookie、POST 參數)傳入目標程序;
目標程序接收該字符串并執行unserialize()(反序列化),觸發魔術方法,執行惡意代碼。
2. 典型代表案例
(1)PHP 原生漏洞:CVE-2016-7124
漏洞背景:影響 PHP 5.6.25 之前、7.0.10 之前的版本,源于 PHP 的Session反序列化機制缺陷。
漏洞原理:
PHP 的Session存儲依賴session.serialize_handler(序列化處理器),默認值為php(格式:鍵名|序列化數據),而若配置為php_serialize(格式:序列化數據),且session.save_handler為自定義處理器(如user),則Session數據的反序列化過程可控。
利用方式:
攻擊者通過 Cookie 設置PHPSESSID對應的Session數據,構造包含惡意對象的序列化字符串(如觸發__wakeup()執行命令的對象)。當 PHP 讀取Session并反序列化時,直接觸發漏洞,實現 RCE。
危害:直接攻擊 PHP 解釋器本身,無需依賴第三方框架,影響所有使用存在漏洞版本 PHP 的網站。
(2)框架漏洞:ThinkPHP 5.x 反序列化漏洞(如 CNVD-2018-24942)
漏洞背景:影響 ThinkPHP 5.0.0~5.0.23、5.1.0~5.1.30 版本,是 PHP 框架中最典型的反序列化漏洞之一(ThinkPHP 是國內使用最廣泛的 PHP 框架)。
漏洞原理:
ThinkPHP 框架的Request類(處理 HTTP 請求)中存在__destruct()魔術方法,該方法會調用filterValue(),而filterValue()會執行call_user_func()(調用指定函數)。攻擊者可通過控制filter屬性(指定要調用的函數)和params屬性(函數參數),構造惡意序列化數據。
利用方式:
攻擊者通過cookie或GET/POST參數傳入惡意序列化字符串(如O:10:"think\Request":2:{s:8:"filter";s:6:"system";s:6:"params";a:1:{i:0;s:6:"whoami";}}),當框架對該數據反序列化時,__destruct()觸發call_user_func("system", "whoami"),執行系統命令。
危害:覆蓋大量使用 ThinkPHP 的中小型網站,攻擊者可直接獲取服務器權限,植入后門或竊取數據。
二、PHP 與 Java 反序列化漏洞的核心區別
對比維度 | PHP 反序列化漏洞 | Java 反序列化漏洞 |
序列化格式 | 明文字符串(易構造、易調試) | 二進制流(需工具生成,如 ysoserial) |
核心觸發點 | 魔術方法(__wakeup()、__destruct()等) | 重寫的readObject()方法 |
利用鏈復雜度 | 低(多為單個類的魔術方法直接觸發) | 高(需串聯多個類形成利用鏈,依賴第三方庫) |
影響范圍 | 主要影響 PHP 腳本 / 框架(如 ThinkPHP、Laravel) | 影響所有 Java 應用(含企業級服務器、框架) |
典型依賴 | 自身語法特性(魔術方法) | 第三方庫(Commons Collections)或框架組件 |
三、兩類漏洞的共同危害
無論 PHP 還是 Java 反序列化漏洞,其核心危害均為遠程代碼執行(RCE)?,攻擊者可實現:
完全控制服務器:執行任意系統命令(如whoami、rm -rf /),獲取服務器權限;
數據竊取 / 破壞:讀取數據庫配置、下載核心業務數據,或刪除關鍵文件;
植入后門:上傳 webshell(如 PHP 的一句話后門、Java 的jspx后門),長期控制服務器;
內網橫向滲透:若服務器位于內網,攻擊者可通過該服務器攻擊內網其他機器,擴大攻擊范圍