struts2052漏洞
Struts2 052漏洞:一个反序列化问题,漏洞差点让整个互联网裸奔
2017年3月,漏洞一个编号为S2-052的漏洞漏洞在Struts2框架里炸开了锅。它有个更响亮的漏洞别名——CVE-2017-9805,Apache官方给的漏洞评级是“严重”,CVSS评分高达8.1。漏洞但真正让安全圈炸毛的漏洞不是评分,而是漏洞这个漏洞的触发方式:只要目标系统用了Struts2的REST插件,攻击者往XML请求体里塞一段精心构造的漏洞反序列化数据,就能直接拿到服务器的漏洞控制权。没有用户名密码,漏洞没有交互,漏洞一个HTTP POST请求就够。漏洞
我亲眼见过一次演示。漏洞安全研究员在本地搭了个带REST插件的漏洞Struts2应用,用Burp Suite改了个请求头,把Content-Type设成application/xml,body里放了一串Base64编码的恶意对象。几秒钟后,服务器弹出了计算器——在Windows上,这就是远程代码执行的标志。整个过程安静得可怕,日志里只有一条普通的POST记录。
漏洞的根源出在Struts2的XStreamHandler上。REST插件默认用XStream库解析XML,而XStream在反序列化时允许调用任意类的任意方法。攻击者可以构造一个恶意的XML映射,让XStream在解析过程中执行系统命令。这不是Struts2第一次栽在反序列化上,但052的可怕之处在于它利用了XStream的默认配置——你不需要额外开启什么功能,只要用了REST插件,漏洞就摆在那里。
受影响的版本范围很广:Struts2.5.x到2.5.12,Struts2.3.x到2.3.33。基本上,2017年之前用Struts2做REST服务的项目,十有八九都中招。我记得当时有个电商平台的运维朋友,半夜三点被电话叫醒,说服务器被人上传了webshell。查了一圈,入口就是Struts2的某个REST接口。他们团队连夜打补丁,升级到2.5.13,才把窟窿堵上。
修复方案其实不复杂。官方在2.5.13版本里把XStreamHandler的默认安全配置改成了白名单模式,只允许反序列化特定类。如果你不能立刻升级,临时缓解措施是把REST插件卸了,或者禁用XML内容类型。但实际操作中,不少老项目把REST接口和业务逻辑耦合得太深,根本没法说卸就卸。这就导致052漏洞在野利用持续了至少半年,直到2017年底还有扫描器在批量探测。
这个漏洞给我最深的印象是它的“低门槛”。不像某些漏洞需要绕过WAF、猜测路径、叠加多个条件,052只需要一个能发POST请求的工具。攻击面大得离谱,而防御方却很难通过常规的输入过滤来拦截。你没法过滤XML里的恶意类名,因为XStream的调用链太深,黑名单根本写不全面。
回过头看,052暴露了Java生态里一个长期存在的通病:框架为了开发便利,默认开启了功能强大的反序列化机制,却很少考虑默认安全。Struts2不是第一个栽跟头的,也绝不是最后一个。后来WebLogic、Fastjson接连出类似问题,套路如出一辙。只是052爆发得早,影响面广,成了很多人记忆里“反序列化漏洞”的启蒙课。
现在2024年了,Struts2的使用率已经大不如前,Spring Boot成了主流。但052的教训没过时——每次看到某个框架宣称“开箱即用”时,我都会下意识地问一句:默认配置里,有没有关掉那些不该暴露的能力?