首页 > 安全 > 网络安全 >

Apache Struts2 远程代码执行漏洞(S2-046)技术分析与防护方案

2017-03-24

Apache Struts2 远程代码执行漏洞(S2-046)技术分析与防护方案。3月21日凌晨,Apache Struts2官方发布了一条安全公告,该公告指出Apache Struts2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638。

Apache Struts2 远程代码执行漏洞(S2-046)技术分析与防护方案。3月21日凌晨,Apache Struts2官方发布了一条安全公告,该公告指出Apache Struts2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638。攻击者可以在使用该插件上传文件时,通过修改Content-Length头的值,并且在Content-Disposition 值中添加恶意代码,导致远程代码执行。

该漏洞与之前S2-045漏洞成因及原理一样(CVE漏洞编号是同一个),只是漏洞利用的字段发生了改变。

相关地址:

https://struts.apache.org/docs/s2-046.html

https://cwiki.apache.org/confluence/display/WW/S2-046

文章目录

影响的版本 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漏洞范围分布图 全球分布图

\

国内分布图

\

全球排行

\

国内排行

\

漏洞分析 漏洞简介

Apache Struts2存在远程代码执行漏洞,攻击者可以将恶意代码放入http报文头部的Content-Disposition的filename字段,通过不恰当的filename字段或者大小超过2G的Content-Length字段来触发异常,进而导致任意代码执行。

漏洞分析

官方的漏洞描述如下:

It is possible to perform a RCE attack with a malicious Content-Disposition value or with improper Content-Length header. If the Content-Dispostion / Content-Length value is not valid an exception is thrown which is then used to display an error message to a user. This is a different vector for the same vulnerability described in S2-045 (CVE-2017-5638)

从官方的漏洞描述我们可以知道,这个漏洞是由于Struts2对错误消息处理出现了问题,漏洞原理同S2-045。但是触发点不一样,可以通过Content-Dispostion中的含有%00的filename字段,或者Content-Length超过2G大小来触发这个漏洞。

本次分析基于Struts 2.3.24版本进行测试。POC及漏洞验证如下:

\

首先我们尝试Content-Disposition字段,看一下POC,攻击指令通过”Content-Disposition”的filename字段传递给存在漏洞的服务器。下面先看一下远程命令执行注入点,这个和S2-045是一样的:

\

观察报错输出的调用栈,从这里可以看出端倪:

\

最终出现异常的位置在checkFileName函数处,下面接着看checkFileName的实现:

\

这里首先判断文件名是否为null,当文件名中包含“\u0000”字符时就会抛出异常,异常信息中会带入filename字段,从我们的POC中看出这个字段就是我们要攻击的字段。接下来这个异常信息会交给buildErrorMessage执行。还是同s2-045的分析一样,我们首先来看Struts2的入口点doFilter

\

接着进入org.apache.struts2.dispatcher.Dispatcher.wrapRequest:

\

接着进入dispacher的wrapRequest,wrapRequest会调用org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper,在这个MultiPartRequestWrapper中会进行初始化,这就是设计模式中的适配器模式。初始化会调用org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse,parse的实现如下,首先是处理上传文件,如果遇到异常则会触发buildErrorMessage。

\

跟进去processUpload,实现如下:

\

再跟进去processFileField,在这里会处理各个header头:

\

在这里有getName函数,继续跟进去:

\

看看上面的注释就知道了,代码会特别处理NULL字符串,继续跟进去,这里就会验证filename参数,判断是否存在“\u0000”,然后抛出异常:

\

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

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

\

接下来它被JakartaMultiPartRequest.java中的parse调用。

对于第二种情况,是在JakartaStream 上传模式下,也就是Struts2 配置文件中设置了 ,Content-Length超出Struts2允许的最大值2G则抛出异常,异常信息包含filename字段会丢入OGNL表达式执行,POC如下:

\

漏洞原因:

\

上图中的代码先会判断请求的大小,当超过Struts2的默认数值2G时就会调用addFileSkeppedError函数,这个函数则会继续调用buildErrorMessage从而导致OGNL表达式远程代码执行。

(3)补丁分析

2.5.10.1版本的修复方案如下:

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

\

2.3.32版本的修复方案如下:

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

\

官方解决方案 官方表示,如果用户正在使用基于Jakarta的文件上传插件,建议升级至Struts版本3.32或2.5.10.1。 如果暂时不便升级,官方也已准备了两个可以作为应急使用的Jakarta插件版本,用户可以下载使用,链接地址如下:

https://github.com/apache/struts-extras

直接将jar包放在WEB-INF/libs目录下重启应用即可。

改用其他Multipart parser应用,比如Pell、Cos等解析器。具体更换操作如下:

以更换Cos为例,修改WEB-INF/classes目录的struts.xml文件,在struts节点下方添加

\

提示:修改文件解析器会影响文件上传功能,请在修改后对相关功能进行调试。

技术防护方案产品类 如果您不清楚是否受此漏洞影响: 公网资产可使用绿盟云 紧急漏洞在线检测,检测地址如下:

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12

2、内网资产可以使用绿盟科技的远程安全评估系统(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

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

使用绿盟科技防护类产品(IPS/IDS/NF/WAF)进行防护:

入侵防护系统(IPS)

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

入侵检测系统(IDS)

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

下一代防火墙系统(NF)

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

Web应用防护系统(WAF)

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

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

相关文章
最新文章
热点推荐