Web安全 - 文件上传漏洞(File Upload Vulnerability)

news2024/10/3 19:33:10

文章目录

  • OWASP 2023 TOP 10
  • 导图
  • 定义
  • 攻击场景
    • 1. 上传恶意脚本
    • 2. 目录遍历
    • 3. 覆盖现有文件
    • 4. 文件上传结合社会工程攻击
  • 防御措施
    • 1. 文件类型验证
    • 2. 文件名限制
    • 3. 文件存储位置
    • 4. 文件权限设置
    • 5. 文件内容检测
    • 6. 访问控制
    • 7. 服务器配置
  • 文件类型验证实现
    • Hutool的`FileTypeUtil`
    • 使用场景
    • Java代码实现:基于Hutool的Magic Number验证
    • 详细说明
      • Hutool的FileTypeUtil工作原理
      • 代码流程
      • 支持的文件类型
      • 防御措施分析
      • 文件上传防御流程
  • 组合攻击
    • 文件上传与路径穿越
    • 文件上传与代码注入
    • 文件上传与CSRF
  • 漏洞Code演示与修复
    • 存在文件上传漏洞的代码
    • 漏洞分析
    • 修复示例
  • 文件上传漏洞与其他常见漏洞的组合攻击
    • 文件上传漏洞 + 路径穿越
      • 攻击场景:绕过文件存储路径限制
      • 高级利用步骤
      • 防御措施
    • 文件上传漏洞 + 远程代码执行(RCE)漏洞
      • 攻击场景:利用脚本文件上传实现RCE
      • 高级利用步骤
      • 防御措施
    • 文件上传漏洞 + 跨站脚本(XSS)
      • 攻击场景:通过文件上传传播XSS攻击
      • 利用步骤
      • 防御措施
    • 文件上传漏洞 + CSRF
      • 攻击场景:利用CSRF强制上传恶意文件
      • 利用步骤
      • 防御措施
  • 组合漏洞Code : 路径穿越与远程代码执行(RCE)
    • 场景介绍
    • 问题代码
    • 漏洞分析
    • 利用步骤
    • 防御措施
    • 修复代码
    • 防御措施分析
    • 详细说明
      • 攻击原理
      • 防御机制

在这里插入图片描述

OWASP 2023 TOP 10

在这里插入图片描述

OWASP Top 10 概述

OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。

2023年OWASP Top 10 列表

在这里插入图片描述

主流防范措施

  1. Broken Access Control

    • 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
    • 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
  2. Cryptographic Failures

    • 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
    • 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
  3. Injection

    • 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
    • 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
  4. Insecure Design

    • 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
    • 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
  5. Security Misconfiguration

    • 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
    • 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
  6. Vulnerable and Outdated Components

    • 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
    • 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
  7. Identification and Authentication Failures

    • 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
    • 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
  8. Software and Data Integrity Failures

    • 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
    • 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
  9. Security Logging and Monitoring Failures

    • 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
    • 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
  10. Server-Side Request Forgery (SSRF)

    • 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
    • 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。

重点风险与防御措施建议

  1. Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。

  2. Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。

  3. Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。

  4. Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。

  5. SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。


导图

在这里插入图片描述


定义

文件上传漏洞是指Web应用允许用户上传文件,但没有对上传文件进行充分的验证和限制,导致攻击者可以上传恶意文件,如脚本、恶意代码等,进一步执行恶意操作。这种漏洞常见于文件管理、头像上传或文档管理等功能中。


攻击场景

文件上传漏洞有多种利用方式,攻击者可能会:

1. 上传恶意脚本

  • 攻击者上传一个恶意文件(例如PHP、ASP、JSP等),然后通过URL直接访问该文件,导致服务器执行其中的恶意代码。这是最常见的文件上传利用方式,尤其是在Web服务器允许解析用户上传的文件时。

2. 目录遍历

  • 攻击者可能通过上传文件并结合路径穿越漏洞,将文件保存到特定位置(例如Web可执行目录或系统目录),以进一步执行代码或操控服务器。

