
文章插图
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浅学
