构造链

概述

Commons Collections 3.2.2的改动

image-20221124214308526

Commons Collections4 4.1的改动

4.1⾥,这⼏个危险Transformer类不再实现 Serializable 接⼝,也就是说,他们⼏个彻底⽆法序列化和反序列化了

CommonCollections1链

适用环境

commons-collections3.1-3.2.1
jdk1.7.1以下

TransformedMap_readObject触发

大体思路

  1. AnnotationInvocationHandler#readObject()
  2. TransformedMap#put()
  3. transformerChain#transform()
  4. ConstantTransformer#transform() InvokerTransformer#transform()

细节问题在p神的《java安全漫谈》-10会详细解释

LazyMap_invoke触发

大体思路

AnnotationInvocationHandler实现了InvocationHandler接口,这在动态代理中相当于是重写了invoke()函数去解决下面问题

当通过代理类的对象调用方法a时,如何动态的去调用被代理类中的同名方法a?

  1. AnnotationInvocationHandler#readObject()

    readObject()使用代理类执行任何方法时会跳转到第2步

  2. AnnotationInvocationHandler#invoke()

  3. LazyMap#get()

  4. transformerChain#transform()

  5. ConstantTransformer#transform() InvokerTransformer#transform()

invoke是动态代理定位方法的函数。当通过代理类对象调用方法时,会自动的调用invoke函数进而调用被代理类中同名的方法

高版本jdk如何触发链

跳转到cc6链

CC2链

适用环境

commons-collections4 4.0

TestPriorityQueueTransformingComparator

大体思路

  1. java.util.PriorityQueue#readObject()

  2. PriorityQueue#heapify()

  3. PriorityQueue#siftDown()

  4. PriorityQueue#siftDownUsingComparator()

    这个函数里调用了comparator.compare()

  5. org.apache.commons.collections4.comparators.TransformingComparator#compare()

    image-20221124202234013

  6. transformerChain#transform()

  7. ConstantTransformer#transform() InvokerTransformer#transform()

CC3链

适用环境

commons-collections3.1-3.2.1
jdk1.7.1以下
  • 关于字节码需要注意:

    这个字节码对应的类是 com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet 的子类

TemplatesImpl与InvokerTransformer

大体思路

cc1链基础上借助TemplatesImpl::newTransformer()ConstantTransformer构造⼀个执⾏任意字节码的链

  1. AnnotationInvocationHandler#readObject()

  2. TransformedMap#put()

    其实这一步也可以使用LazyMap#get()那条链

  3. transformerChain#transform()

  4. ConstantTransformer#transform() InvokerTransformer#transform()

    这一步是获得TemplatesImpl对象,并调用TemplatesImpl.newTransformer()函数

  • 参考链接:
    • p神的《java安全漫谈》-14

TrAXFilter与InstantiateTransformer

大体思路

cc1链基础上借助TrAXFilter和InstantiateTransformer调用TemplatesImpl::newTransformer()构造⼀个执⾏任意字节码的链

  1. AnnotationInvocationHandler#readObject()

  2. TransformedMap#put()

    其实这一步也可以使用LazyMap#get()那条链

  3. transformerChain#transform()

  4. ConstantTransformer#transform() InstantiateTransformer#transform()

    这一步是获得TrAXFilter对象,并调用TrAXFilter的构造函数,进而执行了(TransformerImpl) templates.newTransformer()

高版本jdk如何触发链

  • 参考cc1链如何改进成cc6链

CC4链

适用环境

commons-collections4 4.0

其实commons-collections依赖的其它链还可以继续用,只需把报错修改一下

CC6链

大体思路

  1. java.util.HashMap#readObject()

  2. HashMap#hash(key)

    key是Map对象

    image-20221123210450456

  3. TiedMapEntry#hashCode()

  4. TiedMapEntry#getValue()

    这一步执行了image-20221123210209402

  5. LazyMap#get(key)

  6. transformerChain#transform()

  7. ConstantTransformer#transform() InvokerTransformer#transform()

参考链接

  • p神的《java安全漫谈》-12

CommonsBeanutils1链

适用环境

CommonsBeanutils 1.9.3

TestPriorityQueueBeanComparator

大体思路

  1. java.util.PriorityQueue#readObject()

  2. PriorityQueue#heapify()

  3. PriorityQueue#siftDown()

  4. PriorityQueue#siftDownUsingComparator()

    这个函数里调用了comparator.compare()

  5. BeanComparator#compare()

    PropertyUtils.getProperty( o1, property ) 这段代码,当o1是一个 TemplatesImpl 对象,而 property 的值为 outputProperties 时,将会自动调用getter,也就是TemplatesImpl#getOutputProperties() 方法

    image-20221124220311480

  6. TemplatesImpl#getOutputProperties()

    image-20221124220447182

参考链接

  • p神的《java安全漫谈》-17

Shiro利用链

TestTiedMapInvokerTransformer

大体思路

可以结合代码中的注释看

  1. java.util.HashMap#readObject()
  2. HashMap#hash(key)
  3. TiedMapEntry#hashCode()
  4. TiedMapEntry#getValue()
  5. LazyMap#get()
  6. InvokerTransformer#transform()

参考链接

  • p神的《java安全漫谈》-15

无依赖的Shiro反序列化利用链

参考链接

  • p神的《java安全漫谈》-17
posted @ 2022-12-05 21:21  W3w  阅读(79)  评论(0)    收藏  举报