(驚呆)java反序列化漏洞—被低估的破壞之王

aqiandao發表於2015-11-14

 【IT168 資訊】IT168 資訊】近日,2015年最為被低估的,具有巨大破壞力的漏洞浮出水面。在FoxGlove Security安全團隊的@breenmachine 釋出一篇部落格中介紹了該漏洞在最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS中的應用,實現遠端程式碼執行。更為嚴重的是,在漏洞被發現的9個月後依然沒有有效的java庫補丁來針對受到影響的產品進行加固。現在,讓我們探討下該漏洞的原理以及應用。

  背景:

  java反序列化漏洞

  java反序列化漏洞是一類被廣泛應用的漏洞,絕大多數的程式語言都會提供內建方法使使用者可以將自身應用所產生的資料存入硬碟或透過網路傳輸出去。這種將應用資料轉化為其他格式的過程稱之為序列化,而將讀取序列化資料的過程稱之為反序列化。

  當應用程式碼從使用者接受序列化資料並試圖反序列化改資料進行下一步處理時會產生反序列化漏洞。該漏洞在不同的語言環境下會導致多種結果,但最有危害性的,也是之後我們即將討論的是遠端程式碼注入。

  2.java反序列化漏洞發現歷程

  在最近幾年間,不斷的有java反序列化漏洞被曝光。最近的幾次分別產生於spring框架以及Groovy還有檔案上傳的java庫中,這些漏洞均得到了修復。

  但在最近的研究中,安全人員發現java反序列漏洞遠遠不止上述幾處,該漏洞廣泛的存在於java庫中。

  Java反序列化漏洞:

  漏洞產生原因:

  在java編寫的web應用與web伺服器間java通常會傳送大量的序列化物件例如以下場景:

  HTTP請求中的引數,cookies以及Parameters。

  RMI協議,被廣泛使用的RMI協議完全基於序列化

  JMX 同樣用於處理序列化物件

  自定義協議 用來接收與傳送原始的java物件

  在序列化過程中會使用ObjectOutputStream類的writeObject()方法,在接收資料後一般又會採用ObjectInputStream類的readObject()方法進行反序列化讀取資料。其程式碼示例如下:


java反序列化漏洞—被低估的破壞之王

  結果如圖:  

java反序列化漏洞—被低估的破壞之王

  上述程式碼中的java類ObjectInputStream在執行反序列化時並不會對自身的輸入進行檢查,意味著一種可能性,即惡意攻擊者構建特定的輸入,在ObjectInputStream類反序列化之後會產生非正常結果。而根據最新的研究,利用這一方法可以實現遠端執行任意程式碼。

  為了進一步說明,可以針對對上述程式碼進行了一點修改:

java反序列化漏洞—被低估的破壞之王

  結果:  

java反序列化漏洞—被低估的破壞之王

  主要修改為自定義了一個被序列化的物件myobject,透過定義myobject實現了java序列化的介面並且定義了一種名為“readObject”的方法。透過對比上面例子的輸出,可以發現反序列化的相關數值被修改了,即執行的使用者自身的程式碼。造成結果不同的關鍵在於readObject方法,java在讀取序列化物件的時候會先查詢使用者自定義的readObject是否存在,如果存在則執行使用者自定義的方法。

  2 漏洞觸發點尋找:

  在之前的論述中可以發現利用該漏洞首先應找出readObject方法呼叫,在找到之後進行下一步的注入操作。一般可以透過以下方法進行查詢:

  (1)針對特定的java應用,對此漏洞的應用應首先尋找可以利用的“靶點”,即確定呼叫反序列化函式的地點。這可以透過對java應用進行原始碼審計,例如找尋反序列化函式readObject呼叫情況。

  (2)對於該應用的網路行為進行抓包,尋找序列化資料(在包資料中,序列化資料一般會以ac ed 00 05開頭)來進行判斷。

  3.漏洞利用

  在發現序列化資料之後,需要產生一個用於測試的pyload。這裡可以在github上下載一個工具“ysoserial”並執行下列指令:  

java反序列化漏洞—被低估的破壞之王

  當/ tmp / pwned檔案被建立時說明測試已經開始,而後續的步驟將結合例項一起分析。

  漏洞利用例項:

  這裡以Jboss為例,Jboss利用的是HTTP協議,可以在任何埠上執行,預設安裝在8080埠中。而且Jboss與“JMXInvokerServlet”的通訊過程中存在一個公開漏洞。JMX是一個java的管理協議,在Jboss中的JMXInvokerServlet可以使用HTTP協議與其進行通話。這一通訊功能依賴於java的序列化類。

  在預設安裝的Jboss中,JMXInvokerServlet的路徑恰好為。如果使用者訪問一個web瀏覽器,實際上會返回一個原始的java物件,這中行為顯然存在一個漏洞。

  這個漏洞可以很經常的透過網際網路被利用,由於jmxinvokerservlet與主要的Web應用程式在同一個埠上執行,因此它很少被防火牆所攔截。

  基於以上原理可以透過以下指令收集jar檔案來測試該漏洞是否可用:

java反序列化漏洞—被低估的破壞之王

  由此可以以jmx作為Jboss接受外部輸入的點,可以利用java HTTP client包構建POST請求,post請求包中資料為使用ysoserial處理之後的構建程式碼。



































































































































































































http://hope.mnwww.com/jkxbw/10364816859.html






































































































http://hope.mnwww.com/zxwz/10364804168.html































































































































































































































































































































































































































































































































































































































































































































首頁  上一頁      共13037條記錄 1/14

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30065054/viewspace-1838894/,如需轉載,請註明出處,否則將追究法律責任。

相關文章