前言

早在cc6的学习中,为了重新寻找另一条调用链来调用LazyMap.get方法,我们找到了org.apache.commons.collections.keyvalue.TiedMapEntry类,它的getValue方法可以调用map.get方法。

Untitled

为了调用getValue方法,我们在cc6中找到了hashCode方法。除此之外,我还发现存在toString方法可以调用getValue方法,能否走这条路来调用LazyMap.get方法?

Untitled

环境

JDK 8u192

commons-collections-3.1

BadAttributeValueExpException类

在ysoserial中,我看见了一个陌生的类,javax.management.BadAttributeValueExpException。ysoserial把javax.management.BadAttributeValueExpException类作为反序列的起点

问题:但javax.management.BadAttributeValueExpException类并没有实现Serializable接口,为什么可以被序列化呢?

是因为javax.management.BadAttributeValueExpException类继承了Exception类,Exception类又继承了Throwable类,Throwable类实现了Serializable接口

在javax.management.BadAttributeValueExpException.readObject方法中,调用了toString方法

Untitled

默认情况下System.getSecurityManager()为null

Untitled

只需要控制valObj为TiedMapEntry对象即可利用这条调用链

valObj通过ObjectInputStream.readFields().get()获取

Untitled

只需要将val类变量赋值为TiedMapEntry对象即可