应用安全系列之二十四:文件上传

        随着Web应用功能的不断丰富和需求的不断增加,文件上传已经成为非常重要的功能之一,例如:注册用户时,上传头像,几乎都成为标配了。 虽然文件上传已经成为非常重要的功能,但是,它也带来一定的风险。本文主要介绍文件上传的相关问题和预防措施。

        总体来说,文件上传的威胁主要来自四个方面:文件名称、文件类型、文件大小和文件内容。

文件名称:

        关于文件名称主要是可能文件名中含有一些比较危险的字符导致文件在被保存的时候,出现了意料之外的结果,例如,文件名称含有../或者..\,以及 ~等字符,这些字符都有特殊的意义,会导致文件被保存到预期之外的路径下。这种行为可能导致的问题就比较严重,因为上传的目标路径,一般都会设置为不可执行的,如果网站上显示的图片或者网页被覆盖,可能导致网站显示异常;如果一个可以执行的文件被存到上传目标路径之外其他路径,而且,这个路径又是可以执行文件的,就会带来灾难的后果。

        有些操作系统也有一些特殊的特性,也可能导致文件被覆盖。例如:Windows 8.3的功能,web.config就可以被短文件名web~1.con覆盖,“.htaccess”可以被“HTACCE~1”覆盖。如果web应用的配置文件被修改,攻击者可以控制应用的很多配置,导致应用的很多不安全的功能被打开,让攻击者更加容易地攻击系统。

        文件名带来的另外一个威胁就是,当文件名不合法时,如果系统处理不正确,可能导致系统内部信息泄露,例如:windows中含有 非法字符 |<>*?”,就会出错;在操作系统中,文件的名字和路径加在一起是有一定限制的,如果文件名字太长(>255)个字符,或者文件名+上传路径的长度>255,就会出问题。当出错时,如果处理不当就会导致信息泄露。有的网站处理不当会泄露非常重要的内部信息,如下:

 关于文件名的相关攻击的预防就是:做严格的输入验证,检测文件名中是否含有非法字符,检测文件名的长度是否超长。

文件类型:

        文件类型主要是上传文件的扩展名控制,如果扩展名没有做任何检查,可能会上传一些webshell,例如:jsp,php,asp,exe,bat,sh等可以执行的脚本或者文件,而这些脚本一旦可以通过某种途径出发执行,攻击者就可以执行任何命令,甚至控制整个服务器。即使不能触发执行,此文件如果可以在网站上分享给其他人,就可以引诱被攻击者访问此文件并发起攻击。

       针对文件类型的预防措施也比较简单:主要是使用一个允许的扩展名的白名单,只要不在这个白名单里的类型,一律拒绝。例如:一个上传csv文件的功能,就可以限制只能上传csv为扩展名的文件。在具体实施时,也需要注意,如果某个文件有多个点[.],例如:file.php.csv,一定要验证最后一个点之后的扩展名。

        当然文件名只是用于显示使用的,系统内部完全可以不再文件系统上使用上传者的文件名,可以使用随机数产生一个随机数作为文件系统的名字,再在数据库里,将文件的名字和这个随机数文件名的对应关系保存好,这样无论文件名字包含什么字符,都不会对文件系统有任何影响。

文件大小:

        如果对文件大小没有任何限制,可能导致的问题就是DOS攻击,当一个系统不限制上传文件的大小时,可能导致系统的空间被占用,再上传时,系统的IO资源和内存也被占用,攻击者可以利用这一点发起DOS攻击。

        关于文件大小攻击的预防措施:就是做严格的输入验证,任何一个上传的地方,根据需求,设置一个可以接受的文件的大小限制。例如:一个上传头像的功能,上传文件>100M就不正常。

文件内容:

        HTTP协议的content-type可以用于定义传输内容的类型,但是,这个类型是可以随意篡改的,不太可信。所以,服务器端最好有相关的检测功能,可以参考Apache Tika来检测文件的类型是否符合需求,关于各种文件的类型的特征可以参考:https://en.wikipedia.org/wiki/List_of_file_signaturesicon-default.png?t=N7T8https://en.wikipedia.org/wiki/List_of_file_signatures;病毒检测功能,有些杀病毒的厂商也提供一些SDK或者API用于快速检测文件。对于一些需要解析的文件,例如:XML,需要在解析时,注意API的配置的正确,防止XXE和XML Bomb的攻击。

        当上传的文件是压缩文件时,就更需要小心。首先,解压缩之后的大小会比压缩文件大很多,注意文件大小的控制;其次,在解压缩时,需要注意压缩包里的文件名称【参考前面文件名称】可能包含异常的字符,例如:../【可以尝试使用MAC操作系统创建这种文件名】。在解压缩之后,可能会导致文件被解压到预料之外的路径。因此,在解压缩并且保存压缩包里的文件时,每一个文件名都需要严格验证,以防万一。关于如何在解压缩时验证文件名的安全,可以参考【IDS04-J. Safely extract files from ZipInputStream - SEI CERT Oracle Coding Standard for Java - Confluence

