前言
CommonCollections系列的gadgets我们在反序列化利用中用的很多,下面剖析一下ysoserial中CommonCollections5的调用链和原理。
实验环境:jdk1.8.0_211、commons-collections:commons-collections:3.1
代码分析
关键调用链
1 | Gadget chain: |
观察这条调用链我们发现从LazyMap.get之后的调用链我们非常熟悉和cc1后半段一模一样,不一样的是该调用链的触发点变为了BadAttributeValueExpException.readObject
我们先看TiedMapEntry.toString()
1 | public String toString() { |
getKey和getValue如下所示
我们看到如果this.map设置为Lazymap就可以调用到LazyMap.get()将调用链串联起来。所以这里使用TiedMapEntry.toString()没什么问题。接下来生成调用链的关键在于如何能调用到TiedMapEntry.toString。很显然作者选用了BadAttributeValueExpException。
接下来跟入BadAttributeValueExpException的readObject
1 | private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { |
valobj为从val属性中取出来的值,如果我们把val设置为TiedMapEntry即可。
后记
没有什么坑点,自问自答取消。。。