文件上传漏洞(看过就能学会)

news/2024/9/19 16:35:26/ 标签: 网络安全, web安全, 安全

一、什么是文件上传漏洞?

在有上传功能的系统中,如果应用程序没有对用户上传的文件做严格的校验,那么可能会导致用户上传脚本文件,然后用户再通过访问这些文件的方式,来达到执行该脚本文件,从而控制服务器的目的。

可以看到,之所以会有文件上传漏洞,主要是由两个步骤处理不当导致的:

  • 没有对上传的文件做校验,导致具有危害性的脚本被保存到了服务器上;
  • 没有控制服务器对上传目录的解析和执行行为,导致误执行了危害性的脚本;

那么针对这两个步骤,通常有如下的防范措施。

二、防御技巧

2.1 前端校验

前端页面在提交上传文件时,增加文件类型的校验,如果不是指定的文件类型,就拒绝提交。

这种方式只能算是防止正常用户的误操作,完全不能阻止有心的黑客上传危害性的脚本,编辑一下页面JS,或者使用BP工具就能绕过了。虽然没有大用处,但也不可或缺。

2.2 后端检查文件扩展名

在文件被上传到后端服务器的时候,先对文件的扩展名进行校验:

  • 黑名单法

    凡是在黑名单中的文件扩展名均不允许被上传,直接返回给前端错误信息;

  • 白名单法

    限制只有白名单中的文件扩展名才会被服务器接受;

通常情况下,如果白名单能满足需求,就尽量使用白名单,因为白名单更加的安全,而黑名单容易被意想不到的方法进行绕过。

比如,我们黑名单规则为,凡是上传文件后缀为phpaspjsp的都会被过滤,那么针对以下情况就会被绕过:

  • 老版本的IIS服务器存在分号漏洞,即服务器会在解析上传文件的文件名时会把分号后面的内容丢弃,那么黑客构造一个文件名为danger.asp;jpg的危险脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;
  • 老版本的windows-server存在点号和空格漏洞,即会将文件名最后的点号或者空格自动丢弃,那么黑客构造一个文件名为danger.asp.或者danger.asp(此处有空格)的文件脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;
  • 老版本的Nginx存在%00截断漏洞,即对文件名中%00之后的内容进行截断,比如黑客构造一个文件名为danger.php%00.jpg的危险脚本,当上传成功后,服务器在解析该文件的时候,会截断%00之后的内容,把文件当成danger.php进行执行;
  • 老版本的apache服务器解析漏洞,即服务器在解析文件名的时候从右往左,遇到识别不了的后缀会自动跳过,读取可以识别的后缀,如果黑客构造一个文件名为danger.asp.rar或者danger.asp.gif的危险脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;

如果我们使用的是白名单规则,即只允许上传文件后缀为jpgpnggif的文件,那么如上的情况一和二就可以避免,而且可以阻止其它我们暂时没有想到的绕过规则。

2.3 后端检查Content-Type

HTTP协议规定了上传资源的时候会在请求头Header中添加一项MIMETYPE,即Content-Type,用来标识上传资源内容的类型,这个动作一般由浏览器来完成,常见的MIMETYPE类型如下:

  • text/plain,纯文本
  • text/html,HTML文档
  • text/javascript,JS代码
  • application/x-www-urlencoded,POST方法提交的表单
  • application/msword,MicrosoftWord文件
  • application/变成语言,该种编程语言的代码
  • application/pdf,PDF文档
  • application/octet-stream,二进制数据
  • application/xhtml+xml,XHTML文档
  • image/gif+jpeg+png,各种类型的图片
  • vedio/mpeg,动画
  • multipart/form-data,POST提交时伴随文件上传的表单

后端在处理上传请求的时候,可以获取header种的Content-Type类型,来判断上传的文件是否符合要求。当然这种方式也很容易被绕过,使用BP工具,拦截浏览器请求,修改Content-Type类型就行了,虽然这种方法不保险,但是加上一层防护也还是必要的。

2.4 后端检查文件头内容

每一种特定类型的文件都会有自己固定的文件头,通常是用十六进制表示。

  • JPG对应FF D8 FF E0 00
  • GIF对应47 49 46 38 39 61
  • PNG对应89 50 4E 47
  • ZIP对应50 4B 03 04
  • RAR对应52 61 72 21
  • DOC/XLS/PPT对应D0 CF 11 E0 A1 B1 1A E1

后端可以检查文件头的前几位字节,就可以判断是否为合法的文件类型,但是这种方式也不是完全保险的,并不能替代检查文件后缀的方式,因为黑客完全可以构造一个脚本文件,其文件头伪装成正常的上传文件类型。

三、控制服务器对指定目录的行为

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

