我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:2019全年资料大全正版 > 反序列化 >

Weblogic反序列化远程代码执行漏洞(CVE-2019-2725)分析报告

归档日期:05-26       文本归类:反序列化      文章编辑:爱尚语录

  4月17日,国家信息安全漏洞共享平台(CNVD)公开了Weblogic反序列化远程代码执行漏洞(CNVD-C-2019-48814)。由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。目前,POC已在野外公开(见参考链接)。官方紧急补丁(CVE-2019-2725)已于4月26日发布,请受影响主机及时修复漏洞。

  根据国家信息安全漏洞共享平台(CNVD)漏洞公告,此漏洞存在于异步通讯服务,可通过访问路径/_async/AsyncResponseService,判断不安全组件是否开启。wls9_async_response.war包中的类由于使用注解方法调用了Weblogic原生处理Web服务的类,因此会受该漏洞影响:

  为更好的理解漏洞成因,通过IDEA对WebLogic服务器远程动态调试(因为需要跟进原生类中的方法,需要在IDEA中指定WebLogic安装目录中的JDK文件夹),在ProcessBuilder类中打下断点,关键的调用栈过程如下所示:

  调用栈非常深,下面解释一下几个关键的部分。首先是继承自HttpServlet的BaseWSServlet类,其中的service方法主要用于处理HTTP请求及其响应,通过HTTP协议发送的请求包封装在HttpServletRequest类的实例化对象var1中:

  为方便后续分析工作进行,在此先简单介绍一下SOAP协议内容及格式:SOAP(中文称之为简单对象访问协议),用于在WEB上交换结构化和固化的信息,是Web Service三要素之一,可以和现存的许多因特网协议和格式结合使用。下图展示SOAP消息封装的标准格式:

  调用var1对象中定义的getPort()方法解析SOAP消息中的根元素Envelope(可把 XML 文档定义为 SOAP 消息),获取所调用服务的端口信息:

  跟进WsSkel类中定义的invoke()方法,其中完成了ServerDispatcher类实例化过程,并调用setWsPort()方法指定服务请求地址,进入调试器查看WsPort对象var2的属性值,发现底层依靠HashMap数据结构保存请求服务的Address和URI,其中当前请求服务:

  在Security机制完成对类名权限校验后,利用Java反射机制,通过元类定义的newInstance()方法实现上述类的实例化过程:

  同样通过反射包中的Constructor类调用构造器方法传入字节数组,为上述实例对象赋初值:

  到此就完成了漏洞利用的全过程,下图演示了漏洞利用效果,通过反序列化漏洞成功运行了计算器程序:

  但上述这类采用黑名单的防护措施很快就被如下POC轻松绕过,因为其中不包含任何Object元素,但经XMLDecoder解析后依旧造成了远程代码执行:

  针对如上所示一系列bypass CVE-2017-3506补丁限制的POC的产生,官方在同年十月份发布了CVE-2017-10271补丁文件。和上述不同点在于本次更新中官方将object、new、method关键字继续加入到黑名单中,一旦解析XML元素过程中匹配到上述任意一个关键字就立即抛出运行时异常。但是针对void和array这两个元素是有选择性的抛异常,其中当解析到void元素后,还会进一步解析该元素中的属性名,若没有匹配上index关键字才会抛出异常。而针对array元素而言,在解析到该元素属性名匹配class关键字的前提下,还会解析该属性值,若没有匹配上byte关键字,才会抛出运行时异常:

  本次反序列化漏洞绕过以往补丁的关键点在于利用了Class元素指定任意类名,因为CVE-2017-10271补丁限制了带method属性的void元素,所以不能调用指定的方法,而只能调用完成类实例化过程的构造方法。

  在寻找利用链的过程中发现UnitOfWorkChangeSet类构造方法中直接调用了JDK原生类中的readObject()方法,并且其构造方法的接收参数恰好是字节数组,这就满足了上一个补丁中array标签的class属性值必须为byte的要求,再借助带index属性的void元素,完成向字节数组中赋值恶意序列化对象的过程,最终利用JDK 7u21反序列化漏洞造成了远程代码执行。通过巧妙的利用了void、array和Class这三个元素成功的打造了利用链,再次完美的绕过了CVE-2017-10271补丁限制,本次漏洞的发现进一步证明了依靠黑名单机制是一种不可靠的防护措施。

  因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。

  注:wls9_async_response.war及wls-wsat.war属于一级应用包,对其进行移除或更名操作可能造成未知的后果,Oracle官方不建议对其进行此类操作。若在直接删除此包的情况下应用出现问题,将无法得到Oracle产品部门的技术支持。请用户自行进行影响评估,并对此文件进行备份后,再执行此操作。

本文链接:http://buggystordera.com/fanxuliehua/290.html