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

Posted

技术标签:

【中文标题】向 IIS_IUSRS 授予删除权限的启用 Web 的文件存储和安全隐患【英文标题】:Web-enabled file storage and security implications of giving delete permission to IIS_IUSRS 【发布时间】:2012-10-21 14:21:52 【问题描述】:

这个问题我已经有很多年了,每次出现这个问题时都会进行研究,但始终找不到明确的答案。不知何故,强大的 Internet、MSDN、社区论坛对此要么保持沉默,要么含糊其辞。在数以千计的与发展相关的不确定性中,这是唯一一个难以捉摸的。

直截了当:为了使用户能够在共享托管环境中上传和管理其博客文章中使用的图像(和其他文件),我可以考虑使用 SQL Server 二进制数据类型(性能影响)或文件系统。要使用后者,需要为存储目录上的 IIS_IUSRS 角色设置必要的权限:创建/写入、读取和删除。我的问题 - 如果我这样做,安全隐患是什么?有人能以某种方式利用这一点,绕过 ASP.NET 请求管道并操作文件夹中的文件,而不向相应的 ASP.NET 处理程序(检查权限、验证上传等)发出请求吗?

我开发了几个允许文件上传的系统,这一直困扰着我。现在,希望有人能够让我放心,并在理想情况下解释这个过程背后的机制。


更新

查看最新答案后(非常感谢),问题的另一种表述:

客户端是否有可能以某种方式绕过请求管道并在允许它的目录中创建/删除文件(假设该人知道目录结构)?还是只有处理请求的代码才能做到?任何潜在的漏洞利用?

【问题讨论】:

【参考方案1】:

主要的问题是能够上传一个脚本,一个aspx页面,在这个带有照片文件的目录中,并运行它。

这是一种情况:I've been hacked. Evil aspx file uploaded called AspxSpy. They're still trying. Help me trap them‼

解决方案是在允许上传文件但不允许运行任何 aspx 页面的目录中添加这个额外的 web.config 文件。如果他们有机会重命名,还要仔细检查以仅允许您允许的扩展名,并且不允许更改文件名上的扩展名。

<configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

同样在您允许上传文件的目录上,不允许运行任何其他脚本,如简单的 asp、php 或 exe,或任何其他脚本。

一般来说

您的所有页面都有权在服务器上运行和操作许多内容。您现在提供的是write 在某些目录上的能力,也可以通过使用一些 aspx 页面。 asp.net 现在多了一项额外的权限,可以在照片文件夹中写入文件。还要注意这里,你的 asp.net 页面有这个控件,而不是用户。你用你的代码做的事情可以写在这个目录上,所以必须小心仔细检查你写的地方,不允许任何其他目录,不允许用户操作可以写入的目录。

所以这是薄弱环节。为了能够上传更多可以控制服务器的脚本,至少是该池的 asp.net 用户可以访问的部分。

【讨论】:

是的,这里的要点很好。感谢您的链接。没有考虑使用 web.config 来禁止在子文件夹中执行 aspx。因此,除了不使用原始文件名/扩展名之外,它还可以放在具有写入权限的子目录的上一级作为额外的预防措施。 所以你的意思是客户端不可能绕过请求管道并在允许它的目录中创建/删除文件(假设该人知道目录结构) ?只有处理请求的代码才能做到吗?有什么潜在的利用吗?这就是我的问题的本质。 @constantineg 使用的 asp.net 没有目录的写入权限,只有读取和运行的权限。实际上,有两个帐户可以共同运行 asp.net。用户和池。它们都具有有限的权限,但是如果您允许在目录上写入,则可以创建代码来运行并执行更多操作 - 打开权限等......所以重点是不允许上传任何脚本。 【参考方案2】:

在此之前,我会提出两个建议:

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

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

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

【讨论】:

谢谢迈克尔!有价值的想法。由于该网站目前正在开发用于共享托管,因此不可能拥有外部位置,除非它是第三方服务(例如保管箱或类似服务)。但这可能值得研究。我不太明白第二点,但可能是因为这里快 12 点了:)。 最后一点尤为重要。这让我沿着这些思路思考:使用 URL 重写来隐藏真实的图像/目录路径,就像你说的那样,重命名文件(例如某种形式的唯一 ID)。此外,这里关于 SO 的一个很好的建议是始终调整上传图像的大小以确保它们是真正的图像(任何恶意内容也可能在此过程中损坏)。

以上是关于向 IIS_IUSRS 授予删除权限的启用 Web 的文件存储和安全隐患的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 笔记本电脑中找不到 IIS_IUSRS 组

IIS8 中的 IIS_IUSRS 和 IUSR 权限

在 Apache Pulsar 中授予命名空间权限

授予特定本地 Windows 用户组对文件夹及其子文件夹的读取权限

启用/禁用 RLS 和授予/撤销权限有啥区别

如何授予帐户列出已启用 API 的权限?