插件窝 干货文章 Struts2-057 两个版本RCE漏洞实例分析

Struts2-057 两个版本RCE漏洞实例分析

漏洞 namespace Struts 表达式 408    来源:    2025-04-25

Struts2-057 RCE漏洞实例分析

漏洞概述

Struts2-057 (CVE-2018-11776)是Apache Struts2框架中存在的一个远程代码执行漏洞,影响多个Struts2版本。该漏洞源于框架对某些URL处理不当,导致攻击者可以构造恶意请求执行任意命令。

受影响版本

  • Struts 2.3 - Struts 2.3.34
  • Struts 2.5 - Struts 2.5.16

漏洞原理

该漏洞主要存在于Struts2的namespace处理机制中,当满足以下条件时可能被利用: 1. 未设置namespace值,或使用通配符namespace 2. 上层动作配置中未设置或使用通配符namespace 3. 上层动作配置中未设置<result>元素或使用通配符

攻击者可以通过构造特殊的URL,利用OGNL表达式注入实现远程代码执行。

漏洞复现

环境搭建

  1. 下载受影响版本的Struts2 (如2.3.34或2.5.16)
  2. 部署一个简单的Struts2应用

漏洞利用示例

示例1: 基本利用

构造恶意URL:

http://target.com/struts2-showcase/${(#_memberAccess['allowStaticMethodAccess']=true,#a=@java.lang.Runtime@getRuntime().exec('calc')).action

示例2: 带命名空间的利用

如果应用使用了命名空间,可以这样构造:

http://target.com/namespace/${(#_memberAccess['allowStaticMethodAccess']=true,#a=@java.lang.Runtime@getRuntime().exec('id')).action

漏洞分析

  1. 请求处理流程:

    • Struts2处理请求时,会解析URL中的namespace和action名称
    • 当namespace处理不当,用户输入会被直接解析为OGNL表达式
  2. OGNL注入点:

    • 漏洞允许将恶意OGNL表达式注入到namespace或action名称中
    • 通过OGNL表达式可以访问Java运行时环境
  3. 安全绕过:

    • 通过_memberAccess['allowStaticMethodAccess']=true绕过安全限制
    • 然后可以调用Runtime.exec()等危险方法

修复方案

  1. 官方补丁:

    • 升级到Struts 2.3.35或Struts 2.5.17及以上版本
  2. 临时缓解措施:

    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    
  3. 安全配置建议:

    • 避免使用通配符配置
    • 明确指定namespace和action名称
    • 限制OGNL表达式的执行权限

检测方法

  1. 使用漏洞扫描工具检测
  2. 检查Struts2版本号
  3. 尝试构造无害的探测请求,如执行echo命令

总结

Struts2-057漏洞再次暴露了框架对用户输入处理不当的问题。作为开发人员,应及时关注安全公告,定期更新框架版本,并遵循安全最佳实践来配置Web应用。