CC1,3,6回顾( 二 )


CC1,3,6回顾

文章插图
2.为什么创建handler时传入的第一个参数是Retention.class?
因为在创建实例的时候对传入的第一个参数调用了isAnnotation方法来判断其是否为注解类:
public boolean isAnnotation() {return (getModifiers() & ANNOTATION) != 0;}而Retention.class正是java自带的一个注解类,所以这里可以直接用上,当然要是换成其他注解类也是ok的 。
CC6CommonsCollections1利用链,两种方法,LazyMap以及TransformedMap,但是在Java 8u71以后,这个利?链不能再利?了,主要原因是 sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑变化了
所以关注点如何调?LazyMap#get()
找到的类是org.apache.commons.collections.keyvalue.TiedMapEntry ,在其getValue?法中调?了 this.map.get,?其hashCode?法调?了getValue?法
又在 java.util.HashMap#readObject中就可以找到 HashMap#hash()的调?
/* Gadget chain:java.io.ObjectInputStream.readObject()java.util.HashMap#readObjectjava.util.HashMap#hash()org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode()org.apache.commons.collections.keyvalue.TiedMapEntry.getValue()org.apache.commons.collections.map.LazyMap.get()org.apache.commons.collections.functors.ChainedTransformer.transform()org.apache.commons.collections.functors.InvokerTransformer.transform()java.lang.reflect.Method.invoke()java.lang.Runtime.exec()*/而ysoserial中使用HashSet.readObject()来调用
java.util.HashSet.readObject()java.util.HashMap.put()java.util.HashMap.hash()逻辑也很清晰
这条链是Java7和8高版本通杀
CC3首先利?TemplatesImpl链是可以通过TemplatesImpl#newTransformer()执行代码的 。
在一个为了绕过?些规则对InvokerTransformer的限制 。所以CC3并没有使?到InvokerTransformer来调?任意?法,?是?到了另?个 类, com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter
这个类的构造?法中调?(TransformerImpl) templates.newTransformer(),免去了我们使?InvokerTransformer??调?newTransformer()?法这?步
?到?个新的Transformer,就是 org.apache.commons.collections.functors.InstantiateTransformerInstantiateTransformer也是?个实现了Transformer接?的类,他的作?就是调?构造?法.
利?InstantiateTransformer来调?到TrAXFilter的构造?法,再利?其构造?法?的templates.newTransformer()调?到TemplatesImpl?的字节码
小结知识点比较多,每一个都捋清楚后,就可以重分发散思维,各种组合利用

经验总结扩展阅读