JAVA反序列化漏洞實例解析

2022-01-26 i春秋

序列化與反序列化,簡單來說就是JAVA對象與字節之間的相互轉化。

實質上,序列化機制並不只局限於JAVA語言,序列化的本質是內存對象到數據流的一種轉換,我們知道內存中的東西不具備持久性,但有些場景卻需要將對象持久化保存或傳輸。

例如緩存系統中存儲了用戶的Session,如果緩存系統直接下線,待系統重啟後用戶就需要重新登陸,為了使緩存系統內存中的Session對象一直有效,就需要有一種機制將對象從內存中保存入磁碟,並且待系統重啟後還能將Session對象恢復到內存中,這個過程就是對象序列化與反序列化的過程。

今天i春秋通過一期《JAVA反序列化學習-基礎篇》公開課,帶大家快速了解預期效果、JAVA編程基礎、漏洞基礎、靶項目搭建四個模塊內容,感興趣的小夥伴速來學習吧!

感興趣的小夥伴,識別二維碼立即看課

PS:Web端看課體驗會更佳,看課地址:

https://www.ichunqiu.com/open/68626

暱稱:bigbig

1、國內大廠安全研究員;

2、職業紅隊;

3、擅長代碼審計、隱藏通信隧道技術、權限維持、域內橫向移動等後滲透技術;

4、擁有軟體設計技能國家證書、曾任入侵檢測產品線負責人。

1、漏洞原理

我們既然已經知道了序列化與反序列化的過程,那麼如果在反序列化時,這些即將被反序列化的數據是經過特殊構造的呢?

如果Java應用對用戶輸入,即不可信數據做了反序列化處理,那麼攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的對象,非預期的對象在產生過程中就有可能帶來任意代碼執行。

2、漏洞危害

案例1:Apache ActiveMQ 5.12.0 遠程代碼執行漏洞(JMS)

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,該漏洞源於程序未能限制可在代理中序列化的類。遠程攻擊者可藉助特製的序列化的Java Message Service (JMS) ObjectMessage對象利用該漏洞執行任意代碼。

受到影響的產品如下:

Apache ActiveMQ 5.12.0 and earlierHornetQ 2.4.0 and earlierOracle OpenMQ 5.1 and earlierIBM Websphere MQ 8.0.0.4 and earlierOracle Weblogic 12c and earlierPivotal RabbitMQ JMS client 1.4.6 andearlierIBM MessageSight MessageSight V1.2JMSClient and earlierSwiftMQ JMS client 9.7.3 and earlierApache ActiveMQ Artemis client 1.2.0 andearlierApache Qpid JMS client 0.9.0 and earlierAmazon SQS Java Messaging Library 1.0.0and earlier

案例2:JBoss反序列化漏洞(JMX)

JBoss利用的是HTTP協議,可以在任何埠上運行,默認安裝在8080埠中。JMX是一個Java的管理協議,在JBoss中的JMXInvokerServlet可以使用HTTP協議與其進行通話。這一通信功能依賴於Java的序列化類。

本地構造惡意的序列化對象

構造惡意的序列化對象發送給目標主機:

執行系統命令:

受影響的產品有:

Red Hat JBoss BPM Suite (BPMS) 6.xRed Hat JBoss Data Grid (JDG) 6.xRed Hat JBoss Data Virtualization (JDV)6.xRed Hat JBoss Data Virtualization (JDV)5.xRed Hat JBoss Enterprise ApplicationPlatform 6.xRed Hat JBoss Enterprise ApplicationPlatform 5.xRed Hat JBoss Enterprise ApplicationPlatform 4.3.xRed Hat JBoss Fuse Service Works (FSW)6.xRed Hat JBoss Operations Network (JBossON) 3.xRed Hat JBoss SOA Platform (SOA-P) 5.xRed Hat JBoss Web Server (JWS) 3.x

案例3:

Jenkins Remoting的相關API是用於實現分布式環境中master和slave節點或者master和CLI的訪問,API沒有身份認證並且支持序列化對象。CVE-2016-0788通過Jenkins Remoting巧妙地開啟JRMP,JRMP觸發反序列化操作,從而進行漏洞的利用。

作者提供了完整利用POC,在遠程伺服器開啟JRMI服務:

連接遠程服務埠,發送惡意序列化數據包。

這樣在Jenkins的根目錄就會生成一個pwned文件。

受到影響的產品:

All Jenkins main line releases up to andincluding 1.649

All Jenkins LTS releases up to andincluding 1.642.1

