国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java序列化反序列化原理及漏洞解決方案

瀏覽:2日期:2022-08-27 14:25:34

Java序列化

Java 提供了一種對(duì)象序列化的機(jī)制,該機(jī)制中,一個(gè)對(duì)象可以被表示為一個(gè)字節(jié)序列,該字節(jié)序列包括該對(duì)象的數(shù)據(jù)、有關(guān)對(duì)象的類型的信息和存儲(chǔ)在對(duì)象中數(shù)據(jù)的類型。

Java反序列化

反序列化就是將字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程

整個(gè)過(guò)程都是 Java 虛擬機(jī)(JVM)獨(dú)立的,也就是說(shuō),在一個(gè)平臺(tái)上序列化的對(duì)象可以在另一個(gè)完全不同的平臺(tái)上反序列化該對(duì)象,因此可以實(shí)現(xiàn)多平臺(tái)之間的通信、對(duì)象持久化存儲(chǔ),主要有如下幾個(gè)應(yīng)用場(chǎng)景。

HTTP:多平臺(tái)之間的通信,管理等

RMI:是 Java 的一組擁護(hù)開發(fā)分布式應(yīng)用程序的 API,實(shí)現(xiàn)了不同操作系統(tǒng)之間程序的方法調(diào)用。值得注意的是,RMI 的傳輸 100% 基于反序列化,Java RMI 的默認(rèn)端口是1099端口。

JMX:JMX 是一套標(biāo)準(zhǔn)的代理和服務(wù),用戶可以在任何 Java 應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理,中間件軟件 WebLogic 的管理頁(yè)面就是基于 JMX 開發(fā)的,而 JBoss 則整個(gè)系統(tǒng)都基于 JMX 構(gòu)架。

系列化反序列化基礎(chǔ)

序列化和反序列化本身并不存在問(wèn)題。但當(dāng)輸入的反序列化的數(shù)據(jù)可被用戶控制,那么攻擊者即可通過(guò)構(gòu)造惡意輸入,讓反序列化產(chǎn)生非預(yù)期的對(duì)象,在此過(guò)程中執(zhí)行構(gòu)造的任意代碼。

一個(gè)類的對(duì)象能夠序列化的成功需要兩個(gè)條件

該類必須實(shí)現(xiàn) java.io.Serializable 接口 該類的所有屬性必須是可序列化的。如果有一個(gè)屬性不是可序列化的,則該屬性必須注明是短暫的。

漏洞基本原理

簡(jiǎn)單的反序列化Demo

首先定義對(duì)象類Persion,包含兩個(gè)參數(shù)

public class implements java.io.Serializable{ public String name; public int age; public void info(){ System.out.println('Name:'+this.name+';nAge:'+this.age); }}

在主類中聲明對(duì)象,并且將對(duì)象序列化為二進(jìn)制文件,將其存儲(chǔ)到硬盤中

