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

文章目录

  • 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和PDFreturn "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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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/";@Overrideprotected 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.mzph.cn/news/881166.shtml

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

相关文章

计算机网络:计算机网络体系结构 —— OSI 模型 与 TCP/IP 模型

文章目录 计算机网络体系结构OSI 参考模型TCP/IP 参考模型分层的必要性物理层的主要问题数据链路层的主要问题网络层的主要问题运输层的主要问题应用层的主要问题 分层思想的处理方法发送请求路由器转发接受请求发送响应接收响应 计算机网络体系结构 计算机网络体系结构是指将…

简单部署vue+springboot项目

vue 参考博客 先将vue项目打包 npm run build 再创建项目文件夹front,在front中新建nginx.conf server {listen 80;server_name localhost;# 请求体的大小限制client_max_body_size 50m;# 日志文件存放地址access_log /var/log/nginx/host.access.log main;error…

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …

C++ | Leetcode C++题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution { public:bool find132pattern(vector<int>& nums) {int n nums.size();vector<int> candidate_i {nums[0]};vector<int> candidate_j {nums[0]};for (int k 1; k < n; k) {auto it_i upper_…

测试-BUG篇

文章目录 软件测试的生命周期BUGbug的概念描述bug的要素bug级别bug的生命周期 与开发产生争执怎么办&#xff08;高频考题&#xff09; 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 BUG bug的概念 是指计算机程序中存在的一个错误(error)、缺陷(flaw)、疏忽(mista…

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器&#xff0c;通过容器卷&#xff0c;实现本地html&#xff0c;ssl&#xff0c;conf和ngiinx容器映射的&#xff0c; 经常需要手动部署…

适合跑步的开放式耳机哪个品牌好?怎么选?可入的蓝牙耳机推荐

想必很多爱晨跑的朋友&#xff0c;一定都有过这般令人困扰的经历。耳机戴久了总觉得不舒适&#xff0c;或是尺寸不合&#xff0c;或是材质欠佳&#xff0c;反正无论怎样调整&#xff0c;都很难找到最舒适的佩戴方式。而且&#xff0c;有时候戴的时间久了&#xff0c;还很容易掉…

FLUX的ID保持项目也来了! 字节开源PuLID-FLUX-v0.9.0,开启一致性风格写真新纪元!

之前的文章已经和大家介绍过字节开源的ID保持项目PuLID。随着FLUX模型的发布&#xff0c;PuLID也开源了 FLUX 版本的模型&#xff0c;不得不说FLUX的强大&#xff0c;两个月生态就赶上了SDXL。这次新发布PuLID-FLUX-v0.9.0模型&#xff0c;它为FLUX.1-dev提供了无需调整的ID定制…

4S店4S店客户管理系统小程序(lw+演示+源码+运行)

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…

VirtulBOX Ubuntu22安装dpdk23.11

目录 依赖包安装 Python安装 numa安装 ​编辑Python pip3安装 ​编辑pyelftools安装 meson和ninja安装 ​编辑构建与编译 Meson构建DPDK ​编辑Ninja安装DPDK ​编辑VFIO-PCI驱动安装 大页内存和IOMMU配置 ​编辑VFIO-PCI加载 ​编辑VFIO-PCI驱动绑定 ​编辑dpdk…

Linux网络操作命令与函数全面总结

1. 引言 Linux作为服务器和开发平台&#xff0c;网络操作是其核心功能之一。本文旨在全面总结Linux系统中的网络操作方法&#xff0c;包括命令行工具和编程接口&#xff0c;帮助读者深入理解Linux网络管理的机制。 2. 命令行工具 2.1 ping 命令 ping 命令用于测试网络连接和…

【Linux】信号知识三把斧——信号的产生、保存和处理

目录​​​​​​​ 1、关于信号的前置知识 1.1.什么是信号&#xff1f; 1.2.为什么要学习信号&#xff1f; 1.3.如何学习信号&#xff1f; 1.4.一些常见的信号 1.5.信号的处理方式 1.6.为什么每一个进程都可以系统调用&#xff1f; 2.信号的产生 2.1.kill命令产生信号…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

html5 + css3(上)

目录 HTML初识基础认知web标准vscode的简介和使用注释 HTML标签学习排版标签标题和段落换行和水平线标签 文本格式化标签媒体标签图片标签图片-基本使用图片-属性 路径绝对路径相对路径 音频标签视频标签链接标签 HTML基础列表标签列表-无序和有序列表-自定义 表格标签表格-使用…

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)

将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路&#xff0c;请移步&#xff1a;https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能&#xff1a;可同时绕X轴和Y轴旋转&#xff0c;两者效果会叠加。 完美适配Web、原生…

数据结构与算法篇(图)(持续更新迭代)

目录 一、引言 二、基本概念 三、图的定义 四、图的基本概念和术语 1. 有向图 2. 无向图 3. 简单图 4. 多重图 5. 完全图&#xff08;也称简单完全图&#xff09; 6. 子图 7. 连通、连通图和连通分量 8. 强连通图、强连通分量 9. 生成树、生成森林 10. 顶点的度、…

使用WPF实现一个快速切换JDK版本的客户端工具

发现网上一键切换JDK环境的方法都是在mac或Linux下的&#xff0c;本人主力电脑是Windows&#xff0c;于是看了一下WPF的文档&#xff0c;自己开发了一个客户端。 直接上代码吧&#xff1a; using JavaSwitch.Properties; using Newtonsoft.Json; using System; using System.…

【C++11】新特性

前言&#xff1a; C11 是C编程语言的一个重要版本&#xff0c;于2011年发布。它带来了数量可观的变化&#xff0c;包含约 140 个新特性&#xff0c;以及对 C03 标准中约600个缺陷的修正&#xff0c;更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化&#xff0…

爬虫案例——爬取情话网数据

需求&#xff1a; 1.爬取情话网站中表白里面的所有句子&#xff08;表白词_表白的话_表白句子情话大全_情话网&#xff09; 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…