3. 覆盖现有文件

  • 通过上传文件覆盖系统中的重要文件,攻击者可能篡改配置文件、脚本或数据库配置,导致服务瘫痪或安全性失效。

4. 文件上传结合社会工程攻击

  • 攻击者上传看似无害的文件(如图像或PDF),诱骗其他用户下载并打开,实际包含恶意代码,导致用户系统感染恶意软件。

防御措施

为了防止文件上传漏洞,应采取多层次的防御措施:

1. 文件类型验证

  • 验证上传文件的MIME类型和文件扩展名,确保只允许上传预期的文件类型。
  • 然而,文件扩展名容易被伪装,应使用文件内容的签名(如Magic Number)进一步验证。

2. 文件名限制

  • 对上传的文件名进行严格限制,禁止使用特殊字符和文件路径符号(如../),以防止路径穿越攻击。
  • 文件名应进行随机化处理,防止攻击者通过猜测文件名进行操作。

3. 文件存储位置

  • 上传的文件应存储在安全的目录之外,不能直接通过Web服务器访问。例如,上传目录应放置在Web根目录之外,避免通过URL直接访问。
  • 如果必须存放在可访问的目录中,确保该目录不具有执行权限。

4. 文件权限设置

  • 上传的文件应设置为只读权限,并禁止脚本执行。
  • 利用操作系统的权限控制或设置Web服务器的目录权限来限制上传文件的访问范围。

5. 文件内容检测

  • 对上传文件进行内容审查,避免恶意代码注入。可以使用杀毒软件或基于规则的扫描器检查上传文件的安全性。

6. 访问控制

  • 限制文件上传功能仅供授权用户使用,并确保不同用户之间的文件操作隔离。
  • 上传后验证用户身份,确保文件仅能被合法的用户访问或处理。

7. 服务器配置

  • 在服务器配置层面禁用执行特定类型的文件(如PHP、JSP等),确保即使恶意脚本被上传,也无法被执行。
  • 在Nginx或Apache中,可以通过设置Content-Disposition头将文件强制下载,而不是直接在浏览器中执行。

文件类型验证实现

Hutool的FileTypeUtil

Hutool是一个功能强大的Java工具库,提供了丰富的工具类,简化了许多常见的Java开发任务。FileTypeUtil工具类能够根据文件的内容(Magic Number)自动判断文件类型,无需手动编写文件签名比对逻辑。

使用场景

通过Hutool的FileTypeUtil,可以直接读取文件头部字节,判断文件的真实类型,防止攻击者伪装文件扩展名上传恶意文件。


Java代码实现:基于Hutool的Magic Number验证

package com.artisan.fileVunl;

import cn.hutool.core.io.FileTypeUtil;
import java.io.File;
import java.io.IOException;
/**
 * @author 小工匠
 * @version 1.0
 * @date 2024/10/2 11:50
 * @mark: show me the code , change the world
 */


public class HutoolMagicNumberValidator {

    public static void main(String[] args) throws IOException {
        // 示例文件路径
        File file = new File("D:\\Blog\\006Xzox4gy1gdmmzfm2ioj303a03awem.jpg");

        // 调用Hutool的FileTypeUtil验证文件类型
        String fileType = FileTypeUtil.getType(file);

        if (isValidFileType(fileType)) {
            System.out.println("文件类型验证通过,文件类型是: " + fileType);
        } else {
            System.out.println("文件类型无效,上传被拒绝");
        }
    }

    /**
     * 根据文件类型判断是否为允许的类型
     */
    private static boolean isValidFileType(String fileType) {
        // 允许的文件类型,如JPEG、PNG和PDF
        return "jpg".equals(fileType) || "png".equals(fileType) || "pdf".equals(fileType);
    }
}

在这里插入图片描述

详细说明

Hutool的FileTypeUtil工作原理

FileTypeUtil.getType(File file)方法通过读取文件的前几个字节(文件头部的Magic Number),匹配Hutool库中已知的文件签名,然后返回文件的实际类型(如jpgpngpdf等)。

