博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2 漏洞分析与防护方案 CVE-2017-5638 S2-045 除了升级外还是有修复方案的
阅读量:6233 次
发布时间:2019-06-21

本文共 3271 字,大约阅读时间需要 10 分钟。

昨天安全加报道了 ,今天绿盟科技又发布了分析和防护方案

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

相关链接如下:

影响的版本

  • 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的定义:

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版本的修复方案:

2.5.10.1%20fix.png

  • 2.3.32版本的修复方案:

2.3.32%20fix.png

官方解决方案

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

Struts 2.3.32:

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); }

}

技术防护方案

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

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

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

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

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

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

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

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

入侵防护系统(NIPS)

入侵检测系统(NIDS)

下一代防火墙系统(NF)

Web应用防护系统(WAF)

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

绿盟科技声明

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

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

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

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

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

你可能感兴趣的文章
将EXCEL转为HTML有什么好办法?
查看>>
了解一下Elasticsearch的基本概念
查看>>
二、let变量声明方式介绍
查看>>
iOS逆向:在任意app上开启malloc stack追踪内存来源
查看>>
【BZOJ】4033: [HAOI2015]树上染色 树上背包
查看>>
python学习三:列表、元组、字典、集合
查看>>
iOS中使用UISegmentControl进行UITableView切换
查看>>
自适应响应式,手机,平板,PC,java企业网站源码
查看>>
【CodeForces】835F Roads in the Kingdom
查看>>
2014.4.17—openflow代码流程
查看>>
leetcode-414-Third Maximum Number
查看>>
最新Android开源库、工具、开源项目整理分享
查看>>
Sql 获取当前日期没有时分秒
查看>>
mybatis_mapper动态代理
查看>>
CoreData一些基本概念
查看>>
1.java soap api操作和发送soap消息
查看>>
AJAX请求 $.ajaxSetup方法的使用
查看>>
background-size搭配transition实现鼠标hover背景图放大问题
查看>>
Redis分布式锁
查看>>
spark/java连接 kudu incompatible RPC? Error is: step 异常解决
查看>>