【问题标题】:Whitelist or blacklist file extensions for uploads?上传的白名单或黑名单文件扩展名?
【发布时间】:2012-03-10 18:32:15
【问题描述】:

我正在制作一个允许文件上传的通讯编辑器(通讯的发件人可以将文件上传到将在电子邮件中链接到的服务器)。

该站点已设置为只有 .do URI 由 servlet 实际执行/处理,因此安全风险不大,但有人告诉我将 .jsp、.php、.asp、.aspx 列入黑名单, .exe、.com 和 .bat。这不是一个全面的黑名单,我觉得黑名单不是一个好政策。

另一方面,白名单会长达几十个。识别允许/不允许扩展的正确方法是什么?还是只允许任何东西并通过病毒扫描程序运行它,或者这些的某种组合更合适?

【问题讨论】:

    标签: security policy


    【解决方案1】:

    我将允许上传任何文件扩展名,但我会将文件存储在 Web 服务器不直接提供服务的文件夹中。然后,我将创建一个从电子邮件链接到的 HTTP 处理程序,该处理程序将流式传输请求的文件。该文件可以通过原始文件名、系统生成的文件名或 ID 来请求。无论哪种方式,我都会清理参数以防止目录遍历攻击。

    例如www.example.com/FileLink.ashx?FileName=Word.docx

    这样,如果将来您希望将其他文件扩展名作为可执行文件类型提供服务,则无需担心,因为任何文件都是直接从文件系统的字节流提供的,并且永远不会通过 Web 服务器处理程序传递。

    您还可以使用处理程序检查当前用户是否具有加载文件的正确权限。

    还值得对每个文件进行病毒扫描,以防通讯作者上传(恶意或意外)会攻击订阅者计算机而不是服务器的文件。

    还要确保将Content-Disposition 设置为attachment

    Content-Disposition: attachment; filename="filename.html"
    

    这可以防止通过上传包含脚本标签的 HTML 或其他同源策略 bypasses using Flash or PDF files 来实现 XSS。这里的场景是一位时事通讯编辑破坏另一位时事通讯编辑的会话。还值得设置X-Content-Options: nosniff,它也可以防止这种情况。 xap 文件 (Silverlight) 也可以绕过同源策略,因此请检查文件名不能以 .xap 结尾以请求您的文件

    例如www.example.com/FileLink.ashx/x.xap?FileName=Word.docx

    您可以将 Silverlight 的内容类型设置列入黑名单,作为对这种特殊情况的额外保护。 Source here:

    注意:.XAP 文件可以重命名为任何其他扩展名,但不能 不再加载跨域。 Silverlight 似乎找到了该文件 基于提供的 URL 的扩展名,如果不是 .XAP,则忽略它。 如果网站允许用户使用“;”,这仍然可以被利用。要么 在实际文件名后添加“/”以添加“.XAP”扩展名。

    注意:当 Silverlight 跨域请求 .XAP 文件时,内容 类型必须是:application/x-silverlight-app。

    我自己也验证了这些场景,它们是当前有效的攻击媒介。

    【讨论】:

      【解决方案2】:

      我会推荐你​​:

      • 使用白名单方法(由于上述原因,这是公平的 更安全)
      • 检查文件类型(可绕过,但还有一种措施)
      • 将上传的文件存储在不公开的内部文件夹中(使用非枚举 ID)
      • 为包含上传文件的文件夹设置低级权限
      • 为上传的文件设置尽可能少的权限
      • 确保没有安全库可以上传文件。

      杀毒软件不值得。大多数 web shell 签名都很容易绕过,因为任何“黑客”都可以添加一些随机代码并在 web shell 上进行不同类型的编码。当然,它会保护您免受 C99 等常见 shell 的攻击,但如今有数千种此类工具可供公开使用且完全无法检测到。关于保护您的用户免受您网站上托管的可执行文件或受感染的 PDF 的侵害,如果有人能够在您的网站上获取 shell 并启动恶意软件活动,它将不会使用已被 av 签名发现的恶意软件或病毒。

      【讨论】:

        【解决方案3】:

        或者只允许任何东西并通过病毒扫描程序运行它更合适。

        是的。

        黑名单和白名单都被轻而易举地规避了,只会造成管理上的痛苦,并且不提供任何安全性。

        【讨论】:

        • 病毒扫描程序和黑白名单解决了两个不同的问题。病毒扫描程序是为了确保上传的文件可以被客户端安全下载。黑/白名单有助于减轻潜在的远程代码执行漏洞。我相信白名单是这样做的首选方式。您也可以将文件名存储在数据库中,并在服务器端使用数据库记录ID作为文件名。
        【解决方案4】:

        在我看来,即使维护白名单可能有点麻烦,但它比使用黑名单安全得多。

        忘记在白名单中添加一些东西,而不得不返回并更改它,比忘记向黑名单中添加新的文件扩展名并被黑客入侵要好得多。

        除了白名单,我还会对上传的文件进行病毒扫描,因为即使看似无害的文件(如 .pdf 或 .doc)也可能包含恶意代码(.pdf 支持 javascript 和 .doc 宏)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          • 2015-01-03
          • 1970-01-01
          • 2013-09-08
          相关资源
          最近更新 更多