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

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

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

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

背景

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

分析

首先,當(dāng)java應(yīng)用使用MySQL Connector/J(官方的JDBC驅(qū)動,本文基于其8.0+版本)連接mysql時,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)的連接屬性有兩個,分別是autoDeserialize和queryInterceptors,前者是設(shè)定MySQL Connector/J是否反序列化BLOB類型的數(shù)據(jù),后者是攔截器,在查詢執(zhí)行時觸發(fā),由com.mysql.cj.protocol.a.NativeProtocol#sendQueryPacket方法源碼可知,會在執(zhí)行查詢語句前后分別調(diào)用攔截器的preProcess和postProcess方法。

接下來定位下反序列化的觸發(fā)點,在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時,會對類型為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即為此前提到過的攔截器,在JDBC URL中設(shè)定屬性queryInterceptors為ServerStatusDiffInterceptor時,執(zhí)行查詢語句會調(diào)用攔截器的preProcess和postProcess方法,進(jìn)而通過上述調(diào)用鏈最終調(diào)用getObject(int columnIndex)方法。

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

try {
  toPopulate.clear();

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

這個結(jié)果集是執(zhí)行SQL語句“SHOW SESSION STATUS”后數(shù)據(jù)庫返回的值,SQL語句“SHOW SESSION STATUS”返回當(dāng)前數(shù)據(jù)庫連接的狀態(tài)值,實際是讀取系統(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é)議,自定義返回數(shù)據(jù),后面有時間的時候會寫寫這塊兒。

3.可控的JDBC URL

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

相關(guān)文章

  • springboot實現(xiàn)文件上傳和下載功能

    springboot實現(xiàn)文件上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了springboot實現(xiàn)文件上傳和下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java中的XML解析技術(shù)詳析

    Java中的XML解析技術(shù)詳析

    XML文檔是一個文檔樹,從根部開始,并擴展到樹的最底部,下面這篇文章主要給大家介紹了關(guān)于Java中XML解析技術(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Java線程通信中關(guān)于生產(chǎn)者與消費者案例分析

    Java線程通信中關(guān)于生產(chǎn)者與消費者案例分析

    這篇文章主要介紹了Java線程通信中關(guān)于生產(chǎn)者與消費者案例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • SpringBoot創(chuàng)建定時任務(wù)的示例詳解

    SpringBoot創(chuàng)建定時任務(wù)的示例詳解

    在Spring Boot中創(chuàng)建定時任務(wù),通常使用@Scheduled注解,這是Spring框架提供的一個功能,允許你按照固定的頻率(如每天、每小時、每分鐘等)執(zhí)行某個方法,本文給大家介紹了SpringBoot創(chuàng)建定時任務(wù)的示例,需要的朋友可以參考下
    2024-04-04
  • java中的數(shù)學(xué)計算函數(shù)的總結(jié)

    java中的數(shù)學(xué)計算函數(shù)的總結(jié)

    這篇文章主要介紹了java中的數(shù)學(xué)計算函數(shù)的總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • java SelectableChannel的使實例用法講解

    java SelectableChannel的使實例用法講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java SelectableChannel的使實例用法講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Java 詳解包裝類Integer與int有哪些共通和不同

    Java 詳解包裝類Integer與int有哪些共通和不同

    這篇文章主要介紹的是 Java中int和Integer的區(qū)別,Java 是一種強數(shù)據(jù)類型的語言,因此所有的屬性必須有一個數(shù)據(jù)類型,下面文章基于Java詳細(xì)int和Integer有何區(qū)別,需要的朋友可以參考一下
    2022-04-04
  • SpringBoot登錄驗證碼實現(xiàn)過程詳解

    SpringBoot登錄驗證碼實現(xiàn)過程詳解

    這篇文章主要介紹了SpringBoot登錄驗證碼實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • RabbitMQ開啟SSL與SpringBoot連接測試的配置方法

    RabbitMQ開啟SSL與SpringBoot連接測試的配置方法

    本文基于 CentOS 7 + Git + OpenSSL + yum 安裝的 RabbitMQ,需要讀者提交安裝好。其他方式也可變通參考本文。對RabbitMQ開啟SSL與SpringBoot連接測試相關(guān)知識感興趣的朋友一起看看吧
    2022-01-01
  • 一篇文章帶你了解Java方法的使用

    一篇文章帶你了解Java方法的使用

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評論

海原县| 高碑店市| 壶关县| 北京市| 阳高县| 聂荣县| 汝南县| 波密县| 连山| 社旗县| 宜春市| 宁乡县| 大名县| 中西区| 萨迦县| 资溪县| 临邑县| 临朐县| 彩票| 商洛市| 阳西县| 万宁市| 望都县| 新邵县| 广宁县| 阿拉善盟| 静乐县| 镇坪县| 沾益县| 沙湾县| 鹤岗市| 龙南县| 金昌市| 合江县| 东兴市| 井陉县| 大洼县| 扶绥县| 万年县| 九龙县| 阿拉善右旗|