CC的回顾|Java常用链复盘(一)

CC的回顾|Java常用链复盘(一)

CC的链子在我的博客已经不知道发了多少篇了, 但是这并不影响我在一段时间不用之后对它们的混淆.......
(以下为纯归纳, 并没有什么新的东西
感觉Java常见的链子几乎都用的比较熟了, 但是每次面试问起来都会呆住, 所以最近有空且不知道要学什么的时候就复盘一下常用的链子, 于是Java常用链子复盘就来了。7条CC可以说是我会用不会说的代表了, 几乎都是记得有哪些利用方式和大条件, 但是各种条件和触发方式分别属于那哪条CC链我是真不大对得上, 所以这里就直接摆烂了, 这次的CC复盘也主要以关键节点的触发方式为主(不同链子间的区别直接看7条CC流程总览图片即可)。链子主要从yso项目参考,除yso之外还有两个CC1(摆脱LazyMap依赖的AnnotationInvocationHandler.readObject和Lazymap的另一个触发方式TiedMapEntry.hashCode)。

缺点: 并没有太多对限制和依赖条件的描述, 这个有需要再补充(一般这么说就大抵是要鸽了)

Transformer

CC的调用几乎都是通过各种触发方式调用Transformer.transform, 然后使用不同的Transformer就行组合利用。

在能够触发Transformer.transform的条件下就可以通过ChainedTransformer,ConstantTransformer,InvokerTransformer 这几个Class相互配合完成任意函数执行的RCE

上面几个Transformer实现类的transform函数作用分别如下:

  • ChainedTransformer递归调用一个Transformer队列的transform函数
  • ConstantTransformer返回一个指定的对象(一般在ChainedTransformer中返回函数执行的参数)
  • InvokerTransformer调用一个指定的Method并将执行结果返回(任意函数执行)
  • InstantiateTransformer获取指定类的构造器获取类的实例化对象(任意类实例化)

Templateslpml.newTransformer用于实现动态加载, 这是CC3和CC4与其他链子最大的不同点(个人看法), 调用了InstantiateTransformer.transform, 通过InstantiateTransformer的transformhi先从当前对象的iParamTypes属性获取对应的构造器, 然后使用属性iArgs作为参数执行构造器的newInstance获取实例化对象

7条CC流程总览

大半年之前做的流程图了, 再挂一下哈哈

CC集合

组合汇总

CC 调用链(transform和LazyMap.get表示的是各自的以下第几种触发方式) 依赖条件
CC1 transform(1.2) + ChainedTransformer + InvokerTransformer + Runtime.exec commons-collections:3.1
CC2 transform(4) + InvokerTransformer + Runtime.exec commons-collections4:4.0
CC3 transform(1.2) + ChainedTransformer+ InstantiateTransformer + TempTmpl动态加载 commons-collections:3.1
前半段和CC1一样
CC4 transform(4) + TransformingComparator + InvokerTransformer + TempTmpl动态加载 commons-collections4:4.0
前半段和CC2一样
CC5 LazyMap.get(5) + LazyMap + ChainedTransformer + InstantiateTransformer + Runtime.exec commons-collections:3.1
"This only works in JDK 8u76 and WITHOUT a security manager"
CC6 LazyMap.get(4) + LazyMap + ChainedTransformer + InvokerTransformer + Runtime.exec commons-collections:3.1
CC7 LazyMap.get(3) + LazyMap + InvokerTransformer + DelegatingMethodAccessorImpl.invoke + NativeMethodAccessorImpl.invoke + NativeMethodAccessorImpl.invoke0 + Runtime.exec commons-collections:3.1
使用HashTable触发LazyMap
_CC1 LazyMap.get(6) + LazyMap + Transformer...
_CC1 transform(1.1) + Transformer...

transform 触发

  1. AnnotationInvocationHandler

    可能有些小伙伴刚学习CC链的时候会对AnnotationInvocationHandler很懵, 总是记不对它的利用方法, 那就可能是想我一样没注意到它两种利用方法:

    触发方式一:(注释类反序列化触发)
    AnnotationInvocationHandler.readObject
    AbstractInputCheckedMapDecorator.MapEntry.setValue
        TransformedMap.checkSetValue
            Transformer.transform

    后面readobject源码被修改了, 删掉了执行AbstractInputCheckedMapDecorator.MapEntry.setValue函数的语句, 所以在高版本JDK下就不可用了

    触发方式二:(handler代理的invoke触发)
    AnnotationInvocationHandler.readObject
    Map(Proxy).entrySet
        AnnotationInvocationHandler.invoke
            LazyMap.get
                Transformer.transform
  2. LazyMap

    LazyMap.get
    Transformer.transform
  3. HashMap

    HashMap.readObject
    HashMap.key.hashCode
        TiedMapEntry.hashCode
            TiedMapEntry.map.get
                LazyMap.get
                    Transformer.transform
  4. PriorityQueue | TransformingComparator

    PriorityQueue.readObject
    PriorityQueue.heapify
        PriorityQueue.siftDown
            PriorityQueue.siftDownUsingComparator
                TransformingComparator.compare
                    TransformedMap.transformKey | TransformedMap.transformValue //两个函数均可
                        Transformer.transform

    TransformingComparator除了compare之外put|putAll也可以触发TransformedMap.transformKey | TransformedMap.transformValue

LazyMap.get 触发方式

  1. AnnotationInvocationHandler (transform1.2)

    AnnotationInvocationHandler.readObject
    AbstractInputCheckedMapDecorator.MapEntry.setValue
        TransformedMap.checkSetValue
            Transformer.transform
  2. TiedMapEntry (toString,hashCode,getValue)

    TiedMapEntry.toString
    TiedMapEntry.getValue
        LazyMap.get

    下面的AbstractMap.equalsHashMap|HashSet,BadAttributeValueExpException这三条都是建立在TiedMapEntry.getValue的基础之上的

    TransformedMap.transformMap也可以触发TiedMapEntry.getValue

  3. AbstractMap.equals

    Hashtable.readObject
    Hashtable.reconstitutionPut
        AbstractMapDecorator.equals
            AbstractMap.equals
                Map.Entry.getValue
                    TiedMapEntry.getValue
                        LazyMap.get
  4. HashMap(put,hash) , HashSet

    HashMap.put

    HashSet.readObject
    HashMap.put //看到调用Map的put函数可能就会想到TransformMap的put函数,但是这里这个Map是不能被自定义的
         HashMap.hash
            TiedMapEntry.hashCode
                TiedMapEntry.getValue
                    LazyMap.get
  5. BadAttributeValueExpException (CC5专属)

    BadAttributeValueExpException.readObject
    TiedMapEntry.toString
            TiedMapEntry.getValue
                LazyMap.get
  6. HashMap (不需依赖HashSet)

    HashMap.key.hashCode

    HashMap.readObject
    HashMap.key.hashCode
        TiedMapEntry.hashCode
         LazyMap.get

Templateslpml.newTransformer 动态类加载

yso中的CC3和CC4都是使用InstantiateTransformer.transform调用Templateslpml.newTransformer => TemplatesIpml.getTransletLnstance获取实例化对象, 加载字节码完成动态类实例化, 从而执行动态类的static静态代码完成任意代码执行

TemplatesIpml.getTransletLnstance这个函数符合Bean结构的getter方法所以才会在之后的fastjson中被多次使用

InstantiateTransformer.transform可以获取任意类型的构造器然后执行newInstance实例化对象, 所以下面的第一步构造函数TrAXFilter.TrAXFilter可以通过InstantiateTransformer.transform触发

TrAXFilter.TrAXFilter
    Templateslpml.newTransformer
        TemplatesIpml.getTransletLnstance
            TranslatClassLoader.defineTransletClasses
                TranslatClassLoader.defineClass
        _class.newInstance实例化动态加载类

前期的调用和触发没什么特别的, 自行从触发transform函数的方法LazyMap.get 的触发方式这两部分选取满足要求的组合调用InstantiateTransformer.transform就行, 下面是yso项目中的payload反序列化函数调用过程

image-20221101205451426

image-20221101210620692

image-20221101210658382

2022_11_01 第十一周星期二 23:00

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