欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java JDBC導(dǎo)致的反序列化攻擊原理解析

 更新時(shí)間:2019年12月18日 09:28:46   作者:Welk1n  
這篇文章主要介紹了Java JDBC導(dǎo)致的反序列化攻擊原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java JDBC導(dǎo)致的反序列化攻擊原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

背景

上周BlackHat Europe 2019的議題《New Exploit Technique In Java Deserialization Attack》中提到了一個(gè)通過(guò)注入JDBC URL實(shí)現(xiàn)反序列化攻擊的場(chǎng)景,簡(jiǎn)單分析一下。

分析

首先,當(dāng)java應(yīng)用使用MySQL Connector/J(官方的JDBC驅(qū)動(dòng),本文基于其8.0+版本)連接mysql時(shí),JDBC URL的格式如下:protocol//[hosts]/[database]?properties,具體可看mysql官方文檔,示例:jdbc:mysql://localhost:3306/test?useSSL=true

其中,protocol、host、database都比較好理解,URL中的properties可以設(shè)定MySQL Connector/J連接mysql服務(wù)器的具體方式,關(guān)于properties的官方文檔地址,其中和本文相關(guān)的連接屬性有兩個(gè),分別是autoDeserialize和queryInterceptors,前者是設(shè)定MySQL Connector/J是否反序列化BLOB類型的數(shù)據(jù),后者是攔截器,在查詢執(zhí)行時(shí)觸發(fā),由com.mysql.cj.protocol.a.NativeProtocol#sendQueryPacket方法源碼可知,會(huì)在執(zhí)行查詢語(yǔ)句前后分別調(diào)用攔截器的preProcess和postProcess方法。

接下來(lái)定位下反序列化的觸發(fā)點(diǎn),在mysql-connector-java組件下全局搜索關(guān)鍵字“.readObject()”,定位到com.mysql.cj.jdbc.result.ResultSetImpl類中的getObject(int columnIndex)方法,部分核心代碼如下:

public Object getObject(int columnIndex) throws SQLException {
……
case BLOB:
 byte[] data = getBytes(columnIndex);
 if (this.connection.getPropertySet().getBooleanProperty(PropertyDefinitions.PNAME_autoDeserialize).getValue()) {
   Object obj = data;
   // Serialized object?
   try {
    ByteArrayInputStream bytesIn = new ByteArrayInputStream(data);
    ObjectInputStream objIn = new ObjectInputStream(bytesIn);
    obj = objIn.readObject();
   }
 }
}

變量data即為mysql返回結(jié)果集,當(dāng)JDBC URL中設(shè)定屬性autoDeserialize為true時(shí),會(huì)對(duì)類型為bit、binary以及blob的數(shù)據(jù)進(jìn)行反序列化,如何觸發(fā)getObject(int columnIndex)方法的調(diào)用呢?議題中給出的調(diào)用鏈如下:

> com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#preProcess/postProcess
> com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#populateMapWithSessionStatusValues
> com.mysql.cj.jdbc.util.ResultSetUtil#resultSetToMap
> com.mysql.cj.jdbc.result.ResultSetImpl#getObject

ServerStatusDiffInterceptor即為此前提到過(guò)的攔截器,在JDBC URL中設(shè)定屬性queryInterceptors為ServerStatusDiffInterceptor時(shí),執(zhí)行查詢語(yǔ)句會(huì)調(diào)用攔截器的preProcess和postProcess方法,進(jìn)而通過(guò)上述調(diào)用鏈最終調(diào)用getObject(int columnIndex)方法。

實(shí)際利用還有一個(gè)問(wèn)題,最終調(diào)用getObject方法的對(duì)象是數(shù)據(jù)庫(kù)返回的結(jié)果集,由populateMapWithSessionStatusValues方法可知:

try {
  toPopulate.clear();

  stmt = this.connection.createStatement();
  rs = stmt.executeQuery("SHOW SESSION STATUS");
  ResultSetUtil.resultSetToMap(toPopulate, rs);
}

這個(gè)結(jié)果集是執(zhí)行SQL語(yǔ)句“SHOW SESSION STATUS”后數(shù)據(jù)庫(kù)返回的值,SQL語(yǔ)句“SHOW SESSION STATUS”返回當(dāng)前數(shù)據(jù)庫(kù)連接的狀態(tài)值,實(shí)際是讀取系統(tǒng)表INFORMATION_SCHEMA.SESSION_VARIABLES的值,也可能是PERFORMANCE_SCHEMA.SESSION_VARIABLES(Mysql版本差異導(dǎo)致)。但是mysql中INFORMATION_SCHEMA和PERFORMANCE_SCHEMA都是不允許被修改的,所以需要想辦法操縱返回的數(shù)據(jù)。

利用條件

1.本質(zhì)上還是Java原生的反序列化利用,所以需要環(huán)境中有可用的Gadget;

2.需要能偽造相關(guān)系統(tǒng)表的數(shù)據(jù),將“SHOW SESSION STATUS”的執(zhí)行結(jié)果設(shè)置為我們精心構(gòu)造的反序列化數(shù)據(jù),或者基于mysql連接協(xié)議,自定義返回?cái)?shù)據(jù),后面有時(shí)間的時(shí)候會(huì)寫(xiě)寫(xiě)這塊兒。

3.可控的JDBC URL

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

相關(guān)文章

  • Java去重排序之Comparable與Comparator的使用及說(shuō)明

    Java去重排序之Comparable與Comparator的使用及說(shuō)明

    這篇文章主要介紹了Java去重排序之Comparable與Comparator的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題

    Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題

    這篇文章主要介紹了Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題,對(duì)架構(gòu)感興趣的同學(xué),可以參考下
    2021-04-04
  • 在Java程序中使用數(shù)據(jù)庫(kù)的新方法

    在Java程序中使用數(shù)據(jù)庫(kù)的新方法

    這篇文章主要介紹了在Java程序中使用數(shù)據(jù)庫(kù)的新方法,講述了Java8以來(lái)數(shù)據(jù)庫(kù)API的一些新特性,需要的朋友可以參考下
    2015-07-07
  • Java zookeeper服務(wù)的使用詳解

    Java zookeeper服務(wù)的使用詳解

    ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等
    2022-08-08
  • linux查找安裝jdk并配置JAVA_HOME的方法

    linux查找安裝jdk并配置JAVA_HOME的方法

    這篇文章主要介紹了linux查找安裝jdk,配置JAVA_HOME,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java創(chuàng)建型模式之建造者模式詳解

    Java創(chuàng)建型模式之建造者模式詳解

    建造者模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。本文將通過(guò)示例講解建造者模式,需要的可以參考一下
    2023-02-02
  • Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例,簡(jiǎn)述了異或運(yùn)算以及具體實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • java 虛擬機(jī)中對(duì)象訪問(wèn)詳解

    java 虛擬機(jī)中對(duì)象訪問(wèn)詳解

    這篇文章主要介紹了java 虛擬機(jī)中對(duì)象訪問(wèn)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 最新版Eclipse安裝、配置圖文教程詳解

    最新版Eclipse安裝、配置圖文教程詳解

    這篇文章主要介紹了新版Eclipse安裝、配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java elasticSearch-api的具體操作步驟講解

    Java elasticSearch-api的具體操作步驟講解

    這篇文章主要介紹了elasticSearch-api的具體操作步驟講解,本文通過(guò)詳細(xì)的步驟介紹和圖文代碼展示講解了該項(xiàng)技術(shù),需要的朋友可以參考下
    2021-06-06

最新評(píng)論