首页 > 其他分享 >构造链

构造链

时间:2022-12-05 21:35:35浏览次数:52  
标签:TemplatesImpl 漫谈 java readObject transform 构造 PriorityQueue

概述

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

标签:TemplatesImpl,漫谈,java,readObject,transform,构造,PriorityQueue
From: https://www.cnblogs.com/W3-w/p/16953595.html

相关文章

  • 300004 房屋建筑构造的概述
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='房屋建筑构造的......
  • 7.C++拷贝构造函数
    拷贝构造函数我们经常会用一个变量去初始化一个同类型的变量,那么对于自定义的类型也应该有类似的操作,那么创建对象时如何使用一个已经存在的对象去创建另一个与之相同的对......
  • 6.C++构造函数
    类的6个默认成员函数如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函数了吗?并不是的,在我们定义类时即使我们没有写任何成员函数,编译器......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(args);......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(ar......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(ar......
  • 【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
    在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,Aa=newA();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A......
  • 构造题-题单-思路
    题单图形构造牛客练习赛106-D传送门思路条件n为奇数,01数量相差为1,无回路,1和1连通,0和0连通。首先该图可能满足0和1在图中所构成的图形相同,我们可以构造一个螺......
  • C#中子类调用父类的构造方法
    本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下:publicclassPerson{publicPerson(){Console.WriteLine("我是人......
  • 2022.11.29 vjudge构造、思路题
    WeightingaTree构造切入点:调整总结:图上的题,可以先考虑树上的做法。(尤其是构造题)首先我们要知道这种“点与跟他连着的所有边的关系”什么的题的套路就是找生成树。-......