Struts2 S2-057漏洞环境搭建及漏洞分析
字数 1565 2025-08-18 11:38:48

Apache Struts2 S2-057漏洞分析与环境搭建指南

1. 漏洞概述

漏洞编号: CVE-2018-11776 (S2-057)
漏洞类型: 远程代码执行(RCE)
报告日期: 2018年8月23日
报告者: Semmle Security Research team

受影响版本

  • Struts 2.0.4 - 2.3.34
  • Struts 2.5.0 - 2.5.16

2. 漏洞原理

触发条件

  1. XML配置不当:

    • 定义XML配置时namespace值未设置
    • 且上层动作配置(Action Configuration)中未设置或用通配符namespace
  2. URL标签配置不当:

    • url标签未设置value和action值
    • 且上层动作未设置或用通配符namespace

根本原因

当满足上述条件时,攻击者可以通过构造特殊的OGNL表达式实现远程代码执行,主要发生在URL重定向过程中对namespace的处理不当。

3. 漏洞环境搭建

3.1 准备工作

  1. 下载源码:

    git clone https://github.com/apache/Struts.git
    
  2. 切换到漏洞版本分支:

    git checkout STRUTS_2_5_10
    
  3. 提取展示应用:

    • src/apps/showcase整个文件夹拷贝出来
    • 新建一个Maven项目
  4. 导入项目:

    • 使用IDEA或Eclipse导入该Maven项目

3.2 配置修改

修改src/main/resources/struts-actionchaining.xml文件内容为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="actionchaining" extends="struts-default">
        <action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
            <result type="redirectAction">
                <param name="actionName">register2</param>
            </result>
        </action>
    </package>
</struts>

4. 漏洞验证

4.1 测试URL

访问以下URL验证漏洞是否存在:

http://localhost:8080/struts2-showcase/%24{1+2}/actionChain1.action

4.2 预期结果

如果漏洞存在,系统会将URL重定向到:

http://localhost:8080/struts2-showcase/3/register2.action

这表明OGNL表达式${1+2}已被成功执行并计算出结果3。

5. 漏洞分析

5.1 关键处理流程

  1. 请求处理入口:

    • 请求首先由DefaultActionInvocation.java处理
  2. 结果类型处理:

    • 由于配置文件中<result>标签的type是redirectAction
    • 对应处理类为org.apache.struts2.result.ServletActionRedirectResult
  3. namespace处理:

    • 当namespace为null时,系统会将URL中的OGNL表达式部分赋值给namespace
    • 例如将${1+2}赋值给namespace
  4. OGNL表达式执行:

    • StrutsResultSupport的execute方法中
    • 对location值/${1+2}/register2.action中的OGNL表达式进行解析
    • 最终得到/3/register2.action

5.2 调试方法

  1. 设置断点:

    • ServletActionRedirectResult.execute()方法处设置断点
  2. 跟踪流程:

    • 观察namespace的赋值过程
    • 跟踪location值的处理过程
    • 观察OGNL表达式的执行过程

6. 防御措施

  1. 升级框架版本:

    • 升级到Struts官方发布的最新修复版本
  2. 配置检查:

    • 确保所有XML配置中namespace都有明确定义
    • 避免使用通配符namespace
    • 确保url标签设置了value和action值
  3. 输入验证:

    • 对用户输入进行严格的验证和过滤
    • 防止OGNL表达式注入

7. 相关资源

  1. 官方安全公告: Apache Struts官方发布的安全公告
  2. 详细分析: FreeBuf详细分析文章
  3. EXP参考: GitHub上的EXP示例

8. 总结

S2-057漏洞是一个严重的远程代码执行漏洞,主要由于Struts2框架对namespace处理不当导致OGNL表达式注入。通过搭建特定环境、分析处理流程,可以深入理解该漏洞的原理和利用方式。及时升级框架版本和合理配置是防御此类漏洞的关键措施。

Apache Struts2 S2-057漏洞分析与环境搭建指南 1. 漏洞概述 漏洞编号 : CVE-2018-11776 (S2-057) 漏洞类型 : 远程代码执行(RCE) 报告日期 : 2018年8月23日 报告者 : Semmle Security Research team 受影响版本 Struts 2.0.4 - 2.3.34 Struts 2.5.0 - 2.5.16 2. 漏洞原理 触发条件 XML配置不当 : 定义XML配置时namespace值未设置 且上层动作配置(Action Configuration)中未设置或用通配符namespace URL标签配置不当 : url标签未设置value和action值 且上层动作未设置或用通配符namespace 根本原因 当满足上述条件时,攻击者可以通过构造特殊的OGNL表达式实现远程代码执行,主要发生在URL重定向过程中对namespace的处理不当。 3. 漏洞环境搭建 3.1 准备工作 下载源码 : 切换到漏洞版本分支 : 提取展示应用 : 将 src/apps/showcase 整个文件夹拷贝出来 新建一个Maven项目 导入项目 : 使用IDEA或Eclipse导入该Maven项目 3.2 配置修改 修改 src/main/resources/struts-actionchaining.xml 文件内容为: 4. 漏洞验证 4.1 测试URL 访问以下URL验证漏洞是否存在: 4.2 预期结果 如果漏洞存在,系统会将URL重定向到: 这表明OGNL表达式 ${1+2} 已被成功执行并计算出结果3。 5. 漏洞分析 5.1 关键处理流程 请求处理入口 : 请求首先由 DefaultActionInvocation.java 处理 结果类型处理 : 由于配置文件中 <result> 标签的type是 redirectAction 对应处理类为 org.apache.struts2.result.ServletActionRedirectResult namespace处理 : 当namespace为null时,系统会将URL中的OGNL表达式部分赋值给namespace 例如将 ${1+2} 赋值给namespace OGNL表达式执行 : 在 StrutsResultSupport 的execute方法中 对location值 /${1+2}/register2.action 中的OGNL表达式进行解析 最终得到 /3/register2.action 5.2 调试方法 设置断点 : 在 ServletActionRedirectResult.execute() 方法处设置断点 跟踪流程 : 观察namespace的赋值过程 跟踪location值的处理过程 观察OGNL表达式的执行过程 6. 防御措施 升级框架版本 : 升级到Struts官方发布的最新修复版本 配置检查 : 确保所有XML配置中namespace都有明确定义 避免使用通配符namespace 确保url标签设置了value和action值 输入验证 : 对用户输入进行严格的验证和过滤 防止OGNL表达式注入 7. 相关资源 官方安全公告 : Apache Struts官方发布的安全公告 详细分析 : FreeBuf详细分析文章 EXP参考 : GitHub上的EXP示例 8. 总结 S2-057漏洞是一个严重的远程代码执行漏洞,主要由于Struts2框架对namespace处理不当导致OGNL表达式注入。通过搭建特定环境、分析处理流程,可以深入理解该漏洞的原理和利用方式。及时升级框架版本和合理配置是防御此类漏洞的关键措施。