Strut2高危远程命令执行漏洞预警_基于Jakarta plugin插件

匿名者  1728天前

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图片.png

Request对象会经过wrapRequest方法处理,看看是如何处理的

图片.png 

可以看到content_type变量没经过任何处理,不过content_type变量没有被继续调用,

但是request对象被StrutsRequestWrapper方法继续调用(request中也包含content_type

图片.png 

继续跟进StrutsRequestWrapper

图片.png

可以看到request对象被JakartaMultiPartRequest类的parse()方法调用,继续跟进parse()

 图片.png

带有payload的request对象经过处理的时候会抛出变量名为var6的异常(var6对象经过处理后中同样带有content_type)

图片.png

然后被带入buildErrorMessage()方法

图片.png

异常对象的message被扔到了findText()方法中,message中同样带有conten-type

图片.png

图片.png

经过一系列调用content-type最终被放在translateVariables()中方法当做ognl表达式调用,完成命令执行

图片.png

图片.png

官方补丁在

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

三个文件中增加了如下同一段代码进行防御

图片.png

4.漏洞影响

    本次受影响的Struts版本:

        Struts 2.3.5 - Struts 2.3.31

        Struts 2.5 - Struts 2.5.10

5.影响范围

        白帽汇第一时间对漏洞进行复现,稍后更新全网受影响范围,目前国内使用Struts2框架较多的主要覆盖面积集中在金融,政府,电商等大型行业。该漏洞影响范围很广,危害度较高, 截止到目前已经发现互联网有部分渠道已经公开poc,且有攻击者正在进行批量攻击扫描。同时可以使用fofa客户端进行外网资产快速验证评估企业受影响范围:

图片.png

6.CVE编号

    CVE-2017-5638

7.修复建议

    1、请升级到最新的ApacheStruts2.3.322.5.10.1版本。

    http://struts.apache.org/download.cgi#struts2510

    2.使用Servlet过滤器验证Content-Type丢弃不匹配的求multipart/form-data

白帽汇会持续对该漏洞进行跟进。

参考

    [1] https://cwiki.apache.org/confluence/display/WW/S2-045

最新评论

昵称
邮箱
提交评论