代码流程

  1. 读取文件:通过Hutool的FileTypeUtil读取文件内容,判断其实际类型。
  2. 验证文件类型:将文件类型与允许的类型列表进行比对,确保文件符合预期的类型。
  3. 输出验证结果:如果文件类型匹配,允许上传;否则,拒绝文件上传。

支持的文件类型

Hutool的FileTypeUtil支持多种常见文件类型,包括图片、文档、视频等,适用于多种文件上传场景的安全防护。


防御措施分析

  • 简化实现:Hutool封装了Magic Number验证逻辑,开发者无需手动维护文件签名列表,减少了代码复杂度。
  • 扩展性强:Hutool支持多种常见文件类型,可以根据项目需求进行扩展,适应复杂的文件上传场景。
  • 结合多层防御:在Magic Number验证基础上,依然可以结合文件扩展名和MIME类型的验证,提供多层次的防御。

文件上传防御流程

  • 第一步:文件扩展名验证:确保上传文件的扩展名符合预期。
  • 第二步:MIME类型验证:确保文件的MIME类型与扩展名和内容一致。
  • 第三步:Magic Number验证:利用Hutool的FileTypeUtil进一步确认文件内容的真实性,避免伪造文件上传。

组合攻击

文件上传与路径穿越

  • 如果文件上传功能存在路径穿越漏洞,攻击者可以通过操控上传路径,将恶意文件上传至特定目录(如Web根目录),从而直接通过URL访问并执行。

文件上传与代码注入

  • 在文件上传漏洞中,如果攻击者可以上传动态脚本文件(如PHP),他们可以利用该文件直接注入代码并执行,例如通过浏览器直接访问http://example.com/uploads/shell.php

文件上传与CSRF

  • 文件上传功能如果缺乏适当的CSRF保护,攻击者可以诱导受害者提交恶意上传请求,从而在服务器上上传恶意文件。

漏洞Code演示与修复

存在文件上传漏洞的代码

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Part filePart = request.getPart("file"); // 获取上传的文件
        String fileName = filePart.getSubmittedFileName();
        
        // 存储文件到服务器的目录
        File file = new File("/var/www/uploads/" + fileName);
        filePart.write(file.getAbsolutePath());
        response.getWriter().println("File uploaded successfully");
    }
}

漏洞分析

  • 没有验证文件类型和文件名,攻击者可以上传任意文件,如恶意脚本。
  • 文件直接存储在Web目录下,可能被直接访问和执行。

修复示例

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class SafeFileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        // 1. 验证文件扩展名
        if (!fileName.endsWith(".jpg") && !fileName.endsWith(".png")) {
            response.getWriter().println("Invalid file type");
            return;
        }

        // 2. 生成随机文件名,避免文件覆盖和预测
        String safeFileName = System.currentTimeMillis() + "_" + fileName;

        // 3. 文件存储在Web目录之外
        File uploadDir = new File("/var/uploads/");
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        File file = new File(uploadDir, safeFileName);
        filePart.write(file.getAbsolutePath());

        // 4. 设置文件权限为只读
        file.setReadable(true, true);
        file.setWritable(false, false);

        response.getWriter().println("File uploaded successfully");
    }
}

代码分析:

  1. 文件扩展名验证:只允许特定类型的文件(如.jpg.png)。
  2. 文件名随机化:使用时间戳生成唯一文件名,防止覆盖和预测。
  3. 文件存储在安全目录:避免直接存储在Web目录中,确保无法通过URL访问到文件。
  4. 权限设置:上传的文件被设置为只读,避免后续操作。

文件上传漏洞与其他常见漏洞的组合攻击

