跳转到内容

网络应用程序安全指南/文件上传漏洞

来自维基教科书,开放世界中的开放书籍

文件上传漏洞

Web 服务器应用特定的标准(例如文件扩展名)来决定如何处理文件。如果应用程序允许文件上传(例如用于个人资料图片、附件文档),请确保上传的文件不能被 Web 服务器解释为脚本文件。否则,攻击者可能会在您的应用程序的编程语言中上传脚本,并通过请求上传的文件来运行其中包含的任意代码。

此外,攻击者可以上传自定义 HTML 或 JavaScript 文件,并引导受害者访问它们。由于它们来自您的应用程序内的目录,这可用于绕过受害者浏览器中的同源策略保护,例如窃取 Cookie。一些有缺陷的浏览器(特别是 Internet Explorer)在某些情况下会忽略文件的 MIME 类型,并根据文件内容检测文件类型。

为防止此类攻击

  • 避免不必要的文件上传
  • 确保用户上传的文件不能被 Web 服务器解释为脚本文件,例如通过检查文件扩展名(或您的 Web 服务器用于识别脚本文件的任何方法)
  • 确保文件不能上传到非预期目录(目录遍历)
  • 尝试禁用上传目录中的脚本执行
  • 确保文件扩展名与文件内容的实际类型匹配
  • 如果只允许上传图像,请考虑使用安全库重新压缩它们,以确保它们有效
  • 确保上传的文件在传递给用户时使用正确的 Content-type 指定
  • 使用允许的文件类型白名单,防止用户上传有问题的文件类型,例如 HTML、CSS、JavaScript、XML、SVG 和可执行文件
  • 防止用户上传特殊文件(例如 .htaccess、web.config、robots.txt、crossdomain.xml、clientaccesspolicy.xml)
  • 防止用户覆盖应用程序文件
  • 考虑使用“Content-disposition: attachment”标题传递上传的文件

基本原理

文件上传功能很难正确保护。如果提供它们是为了支持“噱头”功能,它们可能不值得冒这个风险。

至关重要的是,Web 服务器不会尝试将上传的文件解释为脚本,因为这会导致任意代码执行。确保使用与您的 Web 服务器相同的方法来决定是否将文件解释为脚本。

目录遍历攻击可能允许攻击者覆盖应用程序或服务器文件。防止这些攻击也是必要的,以确保为上传目录禁用脚本执行实际上是有效的。

禁用脚本执行可确保如果攻击者设法上传脚本文件,它仍然不会被执行。但是,不应依赖于此:如果应用程序被转移到不同的服务器,该设置可能会丢失。

不匹配的文件名/扩展名可用于上传禁止的数据类型(例如 HTML、XML、SVG - 见下文)。即使服务器根据扩展名设置 Content-type,一些浏览器也可能会忽略这一点,分析文件内容(MIME 嗅探)并将文件解析为 HTML。

重新压缩图像可确保任何恶意内容都被破坏。但是,图像处理库需要是安全的,因为它会暴露于用户内容,并可能被攻击,例如使用缓冲区溢出漏洞。

在传递文件时指定正确的 Content-type 可确保大多数浏览器能正确处理该文件。这对于正确功能是必需的,但对于安全性也很重要,因为对文件的错误处理会导致 MIME 嗅探,从而导致安全问题。

用户上传的 HTML、CSS、JavaScript 和类似文件可能包含在网站来源中运行的脚本,因此可以访问 Cookie 或网站内容。XML 和 SVG 文件经常被忽视,但也可以执行脚本。这会导致各种攻击,例如会话窃取、CSRF 等。可执行文件可能对用户构成危险,因此应予以阻止。应使用白名单,因为创建可靠且完整的危险扩展名列表是不可能的。ZIP 文件可能对过时的浏览器(特别是 Firefox 2.x)构成危险。请注意,各种文件在技术上也是 ZIP 文件,特别是来自 OpenOffice 的文档(例如 odt、ods)和 Microsoft Office 2007 及更高版本(例如 docx、xlsx)。

像 .htacces、web.config、robots.txt、crossdomain.xml 和 clientaccesspolicy.xml 这样的特殊文件可能允许攻击者更改安全设置(.htaccess、web.config)、造成负载(robots.txt)或使用插件允许跨站点脚本/跨站点请求伪造攻击(crossdomain.xml 和 clientaccesspolicy.xml)。请注意,crossdomain.xml 文件如果出现在子目录中也是有效的。

允许用户覆盖属于应用程序的文件不仅会损坏应用程序,还会允许其他攻击,例如使代码执行成为可能,或允许攻击者更改关键设置。

Content-disposition: attachment 标题迫使浏览器保存文件,而不是立即打开它,从而降低了某些攻击的风险。请注意,这可能会极大地惹恼用户,并且并非所有情况下都可行。

以下资源提供有关此主题的更多信息

华夏公益教科书