最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年08月04日 15:49:26   作者:大專(zhuān)欄  
這篇文章主要介紹了Java序列化反序列化原理及漏洞解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Java序列化

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

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ù)開(kāi)發(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ù),用戶(hù)可以在任何 Java 應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理,中間件軟件 WebLogic 的管理頁(yè)面就是基于 JMX 開(kāi)發(fā)的,而 JBoss 則整個(gè)系統(tǒng)都基于 JMX 構(gòu)架。

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

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

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

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

漏洞基本原理

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

首先定義對(duì)象類(lèi)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);
  }
}

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

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 {

      //打開(kāi)一個(gè)文件輸入流
      FileOutputStream fileOut = new FileOutputStream("D:\test\test.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:\test\test.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)容可以看見(jiàn)如下內(nèi)容

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

反序列化漏洞Demo

在上面的Demo中可以看到,進(jìn)行反序列化時(shí)會(huì)調(diào)用readObject()方法,如果readObject方法書(shū)寫(xiě)不當(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ì)象寫(xiě)入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;
  //重寫(xiě)readObject()方法
  private void readObject(java.io.ObjectInputStream inputStream ) throws IOException , ClassNotFoundException{
    //執(zhí)行默認(rèn)的readObdect()方法
    inputStream.defaultReadObject();
    //執(zhí)行打開(kāi)計(jì)算器命令
    Runtime.getRuntime().exec("calc.exe");
  }
}

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

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

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

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

相關(guān)文章

  • SpringBoot整合Jackson的過(guò)程詳解

    SpringBoot整合Jackson的過(guò)程詳解

    這篇文章給大家介紹了SpringBoot整合Jackson的整合過(guò)程,文中通過(guò)代碼示例給給大家介紹的非常詳細(xì),并附帶附工具類(lèi)與使用案例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • SpringBoot通過(guò)注解注入Bean的幾種方式解析

    SpringBoot通過(guò)注解注入Bean的幾種方式解析

    這篇文章主要為大家介紹了SpringBoot注入Bean的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)

    java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)

    這篇文章主要介紹了java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于后端如何解決跨域的問(wèn)題說(shuō)明

    關(guān)于后端如何解決跨域的問(wèn)題說(shuō)明

    這篇文章主要介紹了關(guān)于后端如何解決跨域的問(wèn)題說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java實(shí)現(xiàn)查找文本內(nèi)容替換功能示例

    java實(shí)現(xiàn)查找文本內(nèi)容替換功能示例

    文本替換幾乎是所有文本編輯器都支持的功能,但是要限制在編輯其中才可以執(zhí)行該功能。本實(shí)例實(shí)現(xiàn)了制定文本文件的內(nèi)容替換,并且不需要再編輯其中打開(kāi)文本文件
    2014-02-02
  • Java實(shí)現(xiàn)Excel導(dǎo)出并添加水印

    Java實(shí)現(xiàn)Excel導(dǎo)出并添加水印

    這篇文章主要為大家詳細(xì)介紹了Java如何使用poi-ooxml包導(dǎo)出xlsx添加水印,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Java實(shí)現(xiàn)FTP批量大文件上傳下載篇1

    Java實(shí)現(xiàn)FTP批量大文件上傳下載篇1

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)FTP批量大文件上傳下載的基礎(chǔ)篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • java?mybatis如何操作postgresql?array數(shù)組類(lèi)型

    java?mybatis如何操作postgresql?array數(shù)組類(lèi)型

    這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼

    SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼

    這篇文章主要介紹了SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼,主要包括hibernate攔截器的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • springboot jackson配置教程

    springboot jackson配置教程

    這篇文章主要介紹了springboot jackson配置教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

太白县| 贡山| 西丰县| 德格县| 通道| 克山县| 双流县| 迁西县| 新沂市| 翁源县| 桐乡市| 海伦市| 石首市| 寻乌县| 普兰县| 白河县| 新乐市| 岗巴县| 娄底市| 临江市| 观塘区| 隆子县| 城口县| 宜丰县| 肥西县| 青岛市| 南京市| 昂仁县| 永兴县| 紫云| 南雄市| 浦江县| 天气| 田林县| 连江县| 红河县| 龙门县| 焉耆| 长乐市| 城口县| 马边|