我们一般会把用户上传的文件放在一个固定的目录,比如/upload下面,按照预想计划,当用户访问这个文件夹下面的文件时,应该发起下载逻辑,而不是把文件当成脚本去执行。因为,我们可以设置服务器对特定目录的行为来有效避免漏洞的发生。

四、其它预防手段

4.1 上传文件重命名

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

所以我们还可以通过让黑客无法找到他上传的恶意脚本来避免这个问题。当文件上传到服务器之后,服务器可以对文件进行随机重命名,然后再保存到上传目录中。

4.2 隐藏上传文件路径

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

所以,我们需要将文件上传的路径隐藏起来,使其不能被用户直接访问到。比如,我们将文件上传路径放在非项目内,或者放在别的服务器上。当用户上传文件的时候,通过程序将文件传输到对应的目录;当需要读取该文件的时候,也由程序以文件流的方式去对应的目录加载,如此,用户根本无法直接访问到上传的文件,更不能使其执行。

五、文件上传绕过技巧:

  1. 客户端JavaScript检测绕过:客户端的JavaScript检测可以被禁用或修改,因为它们是在用户浏览器上执行的。攻击者可以通过禁用JavaScript或使用代理工具(如Burp Suite)来修改HTTP请求,从而绕过客户端检测。

  2. 服务端MIME检测绕过:服务器可能会检查上传文件的MIME类型,以确保它们是允许的文件类型。攻击者可以通过修改HTTP请求头中的Content-Type字段来尝试绕过这种检测。

  3. 服务端扩展名检测绕过:服务器可能会使用黑名单或白名单来限制允许的文件扩展名。攻击者可以尝试使用大小写变化、双写扩展名(如phtml代替php)、添加特殊字符(如空格、点或::$DATA)来绕过这些限制。

  4. 利用服务器解析漏洞:某些服务器配置错误或特定条件下,可能会错误地解析文件类型。例如,IIS服务器在某些情况下可能会将.php文件作为图片解析,或者Nginx服务器在配置不当的情况下可能会执行看起来像图片的.php文件。

  5. 利用条件竞争:如果服务器在上传文件后进行验证和重命名,攻击者可能利用时间差来访问尚未被重命名的文件。

  6. 文件头内容检验绕过:有些服务器会检查文件的头部内容,以确定文件类型。攻击者可以通过在恶意代码前添加有效的文件头(如GIF89a)来绕过这种检测。

  7. 利用.htaccess文件:在支持.htaccess的服务器上,攻击者可以尝试上传一个.htaccess文件,配置服务器将特定文件类型作为可执行脚本处理。

  8. 二次渲染绕过:某些服务器在处理上传的文件时,可能会对文件进行二次渲染,这可能会移除或改变文件头,攻击者可以利用这一点来绕过文件头检查。

六、总结

我们需要清楚地意识到触发上传漏洞的两个必要条件:

  • 用户上传了非法格式的文件;
  • 用户通过访问的方式触发了服务器执行其上传的文件;

http://www.ppmy.cn/news/1516640.html

相关文章

一文讲明白如何将shell脚本闭源

目录 目的使用帮助举例实现:打包查看检查打包后的文件验证问题1:注意事项:目的 我们使用的脚本都是可以直接查看,因为这个是一个解释性的执行过程,那么有没有可能让脚本闭源呢,也就是说,我们辛苦的写的脚本,不想让别人看到,有没有好的办法呢? 这里我们可以使用makese…

Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)

Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式) 1、kafka命令行脚本创建topic并指定分区和副本2、springboot集成kafka创建topic并指定分区和副本2.1、springboot集成kafka2.1.1、springboot集成kafka创建topic并指定5个分区和…

使用 jar-analyzer 和dbeaver 分析java

https://github.com/jar-analyzer/jar-analyzer 可以进行jar分析,包括method调用 分析完可以通过界面进行一些分析,如果复杂还可以用DbWeaver 打开数据库进行分析

【微信小程序】导入项目

1.在微信开发工具中,点击【导入项目】 2.在打开的界面中执行2个步骤 1.找到要导入项目的路径2.AppID要改成自己的AppID 3.package.json包初始化【装包之前要确保有package.json文件】 1.在【资源管理器】空白处,点击鼠标右键,选择【】&am…

aspera上传数据至NCBI

aspera安装与使用(NCBI上传下载工具)-生物信息学工具31 要使用Aspera命令行上传文件并完成提交,您可以按照以下步骤操作: 第一步:准备您的文件 组织文件:确保每个提交的序列文件都在一个目录中&#xff…

高效工作的同时持续推动自我提升的策略

