1. 程式人生 > >java反序列化安全例項解析

java反序列化安全例項解析

什麼是序列化

序列化 (Serialization)將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。

簡單來說:

序列化: 將資料結構或物件轉換成二進位制串的過程

反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程

\

下面是將字串物件先進行序列化,儲存到本地檔案,然後再通過反序列化進行恢復的樣例程式碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public static void main(String args[]) throws Exception { String obj = "hello world!"; // 將序列化物件寫入檔案object.db中 FileOutputStream fos = new FileOutputStream("object.db"); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(obj); os.close(); // 從檔案object.db中讀取資料
FileInputStream fis = new FileInputStream("object.db"); ObjectInputStream ois = new ObjectInputStream(fis); // 通過反序列化恢復物件obj String obj2 = (String)ois.readObject(); ois.close(); }

反序列化漏洞原理

反序列化漏洞的本質就是反序列化機制打破了資料和物件的邊界,導致攻擊者注入的惡意序列化資料在反序列化過程中被還原成物件,控制了物件就可能在目標系統上面執行攻擊程式碼。Java序列化應用於RMI JMX JMS 技術中。

漏洞危害

\

案例一:Apache ActiveMQ 5.12.0 遠端程式碼執行漏洞(JMS)

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

\
\
\

受到影響的訊息系統如下

Apache ActiveMQ 5.12.0 and earlier

HornetQ 2.4.0 and earlier

Oracle OpenMQ 5.1 and earlier

IBM Websphere MQ 8.0.0.4 and earlier

Oracle Weblogic 12c and earlier

Pivotal RabbitMQ JMS client 1.4.6 and earlier

IBM MessageSight MessageSight V1.2 JMSClient and earlier

SwiftMQ JMS client 9.7.3 and earlier

Apache ActiveMQ Artemis client 1.2.0 and earlier

Apache Qpid JMS client 0.9.0 and earlier

Amazon SQS Java Messaging Library 1.0.0 and earlier

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

Jboss利用的是HTTP協議,可以在任何埠上執行,預設安裝在8080埠中。JMX是一個java的管理協議,在Jboss中的JMXInvokerServlet可以使用HTTP協議與其進行通話。這一通訊功能依賴於java的序列化類。

本地構造惡意的序列化物件

\

構造惡意的序列化物件傳送給目標主機:

\

執行系統命令

\

RedHat釋出JBoss相關產品的解決方案:

https://access.redhat.com/solutions/2045023

受影響的JBoss產品有:

Environment

Red Hat JBoss A-MQ 6.x

Red Hat JBoss BPM Suite (BPMS) 6.x

Red Hat JBoss BRMS 6.x

Red Hat JBoss BRMS 5.x

Red Hat JBoss Data Grid (JDG) 6.x

Red Hat JBoss Data Virtualization (JDV) 6.x

Red Hat JBoss Data Virtualization (JDV) 5.x

Red Hat JBoss Enterprise Application Platform 6.x

Red Hat JBoss Enterprise Application Platform 5.x

Red Hat JBoss Enterprise Application Platform 4.3.x

Red Hat JBoss Fuse 6.x

Red Hat JBoss Fuse Service Works (FSW) 6.x

Red Hat JBoss Operations Network (JBoss ON) 3.x

Red Hat JBoss Portal 6.x

Red Hat JBoss SOA Platform (SOA-P) 5.x

Red Hat JBoss Web Server (JWS) 3.x

案例三:

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 and including 1.649

All Jenkins LTS releases up to and including 1.642.1

漏洞防禦

1、反序列化物件白名單控制,在resolveClass方法中校驗物件名字。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class LookAheadObjectInputStream extends ObjectInputStream { public LookAheadObjectInputStream(InputStream inputStream)

相關推薦

java序列安全例項解析

什麼是序列化 序列化 (Serialization)將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。 簡單來說: 序列化: 將資料結構或物件轉

Java序列序列例項

基本概念: 序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。 序列化為一般檔案,也序列化為XML檔案(使用XStream) 用於序列化的實體類Person.java 程式碼如下(記

懸鏡安全Java 序列任意程式碼執行漏洞分析與利用

本文首發平臺:懸鏡官網,如需轉載,請聯絡小編,謝謝。        2015年的1月28號,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上給出了一個報告[3],報告中介紹了Java反序列化漏洞可以利用Apache Commons

java序列漏洞的檢測

spa div ria comm span Coding python odin ima 1、首先下載常用的工具ysoserial 這邊提供下載地址:https://jitpack.io/com/github/frohoff/ysoserial/master-v0.0.5-

java序列漏洞原理研習

java程序 out import 修改 sed 判斷 pub 發現 commons 零、Java反序列化漏洞   java的安全問題首屈一指的就是反序列化漏洞,可以執行命令啊,甚至直接getshell,所以趁著這個假期好好研究一下java的反序列化漏洞。另外呢,組裏多位大

Java序列漏洞的挖掘、攻擊與防禦

body per 所有 http 操作 www except ride 方法 一、Java反序列化漏洞的挖掘 1、黑盒流量分析: 在Java反序列化傳送的包中,一般有兩種傳送方式,在TCP報文中,一般二進制流方式傳輸,在HTTP報文中,則大多以base64傳輸。因而在流量中

關於metaspolit中進行JAVA序列滲透RMI的原理分析

resp format shel git led 技術 文件 error: return 一、背景: 這裏需要對java反序列化有點了解,在這裏得推廣下自己的博客嘛,雖然寫的不好,廣告還是要做的。原諒我: 1、java反序列化漏洞原理研習 2、java反序列化漏洞的檢測 二

java序列原理-Demo(一)

51cto n) www. fault clas ack 保存 發現 auto java反序列化原理-Demo(一) 0x00 什麽是java序列化和反序列? Java 序列化是指把 Java 對象轉換為字節序列的過程便於保存在內存、文件、數據庫中,ObjectOutput

java序列原理-Demo(二)

mage ins bytearray stream utc 繼承 etc input exceptio java反序列化原理-Demo(二) 0x00 測試代碼以及運行結果 測試代碼: package test; import java.io.ByteArrayInput

java序列 - Transformer類可以執行惡意代碼的原理

write bject calc == return cal leg invoke stack java反序列化 - Transformer類可以執行惡意代碼的原理 0x00 代碼 Transformer[] transformers = new Transformer[]

java序列 - transformedMap類可以執行惡意代碼的原理

clas invoke 序列化 pri [] nag roc map.entry 什麽 java反序列化 - transformedMap類可以執行惡意代碼的原理 0x00 代碼 Map map=new HashMap(); map.put("key","

第九屆極客大挑戰——怎麼又是江師傅的祕密(java序列

引言:因為太想加入三葉草了,所以極客大挑戰這段時間一直在努力的學習,原來還真沒想到能在比賽中拿到排行榜第一的成績,不過現在看來努力始終都是有回報的。但我依然還是比較菜啊-.-,最近卻有很多夥伴加我好友,一來就叫我大佬,讓我深感有愧-.-,既然都想看我wp,那我就挑幾道題寫寫好了,口拙詞劣還望見諒。

Java序列漏洞:在受限環境中從漏洞發現到獲取反向Shell

前言 Java反序列化漏洞可以說是Java安全的一塊心病,近年來更是在安全界“出盡風頭”。其實說到Java反序列化的問題,早在2015年年初的在AppSecCali大會上,兩名安全研究人員Chris Frohoff 和 Gabriel Lawrence發表了一篇題為《Marshallin

Java序列漏洞分析

https://xz.aliyun.com/t/136  寫的挺詳細的,大致瞭解了,整個流程,有點事,之後在細跟 目錄 1. 背景 2. 認識java序列化與反序列化 3. 理解漏洞的產生 4. POC構造 5. 實際漏洞環境測試 6. 總結 背景   2015年11月

java序列Commons-Collections1分析

Commons-Collections1也是利用InvokerTransformer類中的transform方法反射機制執行命令。實驗用的是commons-collections 3.1這裡說一下為什麼呼叫構造elEntry.setValue("hahah");就會彈計算器。poc前一步需要理解如下程式碼:

Java序列之Jackson-databind

這個洞的cve編號:CVE-2017-17485,漏洞環境就如第一個連結那樣,jdk需要在jdk 1.8以上。 先看一下Jackson-databind的用法,說白了就是將json轉換成物件。 test-legit.json程式碼如下 {"id":123} 執行結果如圖: 如果注入的json程式碼如下程

JAVA序列exp及使用方法

這兩天很火的java反序列化漏洞,看到烏雲大牛已經開始刷分,於是找來實踐一波 exp來源 ysoserial 這個專案針對不同的java產品給出了簡單的漏洞利用指令碼. 其中weblogic和jenkins提供python指令碼,但需自己

JAVA序列漏洞

目錄 反序列化漏洞 序列化和反序列化 JAVA WEB中的序列化和反序列化 物件序列化和反序列範例 JAVA中執行系統命令 重寫readObject()方法 Apache Commons Collections 由於本人並非JAVA程式設計師,所以對JAV

Java 序列時物件包名改變

開發中經常會使用到ObjectInputStream進行物件的反序列化,這時如果物件的包名發生改變,程式就會報java.lang.ClassNotFoundException。在包名不能改變的情況下,我們只能在反序列化時把序列化前的物件強制轉換成當前專案下的物件。這時我們可以

Java序列漏洞總結

新的 私有 orm decorate 靈活 調用 序列 很好 方式 前言 什麽是序列化和反序列化 Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。反序列化就是通過