Java反序列化漏洞详解

发表于:2021-7-22 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:黄元正    来源:CSDN

  在最近几年间,不断的有java反序列化漏洞被曝光。最近的几次分别产生于spring框架以及Groovy还有文件上传的java库中,这些漏洞均得到了修复。
  但在最近的研究中,安全人员发现java反序列漏洞远远不止上述几处,该漏洞广泛的存在于java库中。
  Java反序列化漏洞:
  1.漏洞产生原因
  在java编写的web应用与web服务器间java通常会发送大量的序列化对象例如以下场景:
  · HTTP请求中的参数,cookies以及Parameters。
  · RMI协议,被广泛使用的RMI协议完全基于序列化
  · JMX同样用于处理序列化对象
  · 自定义协议用来接收与发送原始的java对象
  在序列化过程中会使用ObjectOutputStream类的writeObject方法,在接收数据后一般又会采用ObjectInputStream类的readObject方法进行反序列化读取数据。
  java类ObjectInputStream在执行反序列化时并不会对自身的输入进行检查,意味着一种可能性,即恶意攻击者构建特定的输入,在ObjectInputStream类反序列化之后会产生非正常结果。而根据最新的研究,利用这一方法可以实现远程执行任意代码。
  修改为自定义了一个被序列化的对象myobject,通过定义myobject实现了java序列化的接口并且定义了一种名为“readObject”的方法。通过对比上面例子的输出,可以发现反序列化的相关数值被修改了,即执行的用户自身的代码。造成结果不同的关键在于readObject方法,java在读取序列化对象的时候会先查找用户自定义的readObject是否存在,如果存在则执行用户自定义的方法。
  2.漏洞触发点寻找:
  在之前的论述中可以发现利用该漏洞首先应找出readObject方法调用,在找到之后进行下一步的注入操作。一般可以通过以下方法进行查找:
  (1)针对特定的java应用,对此漏洞的应用应首先寻找可以利用的“靶点”,即确定调用反序列化函数的地点。这可以通过对java应用进行源码审计,例如找寻反序列化函数readObject调用情况。
  (2)对于该应用的网络行为进行抓包,寻找序列化数据(在包数据中,序列化数据一般会以aced0005开头)来进行判断。
  3.漏洞利用
  在发现序列化数据之后,需要产生一个用于测试的pyload。这里可以在github上下载一个工具“ysoserial”并执行下列指令:
  当/tmp/pwned文件被创建时说明测试已经开始,而后续的步骤将结合实例一起分析。
  漏洞利用实例:
  这里以Jboss为例,Jboss利用的是HTTP协议,可以在任何端口上运行,默认安装在8080端口中。而且Jboss与“JMXInvokerServlet”的通信过程中存在一个公开漏洞。JMX是一个java的管理协议,在Jboss中的JMXInvokerServlet可以使用HTTP协议与其进行通话。这一通信功能依赖于java的序列化类。
  在默认安装的Jboss中,JMXInvokerServlet的路径恰好为http://localhost:8080/invoker/JMXInvokerServlet。如果用户访问一个web浏览器,实际上会返回一个原始的java对象,这中行为显然存在一个漏洞。
  这个漏洞可以很经常的通过互联网被利用,由于jmxinvokerservlet与主要的Web应用程序在同一个端口上运行,因此它很少被防火墙所拦截。
  基于以上原理可以通过以下指令收集jar文件来测试该漏洞是否可用:
  由此可以以jmx作为Jboss接受外部输入的点,可以利用javaHTTPclient包构建POST请求,post请求包中数据为使用ysoserial处理之后的构建代码。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号