文件上传漏洞常常被攻击者用作攻击链中的一环。由于单一漏洞利用的效果可能有限,攻击者往往结合其他漏洞来扩大攻击影响范围,实现更高级的攻击目标。下面探讨几种常见的组合利用场景:

  • 路径穿越结合文件上传:绕过文件上传目录限制,访问或执行敏感位置的文件。
  • 远程代码执行(RCE)结合文件上传:通过上传并执行恶意文件实现远程控制。
  • 跨站脚本(XSS)结合文件上传:通过文件传播恶意脚本,跨站点执行攻击。
  • 跨站请求伪造(CSRF)结合文件上传:在不知情的情况下诱使用户上传恶意文件。

文件上传漏洞 + 路径穿越

攻击场景:绕过文件存储路径限制

在某些应用程序中,即使存在文件上传功能,文件通常会被限制在特定目录下,如/uploads,无法直接上传到服务器的关键目录。然而,结合路径穿越漏洞,攻击者可以通过构造恶意的文件路径来绕过这些限制,上传文件到敏感目录并执行恶意代码。

高级利用步骤

  1. 上传构造路径文件:攻击者上传文件时,在文件名中使用路径穿越符号,例如../../../../var/www/html/shell.php,尝试绕过目录限制。
  2. 利用路径穿越漏洞:服务器没有正确处理文件名或路径,导致文件实际存储在/var/www/html/目录中。
  3. 执行上传文件:通过URL直接访问http://example.com/shell.php,执行上传的PHP文件,从而进行远程代码执行。

防御措施

  • 严格验证文件路径,使用getCanonicalPath()检查文件的真实路径,防止路径穿越。
  • 限制上传目录,并确保该目录无执行权限。

文件上传漏洞 + 远程代码执行(RCE)漏洞

攻击场景:利用脚本文件上传实现RCE

最具破坏性的攻击之一是上传恶意脚本文件(如PHP、ASP或JSP文件),并通过直接访问这些文件来执行远程代码。文件上传漏洞允许上传任意类型的文件,而Web服务器将这些文件存储在可被Web访问的目录中,导致攻击者可以通过URL直接访问并执行这些文件。

高级利用步骤

  1. 上传恶意脚本文件:攻击者上传一个恶意的PHP脚本,如<?php system($_GET['cmd']); ?>,并将其存储在可访问的Web目录中。
  2. 触发代码执行:攻击者通过浏览器访问恶意文件并通过URL传递命令参数,如http://example.com/uploads/shell.php?cmd=whoami
  3. 获得服务器控制权:攻击者可以执行任何命令,获取服务器的敏感信息或进一步传播攻击。

防御措施

  • 禁止可执行脚本类型的文件上传,尤其是像.php.jsp.exe等危险文件。
  • 将上传目录设置为不可执行,防止服务器执行上传的文件。
  • 使用应用层的WAF(Web Application Firewall)过滤异常的请求模式。

文件上传漏洞 + 跨站脚本(XSS)

攻击场景:通过文件上传传播XSS攻击

攻击者可以通过上传包含恶意JavaScript代码的文件来进行XSS攻击。例如,攻击者上传一个包含恶意脚本的HTML文件或图片(通过伪装的文件名),并诱导其他用户访问该文件。浏览器解析这些文件时,可能执行其中的JavaScript代码,从而危害其他用户。

利用步骤

  1. 上传含有恶意脚本的文件:例如,攻击者上传一个伪装成图片的HTML文件,其中嵌入了恶意JavaScript,如<script>alert('XSS');</script>
  2. 诱导用户访问文件:攻击者通过诱骗手段,诱导其他用户访问此恶意文件的URL。
  3. 脚本执行:浏览器执行恶意JavaScript代码,导致用户的会话劫持、数据泄露或其他操作。

防御措施

  • 对上传文件的MIME类型进行严格校验,并使用内容检查工具确保文件的合法性。
  • 对上传文件名及其内容进行HTML转义,防止浏览器错误地解析文件中的恶意代码。

文件上传漏洞 + CSRF

攻击场景:利用CSRF强制上传恶意文件

跨站请求伪造(CSRF)攻击可以通过诱导用户在不知情的情况下上传恶意文件。例如,攻击者构造一个恶意链接或表单,诱骗受害者在登录状态下访问,从而自动触发文件上传请求,将恶意文件上传到服务器。

