【实践总结】文件上传可能导致的DoS

通过CVE-2023-24998了解上传的可能隐患

Apache Commons FileUpload场景

条件1: (影响版本)

    <!-- Apache Commons FileUpload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>

条件2: (业务场景)如下使用场景是否对上传文件数量大小进行校验和限制
1、调用org.apache.commons.fileupload的地方
2、对commons-fileupload二次封装的场景

Apache Tomcat场景

条件1: (影响版本)
条件2: (业务场景)如下使用场景是否对上传文件数量大小进行校验和限制
1、调用org.apache.tomcat.util.http.fileupload

SpringBoot场景

1、服务使用spring-boot-starter-web包或者spring-boot-starter-tomcat
2、tomcat-embed-core的版本受影响

防御建议

1、禁用文件上传功能

1、在 Spring Boot 应用中,如果你想要禁用文件上传功能

   spring.servlet.multipart.enabled=false

2、配置Multipart解析器的最大文件大小为0:

   # application.propertiesspring.servlet.multipart.max-file-size=0Bspring.servlet.multipart.max-request-size=0B

3、禁用自动配置的Multipart解析器:

   @SpringBootApplication(exclude = {MultipartAutoConfiguration.class})public class YourApplication {// ...}

4、业务上禁用

   @Componentpublic class FileUploadFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;if (ServletFileUpload.isMultipartContent(req)) {// 拒绝请求并返回错误信息((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "File uploads are not allowed.");} else {chain.doFilter(request, response);}}// ... 其他 Filter 方法}

2、上传接口的业务对 上传文件数量大小进校校验

1、业务层直接校验

   @PostMapping("/upload")public ResponseEntity<?> handleFileUpload(@RequestParam("files") MultipartFile[] files) {// 检查文件数量是否超过限制if (files.length > MAX_FILE_COUNT) {throw new IllegalArgumentException("Too many files uploaded.");}for (MultipartFile file : files) {// 对每个文件进行大小检查if (file.getSize() > SINGLE_FILE_MAX_SIZE_IN_BYTES) {throw new IllegalArgumentException("File size exceeds the limit.");}// ... 处理文件上传逻辑 ...}// ...}

2、通过过滤器filter,

在Spring框架中,通常建议使用Spring自身的CommonsMultipartResolver或者MultipartProperties进行配置,而不是直接在过滤器中处理。

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Component
public class FileUploadFilter implements Filter {private static final int MAX_FILE_SIZE = 1048576; // 设置最大文件大小为1MB@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;// 检查是否为multipart/form-data类型的请求if (ServletFileUpload.isMultipartContent(httpRequest)) {// 使用Apache Commons FileUpload库解析请求ServletFileUpload upload = new ServletFileUpload();// 设置单个文件的最大大小upload.setSizeMax(MAX_FILE_SIZE);// 在这里可以尝试解析请求,并获取所有上传的文件项(FileItem)// 然后根据需要检查数量或抛出异常阻止进一步处理// 注意:这个例子只演示了如何设置最大文件大小,实际的文件数量限制需要手动遍历并计数// ...// 如果你希望允许继续进行,不在此处进行文件数量限制,则直接调用filter chainchain.doFilter(request, response);} else {// 对于非multipart请求,直接通过filter chainchain.doFilter(request, response);}}// ... 其他Filter接口实现方法
}

3、MultipartProperties

MultipartProperties 是Spring Boot的内部类,它封装了所有与多部分(multipart)请求处理相关的属性。通过在 application.properties 或 application.yml 中设置相关属性,你可以轻松地控制上传文件的大小限制等。

# 设置最大单个文件大小为10MB
spring.servlet.multipart.max-file-size=10MB
# 设置整个请求的最大大小为20MB
spring.servlet.multipart.max-request-size=20MB
# 设置临时目录
spring.servlet.multipart.location=/tmp

[Q&A] MultipartProperties 直接配置就可以生效吗?

是的,MultipartProperties 是Spring Boot自动配置的一部分,用于设置多部分(multipart)请求处理的相关属性。上述配置无需额外编写Java代码即可生效,Spring Boot将根据这些配置自动调整上传文件大小限制。这意味着你不需要手动创建 CommonsMultipartResolver 或 StandardServletMultipartResolver 的bean来实现这些功能,因为Spring Boot已经为你做好了这部分的集成和自动化配置。

4、CommonsMultipartResolver

在较早版本的Spring MVC中,我们通常会自定义一个 CommonsMultipartResolver 的bean来处理文件上传。但在Spring Boot 2.x之后,推荐使用内建的 StandardServletMultipartResolver,因为Spring Boot已经将其自动配置好并与Servlet标准API集成。

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;import javax.servlet.MultipartConfigElement;@Configuration
public class FileUploadConfig {@Bean(name = "multipartResolver")public CommonsMultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();// 设置最大文件大小(以字节为单位)resolver.setMaxUploadSize(10485760); // 10MBreturn resolver;}// 对于Spring Boot 2.x以上版本,若要调整全局multipart配置,可以通过以下方式:@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize("10MB"); // 单个文件最大大小factory.setMaxRequestSize("20MB"); // 整个请求最大大小return factory.createMultipartConfig();}
}

5、StandardServletMultipartResolver

在Spring Boot中,StandardServletMultipartResolver 是用于处理multipart请求(如文件上传)的默认解析器。由于Spring Boot已经自动配置了它,通常情况下你不需要手动创建这个bean。但是如果你想自定义其属性,可以在Spring配置类中进行如下配置:

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;import javax.servlet.MultipartConfigElement;@Configuration
public class FileUploadConfig {@Beanpublic MultipartResolver multipartResolver() {StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();// 通过MultipartConfigElement进一步定制上传限制resolver.setResolveLazily(true); // 可选:延迟解析multipart请求,默认为falsereturn resolver;}// 设置全局multipart配置(例如最大文件大小和整个请求的最大大小)@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize("10MB"); // 单个文件最大大小factory.setMaxRequestSize("20MB"); // 整个请求最大大小return factory.createMultipartConfig();}
}注意:
StandardServletMultipartResolver 类本身并不直接提供设置单个文件或整个请求大小的方法。
而是通过 MultipartConfigElement 进行配置,该配置会应用到所有的multipart解析。

3、如果使用tomcat作容器场景,可修改配置文件server.xml

   <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxPostSize="10485760" /> <!-- 10 MB --> 即10 * 1024 * 1024字节

[Ref] Apache Commons FileUpload & Apache Tomcat拒绝服务漏洞预警(CVE-2023-24998)

在这里插入图片描述

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

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

相关文章

【小沐学QT】QT学习之OpenGL开发笔记

文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持&#xff0c;使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…

【Azure 架构师学习笔记】-Azure Synapse -- Link for SQL 实时数据加载

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Synapse】系列。 前言 Azure Synapse Link for SQL 可以提供从SQL Server或者Azure SQL中接近实时的数据加载。通过这个技术&#xff0c;使用SQL Server/Azure SQL中的新数据能够几乎实时地传送到Synapse&#xff08;…

前端路由与后端路由的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

SQL注入漏洞解析--less-7

我们先看一下第七关 页面显示use outfile意思是利用文件上传来做 outfile是将检索到的数据&#xff0c;保存到服务器的文件内&#xff1a; 格式&#xff1a;select * into outfile "文件地址" 示例&#xff1a; mysql> select * into outfile f:/mysql/test/one f…

Vue源码系列讲解——实例方法篇【一】(数据相关方法)

目录 0. 前言 1. vm.$watch 1.1 用法回顾 1.2 内部原理 2. vm.$set 2.1 用法回顾 2.2 内部原理 3. vm.$delete 3.1 用法回顾 3.2 内部原理 0. 前言 与数据相关的实例方法有3个&#xff0c;分别是vm.$set、vm.$delete和vm.$watch。它们是在stateMixin函数中挂载到Vue原…

【OnlyOffice】 桌面应用编辑器,版本8.0已发布,PDF表单、RTL支持、Moodle集成、本地界面主题

ONLYOFFICE桌面编辑器v8.0是一款功能强大、易于使用的办公软件&#xff0c;适用于个人用户、企业团队和教育机构&#xff0c;帮助他们高效地处理文档工作并实现协作。无论是在Windows、macOS还是Linux平台上&#xff0c;ONLYOFFICE都能提供无缝的编辑和共享体验。 目录 ONLYOFF…

ESP32语音转文字齐护百度在线语音识别

一、导入(10分钟&#xff09; 学习目的 二、新授(70分钟) 1.预展示结果(5分钟) 2.本节课所用的软硬件(5分钟) 4.图形化块介绍(10分钟) 5.单个模块的简单使用(10分钟) 6.在线语音转换工具逻辑分析(10分钟) 7.在线语音转换工具分步实现(30分钟) 三、巩固练习(5分钟) 四、课堂小结…

腾讯云4核8G的云服务器性能水平?使用场景说明

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

【办公类-21-04】20240227单个word按“段落数”拆分多个Word(三级育婴师操作参考题目 有段落文字和表格 1拆13份)

作品展示 背景需求&#xff1a; 最近学育婴师&#xff0c;老师发了一套doc操作参考 但是老师是一节节授课的&#xff0c;每节都有视频&#xff0c;如果做在一个文档里&#xff0c;会很长很长&#xff0c;容易找不到。所以我需要里面的单独文字的docx。 以前的方法是 1、打开源…

Android studio 六大基本布局详解

Android studio 六大基本布局详解 一、Android studio1.Android studio简介2.架构组成3.地址3.1 [官网地址](https://developer.android.google.cn/)3.2 [官方下载地址](https://developer.android.google.cn/studio?hlzh-cn) 二、Android studio六大基本布局详解1.Android六大…

【JavaEE】_前端POST请求借助form表单向后端传参

目录 1. 前端POST请求借助form表单向后端传参 2. 关于parameter方法获取参数的优先性问题 前端向后端传参通常有三种方法&#xff1a; 第一种&#xff1a;使用GET请求的query string部分向后端传参&#xff1a; 本专栏中已经详述了前端使用GET请求的query string向后端传参…

在本地运行 LLMs 的 6 种方法

商业人工智能和大型语言模型 (LLM) 有一个很大的缺点&#xff1a;隐私。在处理敏感数据或专有数据时&#xff0c;我们无法从这些工具中获益。因此&#xff0c;我们需要了解如何在本地运行私人 LLM。开源模型提供了一种解决方案&#xff0c;但它们也有自己的挑战和优势。 设定期…

网安入门18-XSS(靶场实战)

HTML实体化编码 为了避免 XSS 攻击&#xff0c;会将<>编码为<与>&#xff0c;这些就是 HTML 实体编码。 编码前编码后不可分的空格 < (小于符号)< > (大于符号)> & (与符号)&amp;″ (双引号)&quot;’ (单引号)&apos;© (版权符…

微服务-商城订单服务项目

文章目录 一、需求二、分析三、设计四、编码4.1 商品服务4.2 订单服务4.3 分布式事务4.4 订单超时 商品、购物车 商品服务&#xff1a; 1.全品类购物平台 SPU:Standard Product Unit 标准化产品单元。是商品信息聚合的最小单位。是一组可复用、易检索的标准化信息的集合&#x…

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包

一、设置应用包名 在Flutter开发中&#xff0c;修改应用程序的包名&#xff08;也称作Application ID&#xff09;涉及几个步骤&#xff0c;因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作&#xff1a; 1.Android Flutter工程中全局搜索替换包名 …

企业网络布局的新宠——SD-WAN

在数字化转型的浪潮下&#xff0c;企业对网络的需求日益复杂和多样化。面对分支机构间的协作需求和不断增长的网络流量&#xff0c;企业亟需一种更加高效、灵活且成本可控的组网方案。SD-WAN&#xff08;软件定义广域网络&#xff09;正是在这样的背景下应运而生&#xff0c;成…

【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

主题公园保管资产难?三防加固平板对此说不!

主题公园是一个活跃&#xff0c;快节奏的环境&#xff0c;主题公园最重要的资产之一是他们的表演者和每天制作的节目。但是检查道具以及寻找服装的去向是一项艰巨的任务&#xff1b;如果没有适当的系统和流程&#xff0c;可能会导致资产损失和材料放错位置&#xff0c;最终导致…

【大厂AI课学习笔记NO.51】2.3深度学习开发任务实例(4)计算机视觉实际应用的特点

今天考试通过腾讯云人工智能从业者TCA级别的认证了&#xff01; 还是很开心的&#xff0c;也看不到什么更好的方向&#xff0c;把一切能利用的时间用来学习&#xff0c;总是对的。 我把自己考试通过的学习笔记&#xff0c;都分享到这里了&#xff0c;另外还有一个比较全的思维…

51单片机 wifi连接

一、基本概念 ESP8266是一款集成了WiFi功能的高性能芯片&#xff0c;广泛应用于物联网设备、智能家居、传感器网络等领域。以下是ESP8266的详细讲解&#xff1a; 1. 功能特点&#xff1a;ESP8266集成了TCP/IP协议栈&#xff0c;支持STA&#xff08;Station&#xff09;和AP&am…