Web开发-JavaEE应用&动态接口代理&原生反序列化&危险Invoke&重写方法&利用链
知识点:1、安全开发-JavaEE-动态代理&序列化&反序列化
2、安全开发-JavaEE-readObject&toString方法
一、演示案例-WEB开发-JavaEE-动态代理
动态代理
https://i-blog.csdnimg.cn/direct/1b59527d823848e78ecd9ffddad7d7df.png
代理模式Java当中最常用的设计模式之一。其特性是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及过后处理消息等。而Java的代理机制分为静态代理和动态代理,而这里我们主要重点学习java自带的jdk动态代理机制
普通来讲这个动态代理可以明白为歌手的经纪人,明星本人只需要做好自己要做的事变(只负责好唱歌),假设有商务活动想邀请这个明星去唱歌,就会找歌手的经纪人(确认合同、确认金额、确认唱什么歌等等前置流程),统统确定后,歌手本人只需要去到现场唱歌即可,后续收演出费什么也都是经纪人去完成(后置流程)
https://i-blog.csdnimg.cn/direct/5568f1b4594844bd9d0c9638edef3b77.png
https://i-blog.csdnimg.cn/direct/7cdfcd38ebed4715b81b2391c4a7125f.png
https://i-blog.csdnimg.cn/direct/da3ebb65bc2e41c8aa5da90e8cff3d92.png
https://i-blog.csdnimg.cn/direct/de33061a8386478497e0645c79342b62.png
1、创建接口及定义方法
https://i-blog.csdnimg.cn/direct/5955e11f49ee490eae121e32ab0db34c.png
2、实现接口及定义方法操作
https://i-blog.csdnimg.cn/direct/7f913961b0be4262ac7349ade4002fac.png
https://i-blog.csdnimg.cn/direct/22a8deeba0244244b3c35faf1c1e978a.png
3、实现接口及重写invoke方法
https://i-blog.csdnimg.cn/direct/8defda3e4c564ba6a8bf5f092e23c086.png
https://i-blog.csdnimg.cn/direct/05b1c1efe3b341ba825829cec987d370.png
4、创建代理对象并调用方法
https://i-blog.csdnimg.cn/direct/bb6133df6c5a4c09bad9de706347f732.png
https://i-blog.csdnimg.cn/direct/0a38f235302e42c7a22dc490880a06cf.png
https://i-blog.csdnimg.cn/direct/086801162b614d4bb7a52e93900d46b9.png
https://i-blog.csdnimg.cn/direct/f9a1be9e530e4b16a083c2a480ff28b6.png
https://i-blog.csdnimg.cn/direct/d2990d7db71f4edaa641c0da96ac5935.png
https://i-blog.csdnimg.cn/direct/258bdb5e80ca41a1b5cc29a28c3a0ef9.png
https://i-blog.csdnimg.cn/direct/e7fb81c7a77f4e2d82b6a3f5e7a61695.png
安全总结:利用条件分析&执行invoke
https://i-blog.csdnimg.cn/direct/9c39585a3f3646b8a8ecb962e89b5bb5.png
https://i-blog.csdnimg.cn/direct/3c8aae4da7c044e59fd6a1bba638879c.png
安全案例:Ysoserial-CC1链-LazyMap
https://i-blog.csdnimg.cn/direct/5bd595c9c20647d88fbc45b08beed8ee.png
https://i-blog.csdnimg.cn/direct/e665de9275a04de0bdb140449e1e66cb.png
二、演示案例-WEB开发-JavaEE-序列化&反序列化&利用链&危险方法&重写方法
1、序列化与反序列化
https://i-blog.csdnimg.cn/direct/b5e6925b94cc465891456a38149a7ba3.png
https://i-blog.csdnimg.cn/direct/cd50aa5a1fce4244bdce712b499abe8e.png
序列化:将内存中的对象压缩成字节流
反序列化:将字节流转化成内存中的对象
序列化与反序列化其实就是对象与数据格式的转换。
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()
https://i-blog.csdnimg.cn/direct/e0ccbd52c9da457aa0cefdeffb02f11f.png
https://i-blog.csdnimg.cn/direct/b49acc7455204dd6ba9be805b6af74cd.png
https://i-blog.csdnimg.cn/direct/86a0b2092d1f42dfbcf1a244e9ddef04.png
https://i-blog.csdnimg.cn/direct/0616bedc333f468fbcec53bc1c372b57.png
https://i-blog.csdnimg.cn/direct/933bcaa5a3594389ac6b099f36bb610b.png
https://i-blog.csdnimg.cn/direct/f8fb61a265e74a31be5aac27710b1805.png
https://i-blog.csdnimg.cn/direct/a4e347bcd91848ab895acef15f3941d9.png
https://i-blog.csdnimg.cn/direct/916fb6f59c4a4482bbed777bc046a47e.png
https://i-blog.csdnimg.cn/direct/bf9313d47a4c4d129b91df97c5fc17fa.png
反序列化-readObject()
https://i-blog.csdnimg.cn/direct/8b44439e446b482a85ac50a61f22f605.png
https://i-blog.csdnimg.cn/direct/db03872967ff42abbbee01d7b82d0653.png
利用看下面
1、看序列化的对象有没有重写readObject方法(方法里是否包罗危险代码)
https://i-blog.csdnimg.cn/direct/306c20da74454d29ba7b67f0da166d67.png
https://i-blog.csdnimg.cn/direct/06ccae12a15a48c991eb06f3ad80f5e4.png
https://i-blog.csdnimg.cn/direct/3dc1a0191f6244a197f0a2ab4e1f2cde.png
https://i-blog.csdnimg.cn/direct/2061e78dba2345be8f6cf42bb488d76b.png
https://i-blog.csdnimg.cn/direct/d2ee6af35f48447aa75b11c41aa8c3b7.png
https://i-blog.csdnimg.cn/direct/4b0198671e5246d7958eb6ca82522d1c.png
2、看序列化的对象有没有被输出就会调用toString方法(方法里是否包罗危险代码)
https://i-blog.csdnimg.cn/direct/5db438db42b34caf9424ca5f9bfb7bd7.png
https://i-blog.csdnimg.cn/direct/64cafb0f45404ff4acb4f36a0e8913c0.png
https://i-blog.csdnimg.cn/direct/266a4484ffda42e4b1a101a09dbb6a59.png
https://i-blog.csdnimg.cn/direct/e7005f46d4c34de7aab3b749893bdd7e.png
https://i-blog.csdnimg.cn/direct/1c639a89c31e4ebea52b67c1a62c94f8.png
https://i-blog.csdnimg.cn/direct/83e72382c160473b8a8a0d3c01de9d51.png
https://i-blog.csdnimg.cn/direct/15bbc0328b0543d6884302a4ac6a6f10.png
3、其他类的readObject或toString方法(反序列化类对象可控)
https://i-blog.csdnimg.cn/direct/8218f43e5f2a4e2f8327554a556dae18.png
https://i-blog.csdnimg.cn/direct/f7b8b99f122f40db8dab0d1c7966fac3.png
https://i-blog.csdnimg.cn/direct/61f7abbeba1749ccbd1f04c3c839ff06.png
https://i-blog.csdnimg.cn/direct/b2f9735d91fe40fea7dea995deb9fbaa.png
https://i-blog.csdnimg.cn/direct/6c6f930cb3904c29841a431b2193d845.png
https://i-blog.csdnimg.cn/direct/9c063cea3429412da7897218b42269f7.png
5、反序列化利用链
(1) 入口类的readObject直接调用危险方法
(2) 入口参数中包含可控类,该类有危险方法,readObject时调用
(3) 入口类参数包含可控类,该类又调用其他有危险方法类,readObject调用
(4) 构造函数/静态代码块等类加载时隐式执行
6、反序列化利用条件
1、可控的输入变量进行了反序列化操作
你输入的数据被网站吸收并进行了反序列化操作
2、实现了Serializable大概Externalizable接口的类的对象
https://i-blog.csdnimg.cn/direct/b9d077d8e1d648808d7793e5292c009c.png
3、能找到调用方法的危险代码或间接的利用链引发(依赖链)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]