zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java反序列化漏洞分析

JAVA漏洞 分析 序列化
2023-09-27 14:29:30 时间

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】
【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

一、java 反序列化漏洞介绍

我们需要保存某一个对象的某一一个时间的状态信息,进行一些操作,比如利用反序列化将程序运行的对象状态以二进制形式储存在文件系统中,然后可以在另外一个程序中对序列化后的对象状态数据进行反序列化操作回复对象,可以有效的实现多平台之间的通信,对象持久化储存。
使用反序列化本身并不会产生问题。
当用户(攻击者)可以控制被反序列化的数据时就出现问题了,例如,如果数据可以通过网络连接传送到反序列化例程中。如果攻击者控制的数据被反序列化,那么它们对内存中的变量和程序对象就会有一些影响。
之后,如果攻击者可以影响内存中的变量和程序对象,那么它们可以影响使用这些变量和对象的代码流。

要搞清楚这个漏洞就需要搞清楚什么是序列化和反序列化

1. 什么是序列化和反序列化

1. 序列化 (Serialization):

将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

2. 反序列化:

从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。

2. JAVA序列化实现函数:

1. 序列化:

ObjectOutputStream–writeObject() 将序列字节写到对象中
JAVA约定是给文件.ser拓展名

2. 反序列化:

ObjectInputStream–readOject() 从输入流中读取字节序列,再将其反序列化,然后返回

3. JAVA序列化数据流特征:

加密便于传输,不加密不容易阅读传输,数据流以为rO0AB开端,就是JAVA序列化的base64
加密aced开端,JAVA序列化的16进制涉及到以下函数,则考虑JAVA反序列化: ObjectInputStream.readobject
ObjectInputStream.readUnshared XMLDecoder.readObject XStream.fromXML
ObjectMapper.readValue JSON.parseObject …

二、漏洞检测利用

1. 黑盒检测

数据格式点: HTTP中请求的参数 自定义协议 RMI协议:RMI使用Java语言 接口
定义了远程对象,它集合了Java序列化和Java远程方法协议
,简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。

2. 白盒检测

函数点: 涉及到下列函数可能设计JAVA反序列化 ObjectInputStream.readobject
ObjectInputStream.readUnshared XMLDecoder.readObject XStream.fromXML
ObjectMapper.readValue JSON.parseObject …

3. 利用

推荐一款工具ysoserial
ysoserial是一款在Github开源的知名java反序列化利用工具,里面集合了各种java反序列化payload;
由于其中部分payload使用到的低版本JDK中的类,所以建议自己私下分析学习时使用低版本JDK JDK版本建议在1.7u21以下。