知识点:
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、其他类的readObject
或toString
方法(反序列化类对象可控)
5、反序列化利用链
(1) 入口类的readObject直接调用危险方法
(2) 入口参数中包含可控类,该类有危险方法,readObject时调用
(3) 入口类参数包含可控类,该类又调用其他有危险方法类,readObject调用
(4) 构造函数/静态代码块等类加载时隐式执行
6、反序列化利用条件
1、可控的输入变量进行了反序列化操作
你输入的数据被网站接收并进行了反序列化操作