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