Strut2高危远程命令执行漏洞预警_基于Jakarta plugin插件
1.漏洞说明
近日Apache Struts2被爆存在远程代码执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,该漏洞目前Struts官网已经确认,并定性为等级为高。现在网络上已经出现的漏洞利用工具出现,请各位站长朋友立即修复。以免造成不必要的影响和损失。
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。struts2在国内外一种很流行的java框架。
2.漏洞描述与危害
通过Jakarta 文件上传插件,恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令,获取服务器权限。该漏洞易造成敏感数据泄露、网页篡改、系统被黑客入侵等严重危害。并且该插件属于Struts2核心默认自带插件.
3.漏洞分析
从org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter开始分析,所有的请求都会经过此Filter
Request对象会经过wrapRequest方法处理,看看是如何处理的
可以看到content_type变量没经过任何处理,不过content_type变量没有被继续调用,
但是request对象被StrutsRequestWrapper方法继续调用(request中也包含content_type)
继续跟进StrutsRequestWrapper
可以看到request对象被JakartaMultiPartRequest类的parse()方法调用,继续跟进parse()
带有payload的request对象经过处理的时候会抛出变量名为var6的异常(var6对象经过处理后中同样带有content_type)
然后被带入buildErrorMessage()方法
异常对象的message被扔到了findText()方法中,message中同样带有conten-type
经过一系列调用content-type最终被放在translateVariables()中方法当做ognl表达式调用,完成命令执行
官方补丁在
1.\core\src\main\java\org\apache\struts2\dispatcher\multipart\MultiPartRequestWrapper.java
2.core\src\main\java\org\apache\struts2\dispatcher\multipart\JakartaMultiPartRequest.java
3.\core\src\main\java\org\apache\struts2\dispatcher\multipart\JakartaStreamMultiPartRequest.java
三个文件中增加了如下同一段代码进行防御
4.漏洞影响
本次受影响的Struts版本:
Struts 2.3.5 - Struts 2.3.31
Struts 2.5 - Struts 2.5.10
5.影响范围
白帽汇第一时间对漏洞进行复现,稍后更新全网受影响范围,目前国内使用Struts2框架较多的主要覆盖面积集中在金融,政府,电商等大型行业。该漏洞影响范围很广,危害度较高, 截止到目前已经发现互联网有部分渠道已经公开poc,且有攻击者正在进行批量攻击扫描。同时可以使用fofa客户端进行外网资产快速验证评估企业受影响范围:
6.CVE编号
CVE-2017-5638
7.修复建议
1、请升级到最新的ApacheStruts2.3.32或2.5.10.1版本。
http://struts.apache.org/download.cgi#struts2510
2.使用Servlet过滤器验证Content-Type丢弃不匹配的求multipart/form-data
白帽汇会持续对该漏洞进行跟进。
最新评论