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?

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

被折叠的 条评论
为什么被折叠?