在快速迭代的编程世界中,程序员们不仅需要高效完成日常编码任务,还需不断学习新技术、深化专业知识,以应对日益复杂的项目挑战。然而,如何在繁忙琐碎的编码工作与个人成长之间找到平衡,是不少程序员都面临的一个难题。…

【ORACLE】decode() 函数

在Oracle数据库中,DECODE 函数是一个非常有用的条件表达式,它类似于其他编程语言中的 switch-case 或 if-else 语句。DECODE 函数可以简化查询中的条件逻辑,使得SQL语句更加简洁和易于理解。 基本语法 DECODE 函数的基本语法如下&#xff1…

EmguCV学习笔记 VB.Net 6.6 图像的矩

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

智能码二维码zhinengma.cn相比传统二维码有哪些优势?

智能码二维码相比传统二维码具有显著的优势,主要体现在更高的信息存储容量、更强的纠错能力、更高的安全性,以及更广泛的应用场景。以下是智能码二维码的优势介绍: 更高的信息存储容量:智能码二维码可以存储更多的数据信息&#…

打卡53天------图论(应用题)

一、字符串接龙 经过上面的练习,大家可能会感觉 广搜不过如此,都刷出自信了,本题让大家初步感受一下,广搜难不在广搜本身,而是如何应用广搜。 代码随想录 无JS官方题解代码。 二、有向图的完全可达性 深搜有细节&…

CSS 实现 两栏布局、三栏布局,以及常见的水平居中的方法

CSS 常见的页面布局 两栏布局方式一:浮动方式二:浮动方式三:flex 布局方式四:利用定位方式五;利用定位 三栏布局方式一:flex 布局方式二:定位方式三:浮动圣杯布局双飞翼布局 常见的水…

eclipse汉化教程

1:选择HELP->install New software 2:点击Add 3:name随便填写,location:https://download.eclipse.org/technology/babel/update-site/latest/ 4:等待下载完成后点next 5:选择中文,再点击next 6. 等待…

语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)

文章目录 概述简单的链表描述链表的术语简单实现一个单链表 Linux之SLIST机理分析结构定义单链表初始化单链表插入元素单链表遍历元素单链表删除元素 Linux之SLIST使用实践纯C中typedef重命名带来的问题预留 概述 本文讲述了数据结构中单链表的基本概念,头指针、头…

GitHub 与 AWS CodeCommit

代码库对决 欢迎来到雲闪世界。在软件开发领域,高效管理代码至关重要。Git 存储库等版本控制系统 (VCS) 是无名英雄,为代码更改、协作和历史跟踪提供了安全避风港。在选择合适的存储库平台时,出现了两个巨头:GitHub 和 AWS CodeC…

redis的aof日志配置项详解

Redis 的 AOF(Append-Only File)日志是一种持久化机制,用于记录数据库的所有写操作,以便在 Redis 重启时能够重建数据集。配置 AOF 日志时,有几个重要的配置项,下面是每个配置项的详细说明: app…

swagger,Knife4j和Yapi

目录 swagger swagger的作用 swagger的使用 一.导入依赖 二.创建swagger配置类,交给SpringIoC容器管理 三.使用swagger依赖的注解来给接口层(controller)的各种方法进行注释 Api ApiOperation ApiImplicitParam ApiModel ApiModelProperty 四:…

在建设网站需要注意哪些安全防护事项

企业如果正准备建设网站千万要注意网站安全防护,网站安全不可以忽视,今天来讲讲关于网站建设安全注意事项。 1、网站源代码要安全 你是不是发现平时浏览网站操作过程中,发觉文章标题和内容压根不对付,显示的是其它与公司毫不相干…

24. 重置dataframe的索引

哈喽,大家好,我是木头左! 在数据分析和处理过程中,经常需要对dataframe进行各种操作,其中之一就是重置索引。重置索引可以帮助更好地管理和组织数据,提高数据处理的效率。本文将详细介绍如何使用pandas库中的reset_index()函数来重置dataframe的索引。 1. reset_index()函…

浅析裸土检测算法的实际应用及裸土检测算法源码样本

在环境保护和农业管理的持续推进中,裸土检测算法作为一种先进的技术工具,发挥着越来越重要的作用。它不仅提升了裸土监测的效率和准确性,还在实际应用中展示了巨大的潜力。本文将探讨裸土检测算法在实际应用中的表现,揭示其带来的…

Ant Design Vue中Modal.confirm无法自动关闭

温馨tips:着急看解决方法可跳过碎碎念~ 前两天经理扔给我一个问题:“这个弹窗怎么关不上了?” 我怀着无所谓的心态:小意思啦,5分钟之内解决完~ …当然flag是不能随便乱立的 拉下来项目(原神启动(不是&…