首页 > 其他分享 >文件上传漏洞 原理利用防御实战

文件上传漏洞 原理利用防御实战

时间:2024-01-10 14:02:54浏览次数:27  
标签:实战 文件 请求 漏洞 File 服务器 import 上传

文件上传漏洞 原理利用防御实战_文件上传

原理

1、文件上传(File Upload)是大部分Web应用都具备的功能,例如用户上传附 件、修改头像、分享图片/视频等

2、正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储, 需要的时候再调用出来返回

3、如果恶意文件如PHP、ASP等执行文件绕过Web应用,并顺利执行,则相当 于黑客直接拿到了Webshell

4、一旦黑客拿到Webshell,则可以拿到Web应用的数据,删除Web文件,甚至本地提权,进一步拿下整个服务器甚至内网渗tou

5、SQL注入公鸡的对象是数据库服务,文件上传漏洞主要公鸡Web服务,实际 渗tou过程一般结合起来,达到对目标服务的深度控制 

深入原理:

文件上传的原理是客户端将文件数据通过HTTP协议POST请求发送到服务器,服务器接收到请求后,解析请求头和请求体,从请求体中获取文件数据并保存到服务器本地磁盘上。具体步骤如下:

1.客户端通过form表单将文件数据封装成HTTP请求发送到服务器。

2.服务器接收到请求后,解析请求头和请求体。

3.从请求体中获取文件数据。

4.将文件数据保存到服务器本地磁盘上。

以下是一个Java Servlet文件上传的例子:

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String UPLOAD_DIRECTORY = "uploads";
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            PrintWriter writer = response.getWriter();
            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
            writer.flush();
            return;
        }

        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(MAX_FILE_SIZE);
        upload.setSizeMax(MAX_REQUEST_SIZE);

        // 构造服务器本地保存路径
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;

        // 创建保存路径目录
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        try {
            // 解析请求的内容提取文件数据
            List<FileItem> formItems = upload.parseRequest(request);
            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;                        File storeFile = new File(filePath);

                        // 在控制台输出文件的上传路径
                        System.out.println(filePath);

                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message", "文件上传成功!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "错误信息: " + ex.getMessage());
        }
        // 跳转到结果页面
        getServletContext().getRequestDispatcher("/result.jsp").forward(request, response);
    }
}

低安全级别

选择低安全级别 

文件上传漏洞 原理利用防御实战_Web_02

访问文件上传页面

上传图片或者文本文件

文件上传漏洞 原理利用防御实战_Web_03

上传测试图片

文件上传漏洞 原理利用防御实战_文件上传_04

上传成功

文件上传漏洞 原理利用防御实战_Web_05

文件上传漏洞 原理利用防御实战_文件上传_06

分析文件上传后台代码

文件上传漏洞 原理利用防御实战_文件上传_07

低安全级别的文件上传(后台)代码,没有做任何的安全过滤,

包括文件类型、文件后缀、大小等等 


文件上传漏洞利用

上传超大型文件

消耗服务器资源 

文件上传漏洞 原理利用防御实战_Web_08

之前查看后台代码,没有做任何限制的,为什么 这里不给上传呢?既然后台没有做限制,那么应 该是前端代码做了限制 

文件上传漏洞 原理利用防御实战_文件上传_09

绕过前端限制有N多种方法,可以直接在浏览器 插件通过firebug修改value值,也可以通过burp拦 截POST修改之后再发送 

文件上传漏洞 原理利用防御实战_文件上传_10

文件上传漏洞 原理利用防御实战_java_11

文件上传漏洞 原理利用防御实战_Web_12

上传Webshell(挂马)


标签:实战,文件,请求,漏洞,File,服务器,import,上传
From: https://blog.51cto.com/zhuzhuxia/9179342

相关文章

  • 运维架构实战操作
    1、K8s最佳实践Kubernetes-Rancher2.x持续交付与自动化运维2、MySQL8.0DBA存储架构+存储引擎+SQL优化+InnoDB的存储架构3、企业级Elasticsearch8.X技术来临!性能优化与集群部署基础与进阶全面实战4、Nginx通过Lua+Redis实现WAF动态封禁IP5、运维必备的MySQL+Python运维实战课程6......
  • uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化
    目录Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能,uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好,用Recorder插件可避免这些问题。DCloud插件市场下载插......
  • 实战-Docker 安装 Nginx
    使用Docker命令安装镜像官方文档:https://hub.docker.com/_/nginxmkdir-p/root/apps/nginxmkdir-p/opt/nginx/confdockerrun-d\--namenginx\-p80:80\-p443:443\-v/root/apps/nginx:/usr/share/nginx/html\-v/opt/nginx/conf:/etc/nginx/......
  • 实战-Docker 安装 MySQL
    使用Docker命令安装镜像官方文档:https://hub.docker.com/_/mysqlrm-rf/opt/mysqlmkdir-p/opt/mysql/data/opt/mysql/init/opt/mysql/confdockerrun-d\--namemysql\-p3306:3306\-eTZ=Asia/Shanghai\-eMYSQL_ROOT_PASSWORD=123456\-v/o......
  • 袋鼠云数栈UI5.0设计实战|B端表单这样设计,不仅美观还提效
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:大喜相关文章:袋鼠云出品!数栈UI5.0全新体验升级,设计背后的故事前言表单是B端产品中最常见的组件之一,主要⽤于数据收集、校验和提交......
  • 《PySpark大数据分析实战》-11.Spark on YARN模式安装Hadoop
    ......
  • AWS Simple Email Service (SES) 实战指南
    AmazonSimpleEmailService(SES)是一项强大的电子邮件发送服务,适用于数字营销、应用程序通知以及事务性邮件。在这个实战指南中,我们将演示如何设置AWSSES并通过几个示例展示其用法。设置AWSSES1.创建AWS账户首先,您需要创建一个AWS账户并登录AWS管理控制台。2.访问......
  • 程序员必知!组合模式的实战应用与案例分析
    组合模式是一种设计模式,允许将对象组合成树形结构并像单个对象一样使用它们,这种模式在处理类似公司组织结构这样的树形数据时非常有用,通过组合模式,我们可以将公司和部门视为同一类型的对象,从而以统一的方式处理发送给不同层级的请求或任务,叶节点是没有子节点的对象,而复合节点则包......
  • 【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据
    Mybatis是什么Mybatis是一个基于JDBC实现的,支持普通SQL查询、存储过程和高级映射的优秀持久层框架,去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。Mybatis主要思想是将程序中大量的SQL语句剥离出来,配置在配置文件中,以实现SQL的灵活配置。在所有ORM框......
  • 程序员必知!代理模式的实战应用与案例分析
    代理模式是在不改变原对象基础上,通过代理对象控制访问并添加额外操作,以销售代表和助理为例,助理作为代理对象,处理邮件、数据等琐碎工作,使销售代表能专注于与客户面对面交流推销,代理模式让原对象功能得以扩展,同时保持其对外接口的透明性。定义代理模式提供了一种在不改变原有对......