利用步骤

  1. 构造恶意表单:攻击者创建一个隐藏的表单,包含文件上传功能,并预置恶意文件(通过URL传递或base64编码等方式)。
  2. 诱导受害者点击:受害者在登录的情况下点击恶意链接或提交表单,不知不觉中上传恶意文件。
  3. 攻击者执行恶意文件:恶意文件被成功上传到服务器后,攻击者可以通过直接访问该文件进行进一步攻击。

防御措施

  • 为上传功能添加CSRF Token验证,确保上传请求只能由合法用户发起。
  • 限制文件上传功能的访问权限,只有经过授权的用户才能上传文件。
  • 结合验证码机制,确保用户交互的真实性,防止自动化攻击。

组合漏洞Code : 路径穿越与远程代码执行(RCE)

场景介绍

攻击场景:路径穿越与远程代码执行(RCE)的结合利用

攻击者上传恶意脚本文件(如PHP、JSP)并通过路径穿越漏洞将文件存放到Web服务器的可执行目录下,随后通过URL访问该恶意文件,实现远程代码执行,从而获得服务器控制权。


问题代码

这是一个存在文件上传漏洞路径穿越漏洞的示例代码,展示了如何利用这些漏洞进行攻击。

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@MultipartConfig
public class VulnerableFileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取上传文件的部分
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        // 路径穿越漏洞,攻击者可以通过文件名控制文件存储路径
        String uploadPath = "/var/www/uploads/" + fileName;

        // 将文件写入指定路径
        filePart.write(uploadPath);

        response.getWriter().println("File uploaded successfully to: " + uploadPath);
    }
}

漏洞分析

  • 路径穿越漏洞fileName来自用户的输入,未经过滤和验证,攻击者可以构造诸如../../webapps/ROOT/shell.jsp的文件名,从而将文件写入服务器的Web目录中。
  • 远程代码执行漏洞:上传恶意脚本文件后,攻击者可以通过URL直接访问该文件,从而执行恶意代码,例如http://example.com/shell.jsp

利用步骤

  1. 上传恶意文件:攻击者上传一个JSP文件(如shell.jsp),内容为:

    <%@ page import="java.io.*" %>
    <%
      String cmd = request.getParameter("cmd");
      Process p = Runtime.getRuntime().exec(cmd);
      OutputStream os = p.getOutputStream();
      InputStream in = p.getInputStream();
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
      String line = null;
      while ((line = reader.readLine()) != null) {
        out.println(line);
      }
    %>
    
  2. 路径穿越:上传的文件名为../../webapps/ROOT/shell.jsp,将文件存储到Tomcat服务器的Web可执行目录中。

  3. 远程执行命令:攻击者通过浏览器访问http://example.com/shell.jsp?cmd=whoami,远程执行命令并获得服务器权限。


防御措施

为了防止上述路径穿越与RCE漏洞,需要对代码进行修复和增强安全性:

修复代码

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@MultipartConfig
public class SecureFileUploadServlet extends HttpServlet {

    private static final String UPLOAD_DIR = "/var/uploads/";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取上传的文件部分
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        // 1. 验证文件名,防止路径穿越
        if (fileName.contains("..") || fileName.contains("/") || fileName.contains("\\")) {
            response.getWriter().println("Invalid file name.");
            return;
        }

        // 2. 验证文件类型,防止上传恶意脚本
        String mimeType = getServletContext().getMimeType(fileName);
        if (!isAllowedFileType(mimeType)) {
            response.getWriter().println("Invalid file type.");
            return;
        }

        // 3. 生成安全的文件名,避免文件名冲突和预测
        String safeFileName = System.currentTimeMillis() + "_" + fileName;

        // 4. 使用安全路径,将文件存储在不可执行的目录中
        Path uploadPath = Paths.get(UPLOAD_DIR + safeFileName);

        // 确保上传目录存在
        if (!Files.exists(uploadPath.getParent())) {
            Files.createDirectories(uploadPath.getParent());
        }

