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. 漏洞原理
触发条件
-
XML配置不当:
- 定义XML配置时namespace值未设置
- 且上层动作配置(Action Configuration)中未设置或用通配符namespace
-
URL标签配置不当:
- url标签未设置value和action值
- 且上层动作未设置或用通配符namespace
根本原因
当满足上述条件时,攻击者可以通过构造特殊的OGNL表达式实现远程代码执行,主要发生在URL重定向过程中对namespace的处理不当。
3. 漏洞环境搭建
3.1 准备工作
-
下载源码:
git clone https://github.com/apache/Struts.git -
切换到漏洞版本分支:
git checkout STRUTS_2_5_10 -
提取展示应用:
- 将
src/apps/showcase整个文件夹拷贝出来 - 新建一个Maven项目
- 将
-
导入项目:
- 使用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 关键处理流程
-
请求处理入口:
- 请求首先由
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表达式注入。通过搭建特定环境、分析处理流程,可以深入理解该漏洞的原理和利用方式。及时升级框架版本和合理配置是防御此类漏洞的关键措施。