前言前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl
以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋 , 解决一些细节问题 。
CC1由于CC1要介绍CC链的几个关键类,所以写了三篇
InvokerTransformer
,其transform
可以执行任意方法,ConstantTransformer
作用是拿到一个危险类,如RunTime
等等,ChainedTransformer
作用是将几个Transformer串联起来
TransformedMap
:用来修饰Map , 被修饰过的Map在添加新的元素时,将可以执??个回调,也就是说可以调用其他的tramsform
AnnotationInvocationHandler
:第四点说了,触发漏洞的核心是向Map加入新的元素,在实际反序列化利用的时候,我们需要找到一个类,它在反序列化的readObject
逻辑里有类似的写入操作 。这个类刚好符合条件 。
LazyMap
:作用和TransformedMap
类似,都是为了执行transform
,区别就是TransformedMap是在写入元素的时候执行会transform
,而LazyMap是在其get
方法中执行的factory.transform
- 动态代理:使用了一个动态代理的方法来调用``LazyMap#get
,原因是当我们调用某个动态代理对象的方法时 , 都会触发代理类的
invoke`方法,并传递对应的内容
只需要找到某个地方调用了
LazyMap#get
方法 , 并且传递了任意值 。首先在readObject时,会触发
AnnotationInvocationHandler#readObject
方法,其中调用了this.memberValues.entrySet
文章插图
而
this.memberValues
是构造好的proxyMap
, 由于这是一个代理对象 , 所以调用其方法时,会去调用其创建代理时设置的handler
的invoke
方法文章插图
proxyMap设置的handler为下面这个
handler
,同样是InvocationHandler
这个类,接着会调用他的invoke方法文章插图
InvocationHandler#invoke
的78行代码中调用了this.memberValues#get
,此时的this.memberValues
为之前设置好的lazymap,所以这里调用的是lazymap#get
,从而触发后边的rce链 。文章插图
代理后的对象叫做
proxyMap
,但我们不能直接对其进行序列化,因为我们入口点是 sun.reflect.annotation.AnnotationInvocationHandler#readObject
,所以我们还需要再用 AnnotationInvocationHandler
对这个proxyMap
进行包裹:文章插图
这里还是比较绕的,因为设置了两个handler,但是第一个handler是为了触发
lazymap#get
,而第二个handler实际上只是为了触发代理类所设置handler的invoke方法接着解释一些细节的问题:
- 为什么这用反射的方式来创建AnnotationInvocationHandler的实例?
因为AnnotationInvocationHandler并不是public类,所以无法直接通过new的方式来创建其实例 。
文章插图
因为在创建实例的时候对传入的第一个参数调用了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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Django更换数据库和迁移数据方案
- Java安全之CC3
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
- C#实践炸飞机socket通信
- Java安全之CC6
- Vue3实现动态导入Excel表格数据
- Go实现栈与队列基本操作
- CC3
- 2 java安全之CC1浅学
- 1 java安全之CC1浅学