struts2 漏洞分析与防护方案 CVE-2017-5638 S2-045 除了升级外还是有修复方案的

简介:

昨天安全加报道了 Struts 2再爆高危漏洞CVE-2017-5638 绿盟科技发布免费扫描工具及产品升级包 ,今天绿盟科技又发布了分析和防护方案

Apache Struts2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CNNVD-201703-152。攻击者可以在使用该插件上传文件时,修改HTTP请求头中的Content-Type值来触发该漏洞,导致远程执行代码。

相关链接如下:

https://cwiki.apache.org/confluence/display/WW/S2-045?from=timeline&isappinstalled=0

影响的版本

  • Struts 2.3.5 - Struts 2.3.31
  • Struts 2.5 - Struts 2.5.10

不受影响的版本

  • Struts 2.3.32
  • Struts 2.5.10.1

绿盟威胁情报中心NTI关于Struts2漏洞范围分布图

  1. 全球分布图

Struts2%20Global.jpg

  1. 国内分布图

Struts2%20China.jpg

  1. 全球排行

Struts2%20rank%20Global.png

  1. 国内排行

Struts2%20rank%20China.png

漏洞分析

Apache Struts2存在远程代码执行漏洞,攻击者可以将恶意代码通过http报文头部的Content-Type字段传递给存在漏洞的服务器,导致任意代码执行漏洞。

  1. 漏洞POC

Struts2%20poc.png

  1. 漏洞验证

Struts2%20poc2.png

  1. 细节分析

It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn't valid an exception is thrown which is then used to display an error message to a user.

从官方的漏洞描述我们可以知道,这个漏洞是由于Strus2对错误消息处理出现了问题,通过Content-Type这个header头,注入OGNL语言,进而执行命令。

本文的分析是基于Struts 2.3.24版本。首先看一下POC,攻击指令通过"Content-Type"传递给存在漏洞的服务器,如下图所示:

Content-Type.png

在传入的参数中,通过#nike='multipart/form-data'语句使得后台判断语句content_type.contains("multipart/form-data")判断结果为true,以便攻击代码得以传入。同时将攻击代码'cat /etc/passwd'赋值给#cmd参数。接下来通过(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})来判断目标主机的操作系统类型,并选择性的进行指令赋值,最终,通过如下图代码,将攻击指令执行:

Struts2%20command.png

下面先看一下命令执行注入点:

Struts2%20command%20Injection.png

在JakartaMultiPartRequest.java 的buildErrorMessage函数中,这个函数里的localizedTextUtil.findText会执行OGNL表达式,从而导致命令执行,我们先看下findtext的定义:

https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html

findtext.png

接下来它被JakartaMultiPartRequest.java中的parse调用。Struts2的入口FilterDispatcher.java接下来执行doFilter函数,执行完一些过滤后进入prepareDispatcherAndWrapRequest函数,再执行dispatcher.wrapRequest进入request处理分支,下图就是prepareDispatcherAndWrapRequest的实现,该函数对方法进行了处理:

prepareDispatcherAndWrapReques.png

接着我们看dispatcher.wrapRequest,当Content-Type为multipart/form-data的时候会调用MultiPartRequestWrapper,这个是一个对各种不同上传方式的封装,其中就包含Jakarta等传输方式:

Struts2%20Jakarta.png

MultiPartRequestWrapper.java封装了parse函数:

MultiPartRequestWrapper.java.png

我们来看下parse函数,如下图所示:

parse.png

在parse函数中,当Content-Type格式不被识别时,出现异常,导致OGNL表达式被执行,这就是我们分析的最初的注入点。

  1. 补丁分析

  • 2.5.10.1版本的修复方案:

https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b

2.5.10.1%20fix.png

  • 2.3.32版本的修复方案:

https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a

2.3.32%20fix.png

官方解决方案

  • 官方已经发布了版本更新,建议用户升级到不受影响的最新版本(Struts2 2.3.32或Struts 2.5.10.1),下载链接如下所示:

Struts 2.3.32:

https://github.com/apache/struts/releases/tag/STRUTS_2_3_32

Struts 2.5.10.1:

https://github.com/apache/struts/releases/tag/STRUTS_2_5_10_1

临时修复方案

在用户不便进行升级的情况下,作为临时的解决方案,用户可以进行以下操作来规避风险:

  • 修改Web-INF/classes目录下的struts.xml中的配置

在Web-INF/classes目录下的struts.xml 中的struts 标签下添加<constant name="struts.custom.i18n.resources" value="global" />;

在WEB-INF/classes/ 目录下添加 global.properties,文件内容如下

struts.messages.upload.error.InvalidContentTypeException=1

  • 配置过滤器过滤Content-Type的内容

在web应用的web.xml中配置过滤器,在过滤器中对Content-Type内容的合法性进行检测:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {

String contentType = request.getContentType().toLowerCase(Locale.ENGLISH);

if (contentType != null && contentType.contains("multipart/form-data") && !contentType.startsWith("multipart/form-data"))

{ response.getWriter().write("Reject!"); }

else { chain.doFilter(request, response); }

}

技术防护方案

  • 如果您不清楚是否受此漏洞影响:

公网资产 可使用绿盟云 紧急漏洞在线检测,检测地址如下:

http://t.cn/RipBq1c

内网资产 可以使用绿盟科技的远程安全评估系统(RSAS V5、V6)或 Web应用漏洞扫描系统(WVSS) 进行检测。

远程安全评估系统(RSAS V5)

http://update.nsfocus.com/update/listAurora/v/5

