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执行任意代码。
三、漏洞原理
关键触发条件
-
命名空间处理缺陷:
- 当上层action中"namespace"值为空或使用通配符("/*")时
- 配置
struts.mapper.alwaysSelectFullNamespace = true时
-
重定向配置:
- 在struts配置文件中使用
<result type="redirectAction">
- 在struts配置文件中使用
漏洞触发流程
-
请求处理阶段:
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:
http://localhost:8080/struts2-showcase/${(333+333)}/actionChain1.action- OGNL表达式
${(333+333)}将被执行
- OGNL表达式
-
执行结果:
- 跳转到指定action页面register2
- 使用特定payload可弹出计算器
五、修复建议
-
官方修复方案:
- 升级到Struts 2.3.35或Struts 2.5.17
- 官方补丁已解决向后兼容性问题
-
临时缓解措施:
- 设置
struts.mapper.alwaysSelectFullNamespace=false - 避免使用通配符namespace配置
- 限制重定向action的使用
- 设置
六、参考资源
七、扩展知识
OGNL表达式注入
OGNL(Object-Graph Navigation Language)是Struts中使用的表达式语言,该漏洞本质上是由于对用户输入的OGNL表达式未做充分过滤导致的代码执行。
攻击面分析
攻击者可通过构造恶意URL实现:
- 远程代码执行
- 服务器敏感信息泄露
- 服务器完全控制
历史相关漏洞
该漏洞与Struts历史上多个RCE漏洞(S2-045, S2-052等)类似,都是由于OGNL表达式注入导致的安全问题。