        // 将文件写入磁盘
        filePart.write(uploadPath.toString());

        response.getWriter().println("File uploaded successfully to: " + uploadPath);
    }

    private boolean isAllowedFileType(String mimeType) {
        return mimeType.equals("image/jpeg") || mimeType.equals("image/png") || mimeType.equals("application/pdf");
    }
}

防御措施分析

  1. 验证文件名:代码检查文件名是否包含路径穿越符号(如..),避免文件被上传到非预期目录。
  2. 文件类型验证:通过检查文件的MIME类型,确保只允许上传预期的文件类型,如图片或PDF,防止上传脚本文件。
  3. 文件名随机化:使用时间戳生成唯一文件名,避免文件覆盖和文件名预测攻击。
  4. 安全目录存储:将上传文件存储在不可执行的目录中,防止上传文件被直接执行。
  5. 限制文件访问:配置Web服务器禁止访问上传目录中的文件,或将上传目录存储在Web根目录之外。

详细说明

攻击原理

  • 路径穿越攻击:攻击者通过上传带有路径穿越符号的文件名(如../../webapps/ROOT/shell.jsp),将文件上传到服务器可执行目录中,从而获得远程执行权限。
  • 远程代码执行(RCE):上传的恶意文件是可执行脚本(如JSP),攻击者可以通过浏览器远程访问该文件并执行任意命令。

防御机制

  • 路径验证:通过检查文件名和路径,避免攻击者操控文件存储位置。
  • 文件类型限制:通过限制上传的文件类型,防止攻击者上传脚本文件。
  • 安全的文件存储:将上传文件存储在Web根目录之外,确保上传文件不会被直接访问和执行。
  • 文件权限设置:确保上传的文件目录没有执行权限,限制潜在的恶意操作。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32使用Keil5 在运行过程中不复位进入调试模式

一、选择Options for Target进入设置 二、选择所使用的调试器&#xff0c;这里以ST-Link为例。取消勾选Load Application at Startup 可以在进入调试模式的时候不会从新加载程序&#xff01;从而不破坏现场 三、点击Setting进入 四、取消勾选Reset after Connect 使得调试器连接…

探索 aMQTT:Python中的AI驱动MQTT库

文章目录 探索 aMQTT&#xff1a;Python中的AI驱动MQTT库背景介绍aMQTT是什么&#xff1f;如何安装aMQTT&#xff1f;简单库函数使用方法场景应用常见问题及解决方案总结 探索 aMQTT&#xff1a;Python中的AI驱动MQTT库 背景介绍 在物联网和微服务架构的浪潮中&#xff0c;MQ…

Redis:string类型

Redis&#xff1a;string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中&#xff0c;字符串string存储的是二进制&#xff0c;以byte为单位&#xff0c;输入的二进…

ICPC-day1(NTT)

NTT经典例题 CCPC-Winter-Camp-day6-A——NTT经典例题 对于上面格式&#xff0c;如果想求出每个i的值可以使用卷积求出&#xff0c;因为阶乘j和阶乘i-j相乘的值为(i(i-j))i 补充一个二次剩余定理 P5491 【模板】二次剩余 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //#in…

【MySQL】DML数据操作语句和基本的DQL语句

目录 一、Mysql对数据的增删改 1. 增加数据 2. 修改数据&#xff08;UPDATE语句&#xff09; 3. 删除 3.1 delete、truncate、drop区别 二、DQL语言&#xff08;重点&#xff09; 1. 单表查询 1.1 最简单的查询 1.2 从表中获取数据 1.3 字段名起别名 1.4 添加字段 1…

[20231103消息] 大模型商业化模式详解:烧钱之后如何挣钱?

距ChatGPT3.5发布已近一年&#xff0c;大模型狂热开始逐步降温&#xff1a;GPU禁运及长期烧钱的事实&#xff0c;让国内的大模型企业&#xff0c;不得不加速商业化考量。 目前&#xff0c;大模型的B端应用已经出现各种定价方法&#xff0c;包括按照时间段收费、按调用量收费以…

