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

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

image.png


原理

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);
    }
}

低安全级别

选择低安全级别  

image.png

访问文件上传页面

上传图片或者文本文件

image.png

上传测试图片

image.png

上传成功

image.png

image.png

分析文件上传后台代码

image.png

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

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

文件上传漏洞利用

上传超大型文件

消耗服务器资源

image.png

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

image.png

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

image.png

image.png

image.png


上传Webshell(挂马)




相关文章
|
安全 Java API
解决 Swagger API 未授权访问漏洞:完善分析与解决方案
Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面,让开发者可以更方便地查看和测试 API 接口。然而,在一些情况下,未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 Swagger API 未授权访问漏洞问题。
|
SQL 监控 druid
Druid未授权访问 漏洞复现
Druid未授权访问 漏洞复现
16011 0
|
11月前
|
Web App开发 JavaScript 前端开发
XSS利器之BeEF
XSS利器之BeEF
|
11月前
|
安全 Ubuntu Unix
一文带你了解OpenVAS扫描器使用
一文带你了解OpenVAS扫描器使用
|
5月前
|
Ubuntu 安全 Docker
Ubuntu下部署及操作Docker技巧
以上就是在Ubuntu下部署及操作Docker的具体步骤。但这只是冰山一角,Docker的魅力远不仅如此。你可以将其视为存放各种工具的小箱子,随时随地取用,极大地提升工作效率。你也可以私人订制,适应不同的开发环境,就像一个拥有各种口味冰淇淋的冰箱,满足各种各样的需求。好了,现在你已经掌握了基本的Docker运用技巧,快去尝试使用吧!记住,沉浸在探索中,你会找到无尽的乐趣和满满的收获。
277 23
|
存储 安全 JavaScript
|
11月前
|
安全 虚拟化 数据中心
VMware
VMware
450 3
|
监控 安全 JavaScript
对跨站脚本攻击(XSS)的防御策略?
【8月更文挑战第15天】
1056 1
|
安全 前端开发 PHP
EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施
通过本文,我们深入探讨了文件上传漏洞攻击的多种案例和防范措施,以及在搭建攻击靶场时的实际操作。从前端和后端的校验漏洞,到利用Apache配置文件和文件包含漏洞的攻击方式,每一步都展示了安全防护的重要性。 在学习和实践过程中,我们不仅仅关注如何进行攻击,更着重于如何保护自己的服务器免受此类攻击。我们使用了EdgeOne作为一个解决方案的示例,展示了如何利用其提供的防护规则来有效防御文件上传漏洞。 无论是在靶场搭建过程中的细节操作,还是在攻击案例的分析过程中,安全意识和防护措施的实施都显得至关重要。通过本文,希望读者能够更深入地理解和应用这些安全原则,以保护自己的网络和服务器免受攻击的威胁。
|
存储 安全 Java
【Shiro】Apache Shiro 默认密钥致命令执行漏洞(CVE-2016-4437)的解决方案
【Shiro】Apache Shiro 默认密钥致命令执行漏洞(CVE-2016-4437)的解决方案
1398 0