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

发布于:2025-04-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

知识点:
1、安全开发-JavaEE-动态代理&序列化&反序列化
2、安全开发-JavaEE-readObject&toString方法

一、演示案例-WEB开发-JavaEE-动态代理

动态代理

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

通俗来讲这个动态代理可以理解为歌手的经纪人,明星本人只需要做好自己要做的事情(只负责好唱歌),假设有商务活动想邀请这个明星去唱歌,就会找歌手的经纪人(确认合同、确认金额、确认唱什么歌等等前置流程),一切确定后,歌手本人只需要去到现场唱歌即可,后续收演出费什么也都是经纪人去完成(后置流程)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、创建接口及定义方法

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

安全案例:Ysoserial-CC1链-LazyMap

在这里插入图片描述
在这里插入图片描述

二、演示案例-WEB开发-JavaEE-序列化&反序列化&利用链&危险方法&重写方法

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 对象
FileInputStream:其主要作用是从文件读取字节数据
FileOutputStream:其主要作用是将字节数据写入文件
ObjectInputStream:用于从输入流中读取对象,实现对象的反序列化操作
ObjectOutputStream:用于将对象并写入输出流的类,实现对象的序列化操作

序列化-writeObject()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反序列化-readObject()

在这里插入图片描述
在这里插入图片描述

利用看下面

1、看序列化的对象有没有重写readObject方法(方法里是否包含危险代码)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、看序列化的对象有没有被输出就会调用toString方法(方法里是否包含危险代码)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、其他类的readObjecttoString方法(反序列化类对象可控)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、反序列化利用链

(1) 入口类的readObject直接调用危险方法
(2) 入口参数中包含可控类,该类有危险方法,readObject时调用
(3) 入口类参数包含可控类,该类又调用其他有危险方法类,readObject调用
(4) 构造函数/静态代码块等类加载时隐式执行

6、反序列化利用条件

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

你输入的数据被网站接收并进行了反序列化操作

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

在这里插入图片描述

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


网站公告

今日签到

点亮在社区的每一天
去签到