远程安全评估系统(RSAS V6)

http://update.nsfocus.com/update/listRsasDetail/v/vulweb

Web应用漏洞扫描系统(WVSS)

http://update.nsfocus.com/update/listWvss

通过上述链接,升级至最新版本即可进行检测!

  • 使用绿盟科技防护类产品(NIPS/NIDS/NF/WAF)进行防护:

入侵防护系统(NIPS)

http://update.nsfocus.com/update/listIps

入侵检测系统(NIDS)

http://update.nsfocus.com/update/listIds

下一代防火墙系统(NF)

http://update.nsfocus.com/update/listNf

Web应用防护系统(WAF)

http://update.nsfocus.com/update/wafIndex

通过上述链接,升级至最新版本即可进行防护!

绿盟科技声明

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。



原文发布时间:2017年3月24日

本文由:绿盟科技发布,版权归属于原作者

原文链接:http://toutiao.secjia.com/struts2-vulnerability-analysis-and-protection-cve-2017-5638

本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站

相关文章
|
6月前
|
监控 Dubbo 测试技术
影子流量进行版本可行性验证
影子流量进行版本可行性验证
159 0
|
安全 前端开发 网络安全
公司网站有高危逻辑漏洞要修复怎么办
在我SINE安全对客户网站进行逻辑漏洞检测的时候,逻辑漏洞就是指由于程序结构输入管理不紧,造成程序代码不能够 正常解决或错误处理,一般发生在新用户注册、找回密码、信息内容查询、网上交易结算额度等。我将全部逻辑漏洞的现象分成前端开发和后端开发2个组成部分,整体构思全部都是先检测前端开发再检测后端开发。在我解读中实际上便是能提升标准限定的便是漏洞【像无法更改的,利用抓包就能够更改了】。
99 0
公司网站有高危逻辑漏洞要修复怎么办
|
安全 程序员 数据库
可控参数带来的网站漏洞修复建议方案
网站中存在的越权漏洞,首先我们来讲一下什么是关键可控参数,也就是说像我们的一些关键参数,例如use ID order by ID就是一些关键的参数,必须是你的这么一个测试者,是能够去对其控制的。如果这个参数已经挟持了,或者说他有固定的这个值。那此时的话就不称为可控参数了。而关键就是你的改动必须能造成这个越权效果的一种称为关键参数。我们一定要快速定位到这种关键可控的这个参数之后,我们才能够更快速的去找到对应的这么一个越权漏洞。
144 0
可控参数带来的网站漏洞修复建议方案
|
安全 数据库 数据安全/隐私保护
网站安全之逻辑漏洞检测 修复方案
网站安全是整个网站运营中最重要的一部分,网站没有了安全,那用户的隐私如何保障,在网站中进行的任何交易,支付,用户的注册信息都就没有了安全保障,所以网站安全做好了,才能更好的去运营一个网站,我们SINE安全在对客户进行网站安全部署与检测的同时,发现网站的业务逻辑漏洞很多,尤其暴利破解漏洞。
303 0
网站安全之逻辑漏洞检测 修复方案
|
SQL 安全 Java
struts2架构网站漏洞修复详情与利用漏洞修复方案
struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被攻击者挖掘出来的struts2漏洞也越来越,从最一开始S2-001到现在的最新的s2-057漏洞,本文着重的给大家介绍一下struts2漏洞的利用详情以及漏洞修复办法。
210 0
struts2架构网站漏洞修复详情与利用漏洞修复方案
|
存储 安全 程序员
网站漏洞检测详情与修复方案
Metinfo CMS系统被爆出网站存在漏洞,可上传任意文件到网站根目录下,从而使攻击者可以轻易的获取网站的webshell权限,对网站进行篡改与攻击,目前该网站漏洞影响范围是Metinfo 6.2.0最新版本,以及以前的所有Metinfo版本都可以利用,关于该Metinfo漏洞的详情我们来详细的分析:
168 0
网站漏洞检测详情与修复方案
|
缓存 安全 测试技术
thinkphp 漏洞修复方案之<6.X版本的代码漏洞案例分析
大年初五,根据我们SINE安全的网站安全监测平台发现,thinkphp官方6.0版本被爆出高危的网站代码漏洞,该漏洞可导致网站被植入网站木马后门文件也叫webshell,具体产生的原因是session ID参数值这里并未对其做详细的安全过滤与校验,导致可以远程修改POST数据包将session的值改为恶意的后门代码,发送到服务器后端并生成PHP文件直接生成,可导致网站被攻击,服务器被入侵,关于该thinkphp漏洞的详情,我们SINE安全来跟大家分析一下。
430 0
thinkphp 漏洞修复方案之<6.X版本的代码漏洞案例分析
|
SQL 安全 测试技术
网站漏洞渗透检测过程与修复方案
网站的渗透测试简单来 说就是模拟攻击者的手法以及攻击手段去测试网站的漏洞,对网站进行渗透攻击测试,对网站的代码漏洞进行挖掘,上传脚本文件获取网站的控 制权,并对测试出来的漏洞以及整体的网站检测出具详细的渗透测试安全报告。
236 0
网站漏洞渗透检测过程与修复方案
|
安全 PHP 程序员
网站漏洞检测 Metinfo 6.2.0上传漏洞详情与修复方案
Metinfo CMS系统被爆出网站存在漏洞,可上传任意文件到网站根目录下,从而使攻击者可以轻易的获取网站的webshell权限,对网站进行篡改与攻击,目前该网站漏洞影响范围是Metinfo 6.2.
1338 0