第45天:Web开发-JavaEE应用&动态接口代理&原生反序列化&危险Invoke&重写方法&利用链

#知识点
1、安全开发-JavaEE-动态代理&序列化&反序列化

2、安全开发-JavaEE-readObject&toString方法

一、动态代理 -(代理类似"分工制")

代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。而Java的代理机制分为静态代理和动态代理,而这里我们主要重点学习java自带的"jdk动态代理"机制也叫"接口代理"。

1、创建接口及定义方法

2、实现/调用接口及定义方法操作

3、实现接口及重写invoke方法

4、创建代理对象并调用方法

安全总结:利用条件分析&执行invoke

只要使用了动态代理技术,当代码执行时,invoke方法会默认执行(关注"代理对象的第三个参数")->安全问题随之产生

安全案例:Ysoserial-CC1链-LazyMap

二、反序列化

1、序列化与反序列化

序列化:将内存中的对象压缩成字节流

反序列化:将字节流转化成内存中的对象

序列化与反序列化其实就是对象与数据格式(即字节流)的转换。

2、为什么有序列化技术->让数据在传输过程中保持完整性,解决数据传输过程中各种应用的解析不支持问题(类似翻译机,换成大家都听的懂的数据)

序列化与反序列化的设计就是用来传输数据的。

当两个进程进行通信的时候,可以通过序列化反序列化来进行传输。

能够实现数据的持久化,通过序列化可以把数据永久的保存在硬盘上,也可以理解为通过序列化将数据保存在文件中。

应用场景:

(1) 想把内存中的对象保存到一个文件中或者是数据库当中。

(2) 用套接字在网络上传输对象。

(3) 通过RMI传输对象的时候。

3、常见的创建的序列化和反序列化协议(重点)

在实战代码中看到如下关键字->可推断使用了序列化&反序列化技术

• JAVA内置的writeObject()/readObject()

• JAVA内置的XMLDecoder()/XMLEncoder

• XStream->第三方组件

• SnakeYaml->第三方组件

• FastJson->第三方组件

• Jackson->第三方组件

4、为什么会出现反序列化安全问题

JAVA内置的writeObject()/readObject()内置原生写法分析:

writeObject():主要用于将 Java 对象序列化为字节流并写入输出流

readObject():主要用于从输入流中读取字节序列反序列化为 Java 对象->readObject()造成反序列化漏洞

FileInputStream:其主要作用是从文件读取字节数据

FileOutputStream:其主要作用是将字节数据写入文件

ObjectInputStream:用于从输入流中读取对象,实现对象的反序列化操作

ObjectOutputStream:用于将对象并写入输出流的类,实现对象的序列化操作

①将对象->序列化操作

②将ser.txt反序列化->对象操作

利用看下面:

• 看序列化的对象User有没有重写readObject方法(危险代码)

• 看序列化的对象有没有被输出->就会调用toString方法(危险代码)

以下代码中:反序列化对象o被输出了->所以会调用User.java中的toString()

• 其他类的readObject或toString方法(反序列化类可控)

上图查看是否反序列化的安全问题,更多是从代码的角度去发现的,实战中没有代码->所以实战中更多的是去发现java的组件jar包,依赖等代码的调用关系,看存不存在上图这种toString(),readObject()反序列化利用点

5、反序列化利用链

(1) 入口类的readObject直接调用危险方法

(2) 入口参数中包含可控类,该类有危险方法,readObject时调用

(3) 入口类参数包含可控类,该类又调用其他有危险方法类,readObject调用

(4) 构造函数/静态代码块等类加载时隐式执行

上图查看是否反序列化的安全问题,更多是从代码的角度去发现的,实战中没有代码->所以实战中更多的是去发现java的组件jar包,依赖等代码的调用关系,看存不存在上图这种toString(),readObject()反序列化利用点

6、反序列化利用条件:

(1) 可控的输入变量进行了反序列化操作

(2) 实现了Serializable或者Externalizable接口的类的对象

(3) 能找到调用方法的危险代码或间接的利用链引发(依赖链)

相关推荐
云烟成雨TD5 分钟前
Agent Scope Java 2.x 系列【1】核心架构
java·人工智能·agent
愛~杦辷个訾9 分钟前
Java Springboot使用阿里云oss对图片进行等质量压缩,转换成webp格式的压缩图。
java·spring boot·阿里云·oss
吴阿福|一人公司11 分钟前
Python 类变量修改的压力测试:高并发场景
开发语言·python
天天进步201517 分钟前
Tunnelto 源码解析 #13:自托管部署:Docker、环境变量、端口规划与单实例限制
开发语言
AI科技星18 分钟前
第三卷:质数王朝志(全卷定稿)
c语言·开发语言·汇编·electron·概率论
霸道流氓气质20 分钟前
Spring Boot Multipart 表单中文乱码问题全解析
java·spring boot·后端
dadaobusi23 分钟前
Linux内核完成大量内存/调度/时间子系统初始化的关键阶段
java·linux·前端
kyle~30 分钟前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
yujunl31 分钟前
Integrated Security=True(Windows 集成身份验证)
开发语言
右耳朵猫AI32 分钟前
Python周刊2026W23 | Polars 1.41、PyPy v7.3.23、Python 3.15、httpx2、dj-lite-tenant
开发语言·python