[Java反序列化]jdk原生链分析

本文详细分析了JDK7u21中与Java反序列化相关的TemplatesImpl链,探讨了如何触发equalsImpl方法,控制memberMethods以实现任意方法调用。通过HashMap在反序列化过程中的put操作,利用hashCode方法的特性构建了特定的链。文章还讨论了为何选择特定的方法和类,并分析了官方的修复措施以及漏洞的影响范围。
摘要由CSDN通过智能技术生成

JDK7u21

在很多链中,TemplatesImpl一直发挥着不可或缺的作用,它是位于jdk源码中的一段Gadget: getOutputProperties()->newTransformer()->getTransletInstance()->...

templatesImpl利用回顾:

com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet

其中只要能触发上述任意一个函数的,都可以完成TemplatesImpl的动态加载字节码功能。1.所以我们看jdk中是否有调用这三个函数?

还记得 sun.reflect.annotation.AnnotationInvocationHandler 嘛?这可是java反序列化中的重要角色。而jdk7u21算是对其利用的再挖掘。

为了简单直接,我把反编译的代码中的var变量替换了自定义变量

//AnnotationInvocationHandler.java
private Boolean equalsImpl(Object var1) {
    if (var1 == this) {
        return true;
    } else if (!this.type.isInstance(var1)) {
        return false;
    } else {
        Method[] methods = this.getMemberMethods();//获取this.type的所有方法
        int methods_num = methods.length;

        for(int var4 = 0; var4 < methods_num; ++var4) {
            Method var5 = methods[var4];
            String var6 = var5.getName();
            Object var7 = this.memberValues.get(var6);
            Object var8 = null;
            AnnotationInvocationHandler var9 = this.asOneOfUs(var1);//判断var1是否是代理类
            if (var9 != null) {
                var8 = var9.memberValues.get(var6);
            } else {
                try {
                    var8 = var5.invoke(var1);	//调用任意方法
                } catch (InvocationTargetException var11) {
                    return false;
                } catch (IllegalAccessException var12) {
                    throw new AssertionError(var12);
                }
            }

            if (!memberValueEquals(var7, var8)) {
                return false;
            }
        }

        return true;
    }
}

private Method[] getMemberMethods() {
    if (this.memberMethods == null) {
        this.memberMethods = (Method[])AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
            public Method[] run() {
                Method[] var1 = AnnotationInvocationHandler.this.type.getDeclaredMethods();
                AccessibleObject.setAccessible(var1, true);
                return var1;
            }
        });
    }

    return this.memberMethods;
}

到这里,可以看到this.memberMethods可控,到现在也就是说如果能让AnnotationInvocationHandler调用equalImpl方法,且控制其中的memberMethods,就可以完成任意方法的调用了。

2.怎么触发equalsImpl?

public Object invoke(Object var1, M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值