启用Web文件存储和给予IIS_IUSRS删除权限的安全隐患

3
多年来,我一直有一个疑问,并且每当这个问题出现时都会进行研究,但从未找到明确的答案。不知何故,万能的互联网、MSDN和社区论坛对此要么保持沉默,要么含糊其辞。在成千上万的与开发相关的不确定性中,这是唯一难以捉摸的一个。
言归正传:为了让用户上传和管理用于他们的博客文章的图像(和其他文件),在共享托管环境中,我可以考虑使用SQL Server二进制数据类型(性能影响)或文件系统。要使用后者,需要为IIS_IUSRS角色设置必要权限,包括创建/写入、读取和删除存储目录。我的问题是 - 如果我这样做,会有什么安全隐患?是否可能有人绕过ASP.NET请求管道并操纵文件夹内的文件,而不用向相应的ASP.NET处理程序发出请求(该处理程序检查权限、验证上传等)?
我开发了多个允许文件上传的系统,这一直困扰着我。现在,希望有人能放心地解答我的疑问,最好是解释背后的原理。
更新:
在查看最新答案后,另一种表述问题的方式是:
是否有任何可能让客户端绕过请求管道,并在允许的目录中创建/删除文件(假设该人知道目录结构)?还是只有处理请求的代码可以这样做?任何潜在的漏洞?
2个回答

1
主要问题是能够上传一个脚本,一个aspx页面到这个目录中的照片文件,并运行它。
以下是一个案例:我的网站被黑客攻击了。他们上传了一个名为AspxSpy的恶意aspx文件。他们仍在尝试。帮我抓住他们! 解决方法是在允许上传文件的目录上添加额外的web.config文件,并不允许运行任何aspx页面。还要仔细检查只允许您允许的扩展名,并不允许更改文件名,如果他们有机会进行重命名。
<configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

关于允许上传文件的目录,不要允许运行任何其他脚本,如简单的asp、php或exe等。

一般情况

您的所有页面都具有在服务器上运行和操作许多内容的权限。现在您提供的是在某些目录中使用某些aspx页面进行写入的能力。asp.net现在有一个额外的权限,可以在照片文件夹中写入文件。还要注意的是,您的asp.net页面拥有此控件,而不是用户。您在代码中所做的事情可以写入这些目录,因此必须更加小心地检查您写入的位置,并且不允许任何其他目录,也不允许用户操纵可写入的目录。

因此,这是弱点。为了能够上传更多的脚本以控制服务器,至少需要访问此池的asp.net用户可以访问的部分。


是的,非常好的观点。感谢提供链接。我没有考虑过在子文件夹中使用web.config来禁止aspx执行。因此,它可以被放置在具有写入权限的文件夹的上一级子目录中,作为额外的预防措施,除了不使用原始文件名/扩展名之外。 - constantine g
那么你的意思是说,客户端无论如何都不能绕过请求管道,在允许的目录内创建/删除文件(假设该人知道目录结构)?只有处理请求的代码才能做到这一点?有任何潜在的漏洞吗?这就是我的问题的本质。 - constantine g
@constantineg 使用的asp.net没有目录写入权限,只有读取和运行权限。实际上,有两个帐户一起工作来运行asp.net。用户和池。它们都有限制权限,但是如果允许在目录上写入,则可以创建代码以运行并执行更多操作-打开权限等等...因此,重点是不允许上传任何脚本。 - Aristos

1

我之前做过这个,我有两个建议:

首先,如果可能的话,请不要将上传的文件存储在与应用程序代码相同的目录结构中。将其定义为明确定义的外部位置,并明确锁定为仅适用于运行应用程序的用户。这使得恶意上传更难被注入到您的应用程序中,因为Web服务器或ASP.NET本身都不知道如何访问该文件(只有您的应用程序)。

如果绝对不可能这样做,请确保使用标准ASP.NET授权确保没有外部用户可以访问存储文件夹,并且仅允许您的应用程序用户向此文件夹写入,而不允许其他任何操作。

其次,请勿使用原始名称和文件扩展名存储上传的文件;将元数据保持分离。只需将文件视为原始二进制数据块即可。这有几个好处。首先,它可以防止在服务器上意外执行文件,无论是通过直接访问文件系统、Web服务器还是ASP.NET。其次,它使攻击者更难利用恶意上传,因为他们永远不应该能够猜测服务器上文件的名称或路径。


谢谢Michael!非常有价值的想法。由于网站目前正在开发共享主机,因此除非是第三方服务(例如dropbox或类似服务),否则无法使用外部位置。但这可能值得研究。我没有完全理解第二点,但可能是因为现在已经快12点了 :)。 - constantine g
最后一点尤其重要。这让我想到可以使用URL重写来隐藏真实的图像/目录路径,就像你所说的那样,重命名文件(例如某种唯一标识符)。此外,在SO上提出的一个很好的建议是始终调整上传的图像大小,以确保它们确实是图像(任何恶意内容也可能在此过程中变得损坏)。 - constantine g

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