import java.io.*;public class Main{ public static void main(String [] args){ 將對(duì)象序列化為二進(jìn)制文件 Persion p = new Persion(); p.name = 'Joner'; p.age = 18; try { //打開一個(gè)文件輸入流 FileOutputStream fileOut = new FileOutputStream('D:testtest.db'); //建立對(duì)象輸入流 ObjectOutputStream out = new ObjectOutputStream(fileOut); //輸出反序列化對(duì)象 out.writeObject(p); out.close(); fileOut.close(); System.out.printf('保存成功'); }catch(IOException i){ i.printStackTrace(); }}

進(jìn)行反序列化

import java.io.*;public class Main{ public static void main(String [] args){ /*從二進(jìn)制文件中提取對(duì)象*/ Persion persion = null; try{ FileInputStream fileInputStream = new FileInputStream('D:testtest.db'); //建立對(duì)象輸入流 ObjectInputStream inputStream = new ObjectInputStream(fileInputStream); persion = (Persion) inputStream.readObject(); inputStream.close(); fileInputStream.close(); }catch (ClassNotFoundException c){ System.out.println('對(duì)象未找到'); c.printStackTrace(); return; } catch (FileNotFoundException e) { e.printStackTrace(); return; } catch (IOException e) { e.printStackTrace(); return; } System.out.println('反序列化對(duì)象.......'); System.out.println('Name:'+persion.name); System.out.println('Age:'+persion.age); }}

查看test.db文件的內(nèi)容可以看見如下內(nèi)容

其中 AC ED 00 05 是java 序列化內(nèi)容的特征,其中00 05 是版本信息,base64編碼后為ro0AB

反序列化漏洞Demo

在上面的Demo中可以看到,進(jìn)行反序列化時(shí)會(huì)調(diào)用readObject()方法,如果readObject方法書寫不當(dāng)就會(huì)引發(fā)漏洞。

import java.io.*;public class Main{ public static void main(String [] args)throws Exception{ Unsafeclass unsafeclass = new Unsafeclass(); unsafeclass.name = 'hhhhh'; FileOutputStream fileOutputStream = new FileOutputStream('object'); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); //將對(duì)象寫入object文件 objectOutputStream.writeObject(unsafeclass); objectOutputStream.close(); //從文件中反序列化對(duì)象 FileInputStream fileInputStream = new FileInputStream('object'); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); //恢復(fù)對(duì)象 Unsafeclass objectFormDisk = (Unsafeclass)objectInputStream.readObject(); System.out.println(objectFormDisk.name); objectOutputStream.close(); }}class Unsafeclass implements Serializable{ public String name; //重寫readObject()方法 private void readObject(java.io.ObjectInputStream inputStream ) throws IOException , ClassNotFoundException{ //執(zhí)行默認(rèn)的readObdect()方法 inputStream.defaultReadObject(); //執(zhí)行打開計(jì)算器命令 Runtime.getRuntime().exec('calc.exe'); }}

程序運(yùn)行過(guò)程為:

UnsafeClass類背序列化進(jìn)入object文件 從object文件中恢復(fù)對(duì)象 調(diào)用被恢復(fù)對(duì)象的readObject()方法 命令被執(zhí)行

這樣看感覺并不會(huì)有人會(huì)這樣寫readobject()這個(gè)方法,而且一些成熟的框架都會(huì)有防范反序列化的方法,但仍有很大比例的反序列化漏洞,這主要是使用了不安全的庫(kù)造成的。上面只是介紹了簡(jiǎn)單的Java反序列化過(guò)程,接下來(lái)會(huì)有一篇文章介紹反序列化漏洞檢測(cè)方法以及復(fù)現(xiàn)一些經(jīng)典反序列化漏洞。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 精品欧美高清不卡在线 | 日韩一区二区精品久久高清 | 欧美一级高清免费播放 | 成人1000部免费观看视频 | 久久综合狠狠综合久久综合88 | 欧美做a欧美| 久久精品中文字幕首页 | 成人午夜免费在线观看 | 午夜性爽快免费视频播放 | 国产精品videossex另类 | 亚洲国产日韩欧美一区二区三区 | 美国一级毛片在线 | 大量真实偷拍情侣视频野战 | 亚洲国产精品免费观看 | 日韩精品观看 | 国产成人亚洲精品91专区高清 | 亚洲视频 欧美视频 | 免费看一区二区三区 | 四色永久 | 日韩欧美在线播放视频 | 欧美一级毛片高清毛片 | 久久国产成人精品麻豆 | 欧美日韩a∨毛片一区 | 国产激情视频在线 | 一级a做爰片欧欧美毛片4 | 亚洲精品久久久久久久久久久网站 | 国产男女爽爽爽爽爽免费视频 | 久久亚洲国产欧洲精品一 | 99国产精品视频免费观看 | 国产日韩精品欧美一区视频 | 亚洲国产成人久久一区久久 | 真人一级毛片全部免 | 亚洲欧美高清 | 国产亚洲精品久久久久91网站 | 亚洲欧美日韩在线精品一区二区 | 欧美一级特黄真人毛片 | 欧美日韩中文字幕在线视频 | 国产成年网站v片在线观看 国产成人aa在线视频 | 欧美精品在线视频 | 久草成人在线视频 | 国内国语一级毛片在线视频 |