3、漏洞防禦

(1)反序列化對象白名單控制,在resolveClass方法中校驗對象名字:

public class LookAheadObjectInputStream extends ObjectInputStream {   public LookAheadObjectInputStream(InputStream inputStream)         throws IOException {      super(inputStream);   }      @Override   protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,         ClassNotFoundException {      if (!desc.getName().equals(Bicycle.class.getName())) {         throw new InvalidClas**ception(               "Unauthorized deserialization attempt", desc.getName());      }      return super.resolveClass(desc);   }}

(2)序列化數據採用對稱加密進行傳輸,接口調用增加身份認證。(此種方法僅僅能提升攻擊成本)

(3)因為序列化機制不能保證數據的完整和和保密性,如果類中存在敏感數據,並且這個類還需要序列化,就需要在特定對象的一個域上關閉serialization,在這個域前加上關鍵字transient即可。

延伸內容來源於i春秋社區

i春秋官方公眾號為大家提供

前沿的網絡安全技術

簡單易懂的實用工具

緊張刺激的安全競賽

還有網絡安全大講堂

更多技能等你來解鎖

相關焦點

  • java反序列化——XMLDecoder反序列化漏洞
    前言最近學習java反序列化學到了weblogic部分,weblogic之前的兩個反序列化漏洞不涉及T3協議之類的,只是涉及到了XMLDecoder
  • 常見的 Web 漏洞 —— 反序列化漏洞
    前段時間因各種原因,終於下定決心好好總結一下反序列化漏洞,耗時兩周,且看且珍惜!Vulnerability Introduction反序列化漏洞首次出現在2015年。雖然漏洞較新,但利用十分熱門,主要原因還是太過信任客戶端提交的數據,容易被開發者忽略,該漏洞一般都可執行任意命令或代碼,造成的影響較大。
  • 文庫 | 反序列化漏洞匯總
    由於攻擊者可以創建任何這些類的實例,因此很難預測可以對惡意數據調用哪些方法。如果攻擊者能夠將一系列意想不到的方法調用連結在一起,並將數據傳遞到與初始源完全無關的接收器,則尤其如此。因此,幾乎不可能預料到惡意數據的流動並堵塞(修復)每個潛在的漏洞。簡而言之,反序列化不受信任的輸入是不安全的。
  • 深入剖析 Java 反序列化漏洞
    2016 年 Spring RMI 反序列化爆出漏洞,攻擊者可以通過 JtaTransactionManager 這個類,來遠程執行惡意代碼。2017 年 4月15 日,Jackson 框架被發現存在一個反序列化代碼執行漏洞。
  • Java 8u20反序列化漏洞分析
    在看下out.writeObject(object)是怎麼寫入數據的,會先解析class結構,然後判斷是否實現了Serializable接口,然後執行java.io.ObjectOutputStream#writeOrdinaryObject方法
  • Java安全之反序列化漏洞分析
    在Java中,只要一個類實現了java.io.Serializable接口,那麼它就可以通過ObjectInputStream與ObejctOutputStream序列化,如下我們模擬了Session對象持久化存儲與從磁碟加載的過程:結合注釋,這段測試代碼應該不難理解,我們可以看到Java對象序列化就依賴於ObejctOutputStream的writeObject
  • Java反序列化漏洞從理解到實踐
    利用某個反序列化漏洞。2. 自己手動創建利用載荷。更具體一點,首先我們會利用現有工具來實際操作反序列化漏洞,也會解釋操作的具體含義,其次我們會深入分析載荷相關內容,比如什麼是載荷、如何手動構造載荷等。完成這些步驟後,我們就能充分理解載荷的工作原理,未來碰到類似漏洞時也能掌握漏洞的處理方法。
  • JAVA反序列化—FastJson抗爭的一生
    //parseObject反序列化parseObject反序列化對象名稱:com.alibaba.fastjson.JSONObjectparseObject反序列化:{"name":"lala","age":11}這邊在調試的時候,可以看到,本該解析出來的@type都沒有解析出來
  • 全方位解析Java序列化
    本文從以下幾個角度來解析序列這一塊知識點~什麼是 Java 序列化?為什麼需要序列化?序列化用途Java 序列化常用 API序列化的使用序列化底層日常開發序列化的注意點序列化常見面試題一、什麼是Java序列化?
  • Java序列化反序列化源碼---Jackson反序列化漏洞源碼分析
    只有實現了Serializable接口的類的對象才可以被序列化,Serializable接口是啟用其序列化功能的接口,實現 java.io.Serializable接口的類才是可序列化的,沒有實現此接口的類將不能使它們的任一狀態被序列化或逆序列化。
  • Java序列化對象(JSO):實戰漏洞利用指南
    在本報告中,我們將探討JSO如何受到不安全的反序列化漏洞的影響、網際網路上JSO處理的應用程式的流行程度,以及測試人員如何使用Metasploit框架來驗證涉及JSO的漏洞。1. 與2017年相比,與JSO相關的CVE漏洞在2018年大幅增加。在兩年中,總共確認了近100個漏洞,而2013年至2016年期間僅確認了7個漏洞。2.
  • java反序列化之Commons Collections分析(一)
    前言在學習java反序列化的過程中,Commons Collections幾乎是反序列化學習中無法繞過的一關。也是各大ctf和awd的常見考點,作為java代碼審計的重要一環,我們今天就來解析一下Commons Collections利用鏈。
  • Java XXE漏洞典型場景淺析
    類作為解析工廠類,這裡並沒有添加任何feature限制外部實體的加載,所以只需要關心var14是否可控那麼在WsrmServerPayloadContext的readExternal方法調用了readEndpt方法,該方法將在反序列化時自動調用,與通常的readObject相類似,而readEndpt中的var14又來自此時的var1(payload 輸入流),所以滿足可控條件那麼從反序列化到xxe
  • Java程式設計師必備:序列化全方位解析
    本文從以下幾個角度來解析序列這一塊知識點~什麼是Java序列化?為什麼需要序列化?序列化用途Java序列化常用API序列化的使用序列化底層日常開發序列化的注意點序列化常見面試題一、什麼是Java序列化?
  • 看代碼學安全(11) - unserialize反序列化漏洞
    漏洞解析:(上圖代碼第11行正則表達式應改為:』/O:d:/『)題目考察對php反序列化函數的利用。代碼第32行,對 Template 類進行了實例化,並將 cookie 中鍵為』data』數據作為初始化數據進行傳入, $data 數據我們可控。開始考慮繞過對傳入數據的判斷。代碼 11行 ,第一個if,截取前兩個字符,判斷反序列化內容是否為對象,如果為對象,返回為空。php可反序列化類型有String,Integer,Boolean,Null,Array,Object。
  • 乾貨 | PHP反序列化原理及不同類別反序列化漏洞總結
    op"private變量\x00 + 類名 + \x00 + 變量名反序列化漏洞形成條件1、unserialize函數的參數可控2、後臺使用了相應的PHP中的魔法函數反序列化漏洞原理<?PHP語言本身漏洞還有一種PHP語言本身漏洞碰到某種特點情況導致的反序列化漏洞如:__wakeup失效引發(CVE-2016-7124)php版本<5.6.25 | <
  • PHP反序列化漏洞基礎
    一、PHP序列化和反序列化1、PHP反序列化:將變量或者對象轉換成字符串的過程,用於存儲或傳遞PHP的值的過程種,同時不丟失其類型和結構。②在反序列的時候php會根據s所指定的字符長度去讀取後面的字符。如果指定的長度錯誤則反序列化就會失敗。2、session反序列化(1)session概念PHP session時一個特殊的變量,用於存儲有關用戶會話的信息,或更改用戶會話的設置。session變量保存的信息是單一用戶的,並且可供應用程式中的所有界面使用。
  • 詳解JAVA序列化
    這個時候我們就需要通過固定的協議,傳輸固定的數據格式,而這個數據傳輸的協議稱之為序列化,而定義了傳輸數據行為的框架組件也稱之為序列化組件(框架)序列化有什麼意義首先我們先看看,java中的序列化,在java語言中實例對象想要序列化傳輸,需要實現Serializable 接口,只有當前接口修飾定義的類對象才可以按照指定的方式傳輸對象。
  • Dubbo HttpInvoker反序列化分析
    之前審計的過程中,遇到過Dubbo這個組件,雖然知道這個組件存在反序列化漏洞,但是關於漏洞的詳情和利用一概不知,所以下面對Dubbo的漏洞進行分析
  • PHP反序列化漏洞說明
    序列化可以將對象轉換成字符串,但僅保留對象裡的成員變量,不保留函數方法。PHP序列化的函數為serialize,反序列化的函數為unserialize.舉個慄子:<?反序列化反序列化就是序列化的逆過程,即對於將對象進行序列化後的字符串,還原其成員變量的過程。接上述慄子:<?