文件上传安全问题

11

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

这种文件上传控件向公众提供的风险是什么?有没有办法通过上传恶意文件在Web服务器上执行恶意脚本?

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

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

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


实际上,如果您将其作为附件发送,它永远不会触及您的磁盘。 - SLaks
1
我甚至不打算尝试回答,因为我通常会因为没有提出完美的建议而被踩。完美的建议是没有任何漏洞的。话虽如此,如果您将无效的web.config或其他格式错误的web.config放入上传文件夹中,则可以防止执行任何.net代码。您需要确保阻止所有映射到服务器上某些执行内容的扩展名,包括.php、.axd、.ashx等。 - MatthewMartin
2
小心你的表单不要成为垃圾邮件发送者的最爱。除了防御文件风险外,还要限制它可以发送给多少人以及多久发送一次。 - AlG
@SLaks:我在某处读到关于httpruntime的requestLengthDiskThreshold设置,这取决于它。如果文件大小超过requestLengthDiskThreshold,它可能会将文件缓存到asp.net临时文件夹中。此外,如果出现与SMTP相关的错误,你的附件可能会以其中一个mailroot文件夹结尾,并位于inetpub内部。 - Neil
2个回答

8
为了回答你关于可能存在的安全漏洞的问题,即使你不将文件保存到磁盘中,你也可以为你的应用程序和用户创建漏洞。但你可以采取一些防御措施来进行验证。
首先,显然要限制可以上传的文件类型,你可以使用一个白名单并检查扩展名,但是不要止步于此。你还应该通过查看文件内容来验证它是否符合预期格式。这非常重要,因为坏人可以向上传的文件中注入文件头,并将你的系统用作传播恶意软件的僵尸。
其次,你应该对上传的文件运行病毒扫描,可以使用命令行执行本地病毒扫描器来实现。这对于许多病毒扫描器(包括趋势科技)来说非常容易,除非你要处理大量的文件上传,否则这不会对服务器造成很大负担。
确保永远不要传递路径作为用户提交的数据(通过GET或POST下载),因为这可能会导致路径遍历攻击。如果用户需要从浏览器下载文件,则可以创建一个存储记录位置的数据库,然后根据数据库记录和用户对该记录的访问创建一个控制器或页面来获取该记录,而不是提供一个用户可以控制并用于从服务器获取文件的路径。
确保要保存到的目录不能被Web服务器读取,这样它们就不会上传恶意脚本,然后通过HTTP从其浏览器执行它。
确保对所有用户输入进行验证,采用一些防XSS库(Microsoft提供一个http://www.microsoft.com/en-us/download/details.aspx?id=28589)。
希望能有所帮助!

4
最好的方法是将它们上传到/App_Data文件夹或将其作为二进制对象存储在数据库中。App_Data无法通过Web服务器读取,因此这将保护您免受执行和脚本访问的威胁。将它们存储为Base 64编码并将其存储为文本(同样可以在文件系统App_Data或数据库中)也是一种替代方案。
创建一个代理页面来检查用户是否具有查看/下载文件的权限,如果是,则向HTTP响应发送文件流。这样,用户就没有直接访问权限,也无法执行任何不应该执行的操作。您还可以使用SMTP类从流引用附加文件。
如果要存储在文件系统中,您可以实现自己的命名约定,以便将对实际文件的请求映射到存储的版本。
病毒扫描可能很有用,但请将其视为保护其他可能访问下载文件的用户而非保护您的服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接