重磅 | Struts2 S2-048远程代码执行漏洞分析报告

2018-04-11 10:03:09 浏览数 (1)

Struts2 S2-048

远程代码执行漏洞分析报告

安全通告

尊敬的客户:

2017年7月7日,Struts2官方公布最新的Struts2远程代码执行漏洞S2-048,在一定条件下,该漏洞允许攻击者远程执行代码。安恒信息应急响应中心启动“黄色”预警预案。

目前,安恒信息的WAF、玄武盾都已升级检测规则,可以有效防护该漏洞。网站安全监测平台、Web应用弱点扫描器、远程安全评估系统和等级保护安全检查工具箱也已升级,可以检测该漏洞,建议上述产品用户尽快将规则库升级到最新版本。

安恒信息已经开发出漏洞检查工具,下载链接:

http://pan.baidu.com/s/1jIdx62U

安恒信息应急响应中心将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。

安恒信息应急响应中心

2017年7月7日

漏洞信息

1. 漏洞描述

Struts2 是 Apache 软件基金会负责维护的一个基于MVC设计模式的 Web 应用框架开源项目。

当开发人员在Struts2开发框架中使用插件 “Struts1”,且该插件允许应用使用Struts 1的Actions 和 ActionForms ,此时如果将请求参数值作为构建 ActionMessage 对象的内容,直接返回给用户,则可能产生远程代码执行漏洞。

2. 漏洞危害

3. 影响版本

Strut2.3.x

4. 漏洞利用前置条件

必须使用Struts-core-1.x.x.jar插件,且ActionMessage类的key属性可控。

5. 风险等级

安恒信息应急响应中心将此漏洞安全风险定级为: 高危

6. 漏洞分析

Struts2.3.x中showcase.war中存在一个名为“SaveGangsterAction.java”类,这个类实现了Struts2中的Struts1.x-core.jar插件中的Action,如下图:

直接将HTTP POST中的name参数值作为key传给ActionMessage类,其中ActionMessage中的key就可以被控制。

接下来会调用org.apache.struts2.s1.Struts1Action的public String execute() throws Exception,方法如下图:

调用com.opensymphony.xwork2.ActionSupport的getText(String aTextName)的方法来获取对象的错误消息。

再调用com.opensymphony.xwork2.util.LocalizedTextUtil中以下方法private static GetDefaultMessageReturnArg getDefaultMessage(String key, Locale locale, ValueStack valueStack, Object[] args, String defaultMessage)方法来调用ognl获取对应的错误消息。

具体的函数调用栈如下:

7. 漏洞自查

用户可通过以下方法进行漏洞自查:

在请求参数中加入如下代码

${#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('test','test')}

如在Response Header中出现test:test字段,则表示存在漏洞。

修复建议

1. 官方补丁

目前 Apache 官方暂未发布官方补丁。

2. 临时缓解措施

方法一

停用 showcase.war

方法二

开发者通过使用 resource keys 替代将原始消息直接传递给 ActionMessage 的方式。 如下所示:

messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));

请不要使用如下的方式

messages.add("msg", new ActionMessage("Gangster " gform.getName() " was added"));

方法三

安恒信息玄武盾产品可对该漏洞防护,如有需求可与我们联系并快速接入。

- END -

0 人点赞