早在cc6的学习中,为了重新寻找另一条调用链来调用LazyMap.get方法,我们找到了org.apache.commons.collections.keyvalue.TiedMapEntry类,它的getValue方法可以调用map.get方法。
为了调用getValue方法,我们在cc6中找到了hashCode方法。除此之外,我还发现存在toString方法可以调用getValue方法,能否走这条路来调用LazyMap.get方法?
JDK 8u192
commons-collections-3.1
在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方法
默认情况下System.getSecurityManager()为null
只需要控制valObj为TiedMapEntry对象即可利用这条调用链
valObj通过ObjectInputStream.readFields().get()获取
只需要将val类变量赋值为TiedMapEntry对象即可