fastjson漏洞分析
字数 1903 2025-08-11 17:40:24
Fastjson漏洞分析与利用全面指南
1. Fastjson简介
Fastjson是阿里巴巴开源的一个Java库,用于:
- 将Java对象转换为JSON表示形式
- 将JSON字符串转换为等效的Java对象
- 处理任意Java对象,包括没有源代码的预先存在的对象
核心功能示例:
// 对象转JSON
String jsonString = JSON.toJSONString(userObject);
// JSON转对象
User user = JSON.parseObject(jsonString, User.class);
2. JSON框架识别技术
不同JSON框架的识别特征
-
Jackson:
- 严格要求与bean对象对齐(可少不可多)
- 无法解析单引号
- 无法识别注释符
-
Gson:
- 浮点数无法转整数(会报错)
- 遇到#会当作注释符处理
- 拼接JSON字符串时会报错
-
org.json:
- 插入\n、\r等字符会改变输出
- 结合#注释符处理
-
Fastjson:
- 浮点精度不丢失
- 对@type做出特定响应
- 可通过DNSLOG探测
Fastjson探测方法
-
DNSLOG探测:
- 高效的无回显探测方法
- 适用于出网环境
- 示例payload:
{"@type":"java.net.Inet4Address","val":"dnslog.domain"}
-
响应状态探测:
- 观察对@type的响应行为
- 特定错误信息特征
3. Fastjson版本探测
有回显情况
- 通过构造特定payload触发报错显示版本号
- 示例:破坏FastJsonHttpMessageConverter的既定结构
无回显DNSLOG探测
- 关键版本识别标志:
- 1.2.47
- 1.2.68
- 1.2.80
- 使用不同类进行探测:
java.lang.Classjava.lang.AutoCloseablejava.lang.Exception
版本特征:
- 1.2.68和1.2.80只会接收到第一个DNSLOG请求
- 1.2.83会收到第二个请求
4. 利用链探测技术
-
Character报错回显:
- 当类存在时将Class强转为Char导致报错
- 可用于确认类是否存在
-
Class回显:
- 类存在时返回类实例
- 体现在服务器响应变化
-
DNSLOG外带:
- 高难度利用方式
- 对操作系统和DNS服务器有要求
5. Fastjson漏洞历史与利用
漏洞版本时间线
-
<=1.2.24:
- 最初漏洞版本,无任何校验
- 任意反序列化利用
- 常用payload:
- JdbcRowSetImpl
- TemplatesImpl
- bcel
-
1.2.25-1.2.45:
- 引入checkAutoType机制和黑名单
- 手动开启autotype时可绕过黑名单
-
<=1.2.47:
- 缓存通杀漏洞
- 不开启AutoTypeSupport也可构造任意反序列化
- 对于1.2.25-1.2.32需关闭AutoTypeSupport
-
<=1.2.68:
- 新增expectClass判断
- 可通过expectClass绕过autoType检查
-
<=1.2.80:
- expectClass属性引入导致新漏洞
- checkAutoType中对expectClass的判断问题
绕过技术演进
-
1.2.41:
- 加L绕过(如
@type":"Lcom.sun.rowset.JdbcRowSetImpl;)
- 加L绕过(如
-
1.2.42:
- 双写L绕过(如
LLcom.sun.rowset.JdbcRowSetImpl;;)
- 双写L绕过(如
-
1.2.43:
- 加[{绕过(如
{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{...})
- 加[{绕过(如
6. WAF绕过技术
-
编码绕过:
- Fastjson自动进行hex解码和unicode解码
- 示例:使用编码后的key/value
-
字符填充:
- 传统WAF绕过思路
- 大量无用字符填充
-
DOS漏洞:
- Fastjson 1.2.36-1.2.62存在DOS漏洞
- 1.2.80后推出noAutoType版本但未修复DOS漏洞
7. 高级利用技术
Fastjson -> CodeQL分析
- 可用于寻找调用链
- 示例:寻找Shiro调用链
- source点:类的Field
- sink点:lookup方法
- 已发现3条调用链
黑名单分析
- Fastjson采用黑名单防御机制
- 黑名单项目参考:https://github.com/LeadroyaL/fastjson-blacklist
- 黑名单机制存在固有缺陷,建议使用Fastjson2
8. 防御建议
- 升级到Fastjson2
- 禁用AutoType功能
- 严格过滤输入
- 使用最新安全版本
- 监控异常DNS请求