关于文件内容的类型检测,可以查阅:如何判断一个文件的类型_jimmyleeee的博客-CSDN博客Java如何判断一个上传文件的内容类型_jimmyleeee的博客-CSDN博客

 文件上传容易犯的错误

  • 只在客户端使用JavaScript验证上传的文件名和扩展名
  • 忽略针对文件大小的验证
  • 完全版依赖content-type判断文件的类型,有些语言提供某种类型的文件的专用的API,例如:PHP提供了getimagesize,如果上传的不是图片,这个API就获取不到信息,通过此API就可以判断是否上传的是图片;
  • 代码实现错误,没有根据最后一个.之后的扩展名判断文件的类型

 文件上传预防措施:

        文件上传漏洞危害非常大,需要谨慎小心预防,总体来说需要注意一下几个要点:

        1. 严格进行输入验证,包含文件名、文件大小和文件类型,特别是压缩文件;

        2. 注意上传路径的权限设置,最受最小权限原则,防止文件被执行;

        3. 加强文件检测,以防病毒被上传;

        4. 尽量使用白名单,而不是黑名单;

        5. 制定编码规范,统一错误处理,防止信息泄露;

        6. 使用API解析文件时,一定要注意API的安全设置项,防止解析文件时被攻击。

        7. 检测文件的类型是否是在允许的类型范围内【Java语言的文件类型检查可以参考:Determining File Types in Java - DZone Java】;

简单总结为如下表格:

检测部分说明
文件名是否含有非法字符,例如:.. ~ 等字符,导致路径跳转;长度是否超过限制
扩展名是否在允许的白名单范围
文件大小是否控制了文件的最大的size
文件类型文件类型是否在允许的列表中。

        最后,要记住的一句话是:一起输入皆为恶。无论是从外部输入,还是内部其他模块的输入,都需要严格验证输入。养成一个良好的思维与习惯,才是构建安全产品的关键。

参考:

Unrestricted File Upload | OWASP Foundation

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 文件上传漏洞是Web应用程序中常见的安全漏洞之一,攻击者可以通过上传恶意文件来执行代码、获取敏感信息、攻击其他用户等。为了防止文件上传漏洞,可以采用以下防御机制: 1. 文件类型检查:在上传文件之前,应该对文件类型进行严格的检查,只允许上传指定的文件类型,例如图片、文本、PDF等。可以使用文件扩展名、MIME类型等方式来检查文件类型。 2. 文件大小限制:限制上传文件的大小,避免上传过大的文件导致服务器资源耗尽或拒绝服务攻击。 3. 文件名过滤:过滤掉恶意文件名,例如包含特殊字符、脚本代码等的文件名。 4. 文件内容检查:对上传的文件内容进行检查,避免上传包含恶意代码的文件。 5. 文件路径限制:限制上传文件的存储路径,避免上传恶意文件到系统目录或其他敏感目录。 6. 权限控制:对上传文件进行权限控制,例如只允许特定用户上传文件,或限制上传文件的访问权限。 7. 文件重命名:在上传文件时,将文件重命名为随机字符串,避免上传文件名相同的文件覆盖原有文件。 综上所述,通过以上防御机制可以有效地防止文件上传漏洞的发生,提高Web应用程序的安全性。 ### 回答2: WEB安全文件上传防御机制是指在网络应用中,为防止恶意用户上传危险文件并对系统造成安全威胁,采取的一系列防御措施。 首先,一种常见的防御机制是对文件类型进行限制。通过白名单或黑名单的方式,设置允许或禁止上传的文件类型,可以阻止用户上传可能存在风险的文件,如执行文件、脚本文件等。这种限制可以在前端或后台进行,前端可通过验证文件名后缀来判断,后台可通过文件头信息或内容进行判断。 其次,还可以对文件进行内容检测。这种机制可以通过对上传文件进行解析,检查其中的内容是否符合安全要求。例如,可以检查上传的图片是否包含恶意代码、上传的文档是否存在潜在的漏洞等。这需要在服务器端进行深入解析和检测,以确保上传文件的安全性。 此外,还可以对上传的文件进行重命名和存储路径随机化。通过对文件名进行加密或随机命名,可以避免恶意用户利用已知的文件名进行攻击,同时还可以将上传的文件存储到不可访问的路径中,提高上传文件的安全性。 最后,日志记录和监控也是重要的防御机制。通过记录每次文件上传的相关信息,包括上传者、上传时间、上传文件的属性等,可以方便后续对上传行为进行监控和追溯,及时发现并处理潜在的安全威胁。 综上所述,WEB安全文件上传防御机制涵盖了文件类型限制、内容检测、重命名与路径随机化、日志记录与监控等多种措施,通过这些手段可以提高网络应用安全性,预防恶意文件上传对系统造成的安全威胁。 ### 回答3: WEB安全文件上传防御机制是为了防止恶意用户上传含有安全漏洞的文件或恶意文件,对WEB应用进行保护的一种机制。 首先,常用的WEB安全文件上传防御机制是通过对文件的类型和扩展名进行检查。通过验证文件的MIME类型和扩展名,可以辨别出危险的文件类型,例如可执行文件或脚本文件。如果检测到这些危险的文件类型,就应该及时拒绝上传,并给出合理的提示。 其次,WEB安全文件上传防御机制还可以通过对文件内容进行检查来确保文件的真实性和完整性。可以使用文件的特征码或哈希值进行校验,以确保文件内容没有被篡改。同时,还可以检测文件中是否含有恶意代码、文件头是否正确等,以确保上传的文件安全可靠。 此外,应该对上传文件的大小进行限制,防止恶意用户上传过大的文件导致服务器压力过大或占用过多的存储空间。可以设置合理的文件大小阈值,超过阈值的文件应及时拒绝上传,并给出相应的警示和提示。 最后,对于敏感文件的上传,应该进行额外的权限设置和访问控制。例如,将敏感文件存放在非web可访问的目录下,通过程序进行读取操作,从而避免用户直接访问敏感文件。 综上所述,WEB安全文件上传防御机制是通过对文件类型、扩展名、内容的检查和限制,确保上传文件的安全性和完整性,同时阻止恶意用户利用文件上传功能进行攻击。这些机制可以有效地保护WEB应用安全

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值