class 030 异或运算的骚操作

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Java中Map和Set详细介绍,哈希桶的实现

大家好呀&#xff0c;前一节我们接触了二叉搜索树&#xff0c;那么紧接着&#xff0c;我们要学习一种十分重要而且也是我们在初阶数据结构中接触的最后一种数据结构—Map和Set&#xff0c;本篇博客将会详细介绍两种数据结构&#xff0c;并且针对哈希表底层实现一个哈希桶&#…

基于元神操作系统实现NTFS文件操作(三)

1. 背景 本文主要介绍DBR的读取和解析&#xff0c;并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作&#xff0c;所以只解析了少量的部分&#xff0c;其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…

《数据结构》--链表【包含跳表概念】

不知道大家对链表熟悉还是陌生&#xff0c;我们秉着基础不牢&#xff0c;地动山摇的原则&#xff0c;会一点点的介绍链表的&#xff0c;毕竟链表涉及的链式存储也很重要的。在这之前&#xff0c;我们认识过顺序存储的顺序表&#xff0c;它其实就是一个特殊的数组。那链表到底是…

树莓派 AI 摄像头(Raspberry Pi AI Camera)教程

系列文章目录 前言 人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备&#xff0c;我们能够支持的原生应用范围也在不断扩大&#xff1b;但无论哪一代产品&#xff0c;总会有一些工作负载需要外部…

SpringBoot介绍及整合Mybatis Plus

目录 SpringBoot背景及特点 SpringBoot整合Mybatis Plus SpringBoot背景及特点 SpringBoot的设计目是抛弃之前Spring、SpringMVC繁杂的配置过程&#xff0c;简化开发过程。之前的Spring框架需要大量的手动配置&#xff0c;包括XML配置文件或Java配置类&#xff0c;配置过程繁…

深入理解 Git 一个开发者的必备工具

深入理解 Git 一个开发者的必备工具 演示地址 演示地址 获取更多 获取更多 在现代软件开发中&#xff0c;版本控制系统扮演着至关重要的角色。其中&#xff0c;Git 是最流行的选择之一。无论你是新手还是有经验的开发者&#xff0c;了解 Git 的基本概念和使用方法都能大大提…

YOLO v11实时目标检测3:训练数据集格式说明

一、Yolov11简介 YOLOv11 是 YOLO 系列的最新版本&#xff0c;它不仅在目标检测方面表现出色&#xff0c;还引入了对象分割和多目标跟踪的功能。本文将介绍如何使用 YOLOv11 进行人流统计、车流统计以及跟踪的实际应用。 二、Yolo v11训练数据集格式说明 2.1 数据组织&#…

SAT分离轴定理的c++/python实现

分离轴定理的c/python实现 现在要对BEV模型检查出来的车辆做NMS&#xff0c;把3d框的平面属性获取到后&#xff0c;配合旋转角度投影到地面就是2D图形。 开始碰撞检测&#xff0c;判断是否重叠&#xff0c;保留置信度高的框就行。 原理 分离轴定理&#xff08;Separating A…

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录 前言 实现效果 支持方向变换 修改默认效果 如何修改 总结 前言 我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动&#xff0c;本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。 实现效果 上图是我们希望实现的效果&#xff0c;我们可以自发地控…

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 具体请联系作者 项目结构 项目流程图 技术栈 项目结构 项目路由 4. 项目模型 项目初始化 初始化项目文…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想&#xff0c;是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素&#xff0c;可以把n个元素看作n个有序表&#xff0c;把它们两…

Java中数据转换以及字符串的“+”操作

隐式转换&#xff08;自动类型转换&#xff09; 较小范围的数据类型转成较大范围的数据类型 强制转换&#xff08;显式转换&#xff09; 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型&#xff08;如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程&#xff0c;代码共享&#xff0c;不作写入操作时&#xff0c;数据也是共享的&#xff0c;当任意一方试图写入&#xff0c;便通过写时拷…