Apache Struts 2 远程代码执行 (CVE-2018-11776)漏洞分析
字数 1601 2025-08-18 11:38:41

Apache Struts 2 远程代码执行漏洞(CVE-2018-11776)深度分析

一、漏洞概述

CVE编号: CVE-2018-11776
漏洞类型: 远程代码执行(RCE)
影响版本:

  • Struts 2.3 - Struts 2.3.34
  • Struts 2.5 - Struts 2.5.16

安全等级: 危急(Critical)
发现者: Semmle安全研究团队的Man Yue Mo

二、漏洞背景

Apache Struts是一个广泛使用的开源MVC框架,用于使用Java开发Web应用程序。该漏洞存在于Struts的核心处理机制中,允许攻击者通过精心构造的URL执行任意代码。

三、漏洞原理

关键触发条件

  1. 命名空间处理缺陷:

    • 当上层action中"namespace"值为空或使用通配符("/*")时
    • 配置struts.mapper.alwaysSelectFullNamespace = true
  2. 重定向配置:

    • 在struts配置文件中使用<result type="redirectAction">

漏洞触发流程

  1. 请求处理阶段:

    • DefaultActionMapper调用parseNameAndNamespace()解析URL
    • alwaysSelectFullNamespace=true时,namespace值可通过URI控制
  2. 重定向执行阶段:

    • ServletActionRedirectResult调用execute()进行重定向
    • 通过ActionMapper.getUriFromActionMapping()重新定义namespace和name
    • 使用setLocation()将带namespace的location放入StrutsResultSupport
  3. OGNL表达式执行:

    • StrutsResultSupport通过TextParseUtil.translateVariables()
    • 调用OgnlTextParser.evaluate()解释执行URL中的OGNL表达式

四、环境搭建与验证

环境配置

  1. 修改struts核心配置文件struts-actionchaining.xml:

    • 不设置namespace值
    • 配置重定向action
  2. 在ActionChain1中添加execute调试方法

漏洞验证

  1. 构造恶意URL:

    http://localhost:8080/struts2-showcase/${(333+333)}/actionChain1.action
    
    • OGNL表达式${(333+333)}将被执行
  2. 执行结果:

    • 跳转到指定action页面register2
    • 使用特定payload可弹出计算器

五、修复建议

  1. 官方修复方案:

    • 升级到Struts 2.3.35或Struts 2.5.17
    • 官方补丁已解决向后兼容性问题
  2. 临时缓解措施:

    • 设置struts.mapper.alwaysSelectFullNamespace=false
    • 避免使用通配符namespace配置
    • 限制重定向action的使用

六、参考资源

  1. Apache官方公告:
    https://cwiki.apache.org/confluence/display/WW/S2-057

  2. 技术分析:
    https://lgtm.com/blog/apache_struts_CVE-2018-11776

七、扩展知识

OGNL表达式注入

OGNL(Object-Graph Navigation Language)是Struts中使用的表达式语言,该漏洞本质上是由于对用户输入的OGNL表达式未做充分过滤导致的代码执行。

攻击面分析

攻击者可通过构造恶意URL实现:

  • 远程代码执行
  • 服务器敏感信息泄露
  • 服务器完全控制

历史相关漏洞

该漏洞与Struts历史上多个RCE漏洞(S2-045, S2-052等)类似,都是由于OGNL表达式注入导致的安全问题。

Apache Struts 2 远程代码执行漏洞(CVE-2018-11776)深度分析 一、漏洞概述 CVE编号 : CVE-2018-11776 漏洞类型 : 远程代码执行(RCE) 影响版本 : Struts 2.3 - Struts 2.3.34 Struts 2.5 - Struts 2.5.16 安全等级 : 危急(Critical) 发现者 : Semmle安全研究团队的Man Yue Mo 二、漏洞背景 Apache Struts是一个广泛使用的开源MVC框架,用于使用Java开发Web应用程序。该漏洞存在于Struts的核心处理机制中,允许攻击者通过精心构造的URL执行任意代码。 三、漏洞原理 关键触发条件 命名空间处理缺陷 : 当上层action中"namespace"值为空或使用通配符("/* ")时 配置 struts.mapper.alwaysSelectFullNamespace = true 时 重定向配置 : 在struts配置文件中使用 <result type="redirectAction"> 漏洞触发流程 请求处理阶段 : DefaultActionMapper 调用 parseNameAndNamespace() 解析URL 当 alwaysSelectFullNamespace=true 时,namespace值可通过URI控制 重定向执行阶段 : ServletActionRedirectResult 调用 execute() 进行重定向 通过 ActionMapper.getUriFromActionMapping() 重新定义namespace和name 使用 setLocation() 将带namespace的location放入 StrutsResultSupport OGNL表达式执行 : StrutsResultSupport 通过 TextParseUtil.translateVariables() 调用 OgnlTextParser.evaluate() 解释执行URL中的OGNL表达式 四、环境搭建与验证 环境配置 修改struts核心配置文件 struts-actionchaining.xml : 不设置namespace值 配置重定向action 在ActionChain1中添加execute调试方法 漏洞验证 构造恶意URL: OGNL表达式 ${(333+333)} 将被执行 执行结果: 跳转到指定action页面register2 使用特定payload可弹出计算器 五、修复建议 官方修复方案 : 升级到Struts 2.3.35或Struts 2.5.17 官方补丁已解决向后兼容性问题 临时缓解措施 : 设置 struts.mapper.alwaysSelectFullNamespace=false 避免使用通配符namespace配置 限制重定向action的使用 六、参考资源 Apache官方公告: https://cwiki.apache.org/confluence/display/WW/S2-057 技术分析: https://lgtm.com/blog/apache_ struts_ CVE-2018-11776 七、扩展知识 OGNL表达式注入 OGNL(Object-Graph Navigation Language)是Struts中使用的表达式语言,该漏洞本质上是由于对用户输入的OGNL表达式未做充分过滤导致的代码执行。 攻击面分析 攻击者可通过构造恶意URL实现: 远程代码执行 服务器敏感信息泄露 服务器完全控制 历史相关漏洞 该漏洞与Struts历史上多个RCE漏洞(S2-045, S2-052等)类似,都是由于OGNL表达式注入导致的安全问题。