问题 文件上传安全关注


我有一个公开的网络表单,具有文件上传功能。现在,文件要么保存在Web服务器上,要么作为附件发送到电子邮件中。我们对大小有限制,即15MB和上传文件的扩展名。我们的SMTP服务器位于同一Web服务器上。我担心安全问题,因为任何人都可以上传恶意文件并对我们的生产Web服务器产生影响。

公众可以使用这种文件上传控制有什么风险?无论如何,有人可以通过上传恶意文件在Web服务器上执行恶意脚本。

我做了一些研究,发现了以下几点

  1. 如果我在电子邮件中将文件作为附件发送,则此文件将临时存储在Temporary ASP .Net文件夹中,一旦发送电子邮件,该文件将被删除。
  2. 您可以在将文件保存到文件系统之前重命名该文件。
  3. 您可以将文件保存在您的网站的不同位置
  4. 您可以进行某种实时病毒检查。我不知道你怎么能这样做。我正在阅读一些命令行病毒扫描。但不确定我是否真的需要它。

这些只是几点,但我想知道文件上传中的任何盲点。


7797
2017-10-12 17:43


起源

实际上,如果您将其作为附件发送,它永远不会触及您的磁盘。 - SLaks
我甚至都不打算回答,我通常因为没有提出密不透风的东西而投票。气密没有任何功能。也就是说,如果您将无效的web.config或其他格式错误的web.config放入上传文件夹,您可以阻止任何.net代码执行。您需要确保阻止所有映射到服务器上执行的扩展,包括.php,.axd,.ashx等。 - MatthewMartin
小心你的表格不会成为垃圾邮件发送者最喜欢的玩具。限制可以发送的人数和频率,以及防御文件风险。 - AlG
@SLaks:我正在读某个地方,这取决于你的requestLengthDiskThreshold设置的httpruntime。如果文件大小超过requestLengthDiskThreshold,它可能会将文件缓冲到asp .net临时文件夹中。此外,您的附件可以在inetpub内的一个mailroot文件夹中找到任何与smtp相关的错误。 - Neil


答案:


要回答有关可能的安全漏洞的问题,是的,即使您不将文件保存到磁盘,也可以明确地在应用程序和用户中创建漏洞。但是你可以采取一些防线来验证。

第一个是显然限制可以上传的文件类型,你可以用一个 白名单 并检查扩展名 但不要就此止步  您还应该通过查看文件的内容进行验证,以确保它符合预期的格式。这可能是至关重要的,因为坏人可以将文件头注入上传的文件中,并将您的系统用作僵尸来传播他的恶意软件。

其次,您应该针对上传的文件运行病毒扫描,您可以使用命令行执行本地病毒扫描程序。对于包括趋势科技在内的许多病毒扫描来说,这很容易做到,除非您正在查看大量的文件上传,否则它不应该对您的服务器征收巨额税。

确保你 从不传递路径 当用户提交数据时(通过GET或POST下载),因为这会使您暴露于路径遍历攻击。如果您的用户需要从浏览器下载文件,您可以创建一个存储记录位置的数据库,然后创建一个控制器或页面,根据数据库记录和用户访问该记录来获取它,而不是提供用户可以控制并用于从服务器获取文件的路径。

确保要保存的目录是 Web服务器无法读取这样他们就不会上传恶意软件脚本,然后通过HTTP从浏览器中执行它

确保您针对某些反XSS库验证所有用户输入(Microsoft提供了一个 http://www.microsoft.com/en-us/download/details.aspx?id=28589

希望有所帮助!


6
2017-10-13 18:00





最好的方法是将它们上传到/ App_Data文件夹或将它们作为二进制对象存储在数据库中。 App_Data无法通过Web服务器读取,因此这将保护您免受执行和脚本访问。将它们存储在二进制文件中的替代方法是对Base 64进行编码并将它们存储在文本中(再次在文件系统App_Data或数据库中)。

创建代理页面以检查用户是否具有查看/下载文件的权限,如果是,则将文件流发送到HTTP响应。这样,用户就无法直接访问,也无法执行任何不应执行的操作。您还可以使用流引用中的SMTP类附加文件。

如果存储在文件系统中,您可以实现自己的命名约定,以便将对实际文件的请求映射到存储的版本。

病毒扫描可能很有用,但请将此视为保护可能有权下载文件而不是保护服务器的其他用户。


4
2017-10-15 14:10