新型文件上传绕过技术解析

本文详细介绍了在Outlook Web中发现的一种新型文件上传绕过技术,通过分析contentEditable特性与剪贴板操作的安全漏洞,展示了如何利用SVG文件嵌入恶意代码执行XSS攻击的技术细节和实际案例。

新型文件上传绕过技术

本文重点介绍文件上传绕过技术。

引言

在对Outlook Web进行安全研究期间,我发现了一个异常行为,并由此发现了一个安全漏洞。本文将解释我是如何发现这个问题、如何分析它以及为什么会发生这种情况。该漏洞目前正由微软处理,但发现和分析它的过程对其他安全研究人员可能很有用。本文主要关注如何绕过文件上传限制。

漏洞发现过程

最初,我想测试Outlook Web如何处理不同类型的文件。因此,我创建了一个test.svg文件,并通过两种不同的方式将其附加到电子邮件中:

第一种方法:附加文件(作为附件上传)

  • 当将SVG文件作为附件上传时,微软会使其可供下载。
  • 但在某些情况下,上传此类文件会被阻止。

第二种方法:复制/粘贴(Ctrl+C,Ctrl+V)文件到邮件正文

在这种情况下,文件不是作为下载提供,而是直接显示在邮件正文中!

这意味着SVG内容被嵌入到电子邮件中,没有任何安全过滤,并在接收方加载。

这种行为的差异对我来说似乎很不寻常,值得深入调查。

技术分析:为什么会发生这种情况?

contentEditable和designMode在Outlook Web中的作用

Outlook Web对邮件编辑区域使用contentEditable。此功能允许将HTML内容直接插入邮件正文。

当我附加SVG文件时,微软的服务器会处理该文件并对其应用安全规则。

但是,当我复制粘贴SVG时,其内容作为邮件HTML正文的一部分插入,并且没有对其应用任何安全过滤器!

这意味着微软仅对附加文件应用安全限制,但对粘贴内容不执行相同的检查。

什么是contentEditable及其工作原理?

contentEditable是HTML中的一个属性,允许用户直接编辑任何HTML元素,类似于文本编辑器。

按下Ctrl+C和Ctrl+V时浏览器中会发生什么?

步骤1:复制(Ctrl+C)

当您从计算机选择文件(例如test.svg)并按Ctrl+C时,会发生以下情况:

  1. 操作系统将文件放入剪贴板

    • 在Windows和macOS中,当您按下Ctrl+C时,与test.svg相关的数据存储在系统的剪贴板API中。
    • 这些数据可以包括原始文件字节、元数据,甚至其MIME类型(例如image/svg+xml)。
  2. 剪贴板API保存信息

    • 浏览器可以使用剪贴板API检查剪贴板中的内容。
    • 根据数据类型,浏览器可以从剪贴板检索文本、图像甚至完整文件。

步骤2:粘贴(Ctrl+V)到Outlook Web

当您在邮件正文中按Ctrl+V时,会发生几个重要的事情:

场景1:粘贴到contentEditable字段(Outlook Web)

由于Outlook Web使用contentEditable,浏览器会检查复制的数据:

  • 浏览器查询剪贴板API:“剪贴板中是否有文件或HTML内容?”
  • 如果有文件(如test.svg),浏览器检查是否允许将该文件类型直接粘贴到contentEditable字段中。
  • 由于SVG是基于文本的文件(基于XML),浏览器可能将其内容视为HTML文本而不是文件。
  • 因此,浏览器将test.svg的内容直接插入邮件正文——就像用户粘贴了HTML代码片段一样!

这就是允许SVG中的任何恶意代码执行的原因!

如何利用此行为?

通过利用这种意外行为,我能够在SVG文件中嵌入代码,从而实现多种类型的攻击。我将展示两个示例:

a) SVG中的iframe

一个限制是它不会使用IP或HTTP加载地址,因此我必须购买一个域名并在以下地址托管一个伪造的测试页面:https://yamikaza.com/fake.html

以下是嵌入的SVG代码:

1
2
3
4
5
6
7
<svg width="100vw" height="100vh">
    <foreignObject width="100%" height="100%">
        <body xmlns="http://www.w3.org/1999/xhtml" style="margin: 0; height: 100%;">
            <iframe src="https://yamikaza.com/fake.html" width="100%" height="100%" style="border: none;"></iframe>
        </body>
    </foreignObject>
</svg>

此代码导致伪造页面在attachment.outlook.live.net域内加载,这可能使用户看起来像是官方的Microsoft页面。

b) 在SVG中执行JavaScript(XSS)

1
2
3
4
5
6
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 124 124" fill="none">
  <rect width="124" height="124" rx="24" fill="#000000"/>
  <script type="text/javascript">
      alert(origin);
  </script>
</svg>

此代码证明了可以在attachment.outlook.live.net域上执行JavaScript。虽然此域无法访问outlook.live.com的cookie,但仍有可能在此子域内运行JavaScript代码。

我是如何测试此攻击的?

  1. 保存恶意SVG文件
  2. 使用Ctrl+C和Ctrl+V将其粘贴到邮件正文中
  3. 发送电子邮件
  4. 右键单击图像并复制其URL
  5. 此链接由Outlook自动生成,并准备好发送给受害者进行利用

结论

这项研究展示了上传文件和粘贴内容之间的差异如何导致安全漏洞。安全研究人员应始终调查意外行为,因为即使是最小的差异也可能导致重大的安全问题。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计