,在其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
?的字节码
小结知识点比较多,每一个都捋清楚后,就可以重分发散思维,各种组合利用
【CC1,3,6回顾】
推荐阅读
- Django更换数据库和迁移数据方案
- Java安全之CC3
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
- C#实践炸飞机socket通信
- Java安全之CC6
- Vue3实现动态导入Excel表格数据
- Go实现栈与队列基本操作
- CC3
- 2 java安全之CC1浅学
- 1 java安全之CC1浅学