apache struts 代码执行漏洞
2017年3月,代码一个编号为S2-045的执行Apache Struts2漏洞被公开,几天之内,漏洞全球大量网站被攻陷。代码这个漏洞的执行利用门槛低到令人发指——攻击者只需要向特定URL发送一个精心构造的Content-Type头,就能在服务器上执行任意命令。漏洞国内某大型电商平台因此泄露了数亿条用户数据,代码某省社保系统被拖库,执行连一些政府网站都没能幸免。漏洞
Struts2是代码Java世界里最流行的MVC框架之一,当年几乎每三个Java Web应用里就有一个在用。执行问题出在它的漏洞Jakarta Multipart解析器上。这个组件用来处理文件上传,代码但在解析Content-Type时,执行会把用户输入直接拼接到OGNL表达式中。漏洞OGNL是什么?简单说,它能让字符串变成可执行的代码。攻击者利用这个特性,把恶意表达式塞进HTTP头里,服务器就乖乖执行了。
我见过最讽刺的案例是某安全公司自己的官网被黑。那家公司的安全产品主打Web防护,结果自家服务器上跑着老版本Struts2,连补丁都没打。攻击者进去之后只留下一句话:“你们连自己都保护不了。”后来检查日志才发现,漏洞公开后不到6小时,就有扫描器全网扫这个漏洞了。
这个漏洞的本质其实是个老问题——框架把不可信数据当代码处理。但为什么Struts2反复出这类漏洞?从2016年的S2-032到2017年的S2-045、S2-046、S2-048,一年之内连续爆出四个RCE(远程代码执行)漏洞。开发团队的反应速度跟不上攻击者的利用速度。有些企业甚至不知道自己的系统里用了Struts2,因为框架被封装在第三方产品里,比如某些OA系统、CRM系统。
修复方案说起来简单:升级到2.3.32或2.5.10.1版本。但实际操作中,很多老系统跑了几十年,升级意味着要重写兼容层、重新测试所有业务流程。我接触过一家银行的IT部门,他们的Struts2应用还停留在2.3.20,因为升级会导致某个报表功能崩溃,而那个报表每个季度才用一次。于是他们选择在防火墙上加白名单,赌外部攻击者进不来。
这种赌徒心态在真实世界里很常见。漏洞修补不是技术问题,而是风险管理问题。更麻烦的是,Struts2的生态链太长,很多开发者自己写的代码没问题,但引用的第三方库内部嵌了旧版Struts2,扫描器扫不到,人工审计又漏掉。
直到今天,Shodan上还能搜到暴露在公网的Struts2应用,有些甚至还是2017年之前的版本。攻击者用现成的利用工具,五分钟就能拿下一台服务器。安全圈有句老话:漏洞不可怕,可怕的是你不知道自己用了有漏洞的组件。这句话放在Struts2身上,再合适不过。
本文地址:http://www.79wt.cn/news/1144a1799868.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。