
智能摘要 AI
文章主要介绍了简化版的CC1链的分析过程。作者指出网上教程中的demo代码通常较为复杂且缺乏深度理解,不建议直接阅读ysoserial的源码。文中通过简化后的六行代码展示了如何利用Java反序列化漏洞执行系统命令(如启动计算器)。具体步骤包括使用`ConstantTransformer`获取`Runtime`对象,`InvokerTransformer`调用其`exec`方法执行命令,以及`ChainedTransformer`和`TransformedMap`的协同作用完成整个过程。最后强调可以通过调试进一步深入理解这一机制。
网上教程中的demo代码多半比较复杂,干扰要素较多,而且基本都来自于最初几个教程,很多写文章的人只是照着前人教程复现- -遍,其实不一定对此有深刻的理解。另外我也不建议直接读ysoserial的源码,因为ysoserial的源 码中对代码进行了很多优化,导致理解起来可能比较难一点.
0x01 前言
在p牛安全漫谈的第九篇中,p牛贴出了简化版的CC1链。为什么要有简化版呢?
0x02 简化版CC1链分析
是不是看起来非常的简单,短短六行代码即可。
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.getRuntime()),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})};
Transformer transformer = new ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map outerMap = TransformedMap.decorate(innerMap,null,transformer);
outerMap.put("test","xxxxx");首先来分析ConstantTransformer,在进行初始化之后,就无其它操作了
new ConstantTransformer(Runtime.getRuntime())
InvokerTransformer初始化如下,1传递方法名,2传递参数类型,3传递参数的值

ChainedTransformer的实现如下:

也就说首先new之后transformer变量存储的内容如下

TransformedMap.decorate如下,这里可以看出直接能调用到有参构造。换种意思来说就是将transformer变量内容存入到了valueTransformer中.

那么最后一个outerMap.put(“test”,”xxxxx”);就是最重要的一点了。 跟进put发现了transformValue方法

transformValue会调用:valueTransformer.transform(object)

而valueTransformer此时为ChainedTransformer,所以会调用到ChainedTransformer.transform()方法


在第一次循环执行之后,返回的Object是Runtime

然后将object当做参数带入,再次执行transform(),一个经典的命令执行

0x04 结尾
本文只是简单剖析,更详细的话,可以跟着断点进行一步步调试



评论 (0)