
文章插图
2.为什么创建handler时传入的第一个参数是Retention.class?
因为在创建实例的时候对传入的第一个参数调用了isAnnotation方法来判断其是否为注解类:
public boolean isAnnotation() {return (getModifiers() & ANNOTATION) != 0;}
而Retention.class正是java自带的一个注解类,所以这里可以直接用上,当然要是换成其他注解类也是ok的 。CC6
CommonsCollections1
利用链,两种方法,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.InstantiateTransformer
。InstantiateTransformer
也是?个实现了Transformer
接?的类,他的作?就是调?构造?法.利?
InstantiateTransformer
来调?到TrAXFilter
的构造?法,再利?其构造?法?的templates.newTransformer()
调?到TemplatesImpl
?的字节码小结知识点比较多,每一个都捋清楚后,就可以重分发散思维,各种组合利用
经验总结扩展阅读
- Django更换数据库和迁移数据方案
- Java安全之CC3
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
- C#实践炸飞机socket通信
- Java安全之CC6
- Vue3实现动态导入Excel表格数据
- Go实现栈与队列基本操作
- CC3
- 2 java安全之CC1浅学
- 1 java安全之CC1浅学