apachestruts2远程代码执行漏洞修复
```html 2017年3月,远程一家美国信用评级机构被拖库,代码1.43亿用户记录泄露。执行事后调查发现,漏洞攻击者利用的修复入口是Apache Struts2的一个已知漏洞——S2-045。更讽刺的远程是,这个漏洞的代码补丁早在两个月前就发布了。他们没打。执行 Struts2的漏洞RCE漏洞不是偶发事件。从2010年的修复S2-005到2020年的S2-061,十年间至少爆出二十多个可远程执行代码的远程严重漏洞。每次都是代码类似的模式:OGNL表达式解析出问题,攻击者构造恶意请求,执行服务器乖乖执行任意命令。漏洞修复方法说穿了就一句话——把用户输入当数据,修复别当代码。但Struts2的架构偏偏在这件事上反复栽跟头。 Struts2的核心是Action,请求参数通过拦截器栈层层传递。OGNL(Object-Graph Navigation Language)负责在Action和视图之间取值赋值。问题出在:某些拦截器会把HTTP请求里的参数名或参数值直接丢给OGNL去解析。攻击者只要在参数名里塞入 S2-045的触发点特别典型。它藏在 官方给出的方案永远是“升级到最新版”。这话没错,但不够。我见过太多团队把Struts2从2.3.15升到2.3.32,以为万事大吉,结果S2-057又打穿了。版本升级只是第一层。 真正的修复动作得从三个层面同时下手: 第一,拦截器白名单。在 第二,OGNL沙箱。Struts2从2.3.20开始提供了 第三,WAF规则要精准。别只拦 去年帮一个电商客户做应急响应。他们的Struts2版本是2.5.10,S2-057的payload打进来时,WAF只拦了 我们做了四件事:先把WAF规则从 整个过程花了六个小时。但清理木马和排查横向移动花了两周。 Struts2的漏洞经常出在它依赖的库上。比如 还有 Struts2这个框架的历史包袱太重。它的设计哲学是“让开发者少写代码”,代价就是把太多东西暴露给了请求层。如果你的项目还在用Struts2,而且不是那种十年没动过的老系统,我建议认真评估迁移到Spring MVC或Jakarta EE的可能性。迁移成本不低,但比每年打一次RCE补丁、每次都要担心有没有漏掉某个拦截器要划算。 如果暂时迁不了,至少做到:订阅Apache Struts的安全公告邮件列表;把先搞清楚漏洞从哪来
%{ ...}这样的表达式,就能让服务器执行任意Java代码。Content-Type头里。当请求的Content-Type包含%{ 时,Jakarta Multipart解析器会把它当成OGNL表达式执行。一个HTTP头就能getshell,连认证都不需要。修复不是升级版本就完事
struts.xml里显式声明每个Action允许接受的参数名。用<param name="excludeParams">把^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*这些全排掉。别嫌麻烦,这是最直接的一道墙。struts.ognl.allowStaticMethodAccess=false这个开关。默认是false,但有些老项目为了图方便会手动打开。开了就等于把@java.lang.Runtime@getRuntime().exec()直接送到攻击者手里。关掉它,然后检查代码里有没有依赖静态方法调用的地方,有就重写。%{ ,攻击者会编码。URL编码、Unicode编码、双重编码,花样多得很。规则得同时匹配%25%7B、%u007b这些变体。但WAF只是争取时间,不能当最终方案。一个真实的修复案例
${ ,没拦%{ 。攻击者通过redirectAction的actionName参数注入了OGNL表达式,服务器上已经被种了挖矿木马。${ 扩展到%{ (#|@);然后升级到2.5.22;接着在struts.xml里给所有Action加了excludeParams;最后把struts.devMode和struts.i18n.reload全关掉——这两个开关在生产环境开着就是自杀。别忽略依赖链
commons-fileupload、ognl、freemarker。你升级了Struts2核心包,但Maven里ognl的版本还是3.0.19,那S2-045照样能打。用mvn dependency:tree把整条依赖链拉出来,逐个确认版本。特别是ognl,必须升到3.1.12以上。struts2-rest-plugin和struts2-jquery-plugin这些官方插件,它们经常比核心包晚一个版本修漏洞。如果项目里用了,得单独检查。长期策略
struts.xml里的excludeParams当成代码规范强制执行;每次发版前用struts2-security-audit这类工具扫一遍。别等出事再补。
-
上一篇
-
下一篇
- 随机阅读
- 搜索
-
- 友情链接
-