防御SVG中的XSS攻击:安全上传与显示指南

本文探讨SVG文件中的XSS风险,分析多种上传与显示场景的安全性,提供防护建议,包括直接查看、CSP策略、iframe沙箱等技术方案,帮助实现功能与安全兼顾。

防御SVG中的XSS攻击

2018年8月16日 星期四

这项研究始于我为客户进行测试时,客户要求允许SVG文件上传并在网站上显示。大多数人认为SVG文件与PNG或GIF类似是图像文件,但实际上它们是描述图像的XML文件。安全人员关注的是它们还可以包含JavaScript,在图像渲染时执行。w3schools.com对此有很好的介绍。

由于能够包含JavaScript,SVG成为跨站脚本(XSS)的完美攻击向量,适用于允许任意文件上传或限制文件类型为图像并接受SVG的网站。以下是一些受此问题影响的网站示例:

  • Ubuquiti Networks
  • Paragon Initiative Enterprises
  • Lutim

由于客户需求是固定的,我必须提出一些建议,以在允许功能的同时防御XSS攻击(记住,安全应该启用功能,而不是简单地说“不”)。在SANS GPWN列表上进行一些讨论后,我们提出了以下文件访问或显示方式,如您所见,有些是安全的,但有些不是,JavaScript被执行了。

  • 直接查看 - 易受攻击:文件直接链接。

  • 带有content-disposition: attachment的直接查看 - 不易受攻击:发送标头以强制文件下载。

  • 带有CSP的直接查看 - 不易受攻击:内容安全策略设置为不允许内联JavaScript。

  • 图像标签 - 不易受攻击:SVG通过图像标签引用,防止脚本。

  • 带有CSP的标签 - 不易受攻击:图像标签和相同的CSP,提供双重保护。

  • 通过Inkscape清理 - 易受攻击:这是直接查看,但文件已通过以下命令处理: inkscape --file="xss.svg" --verb="FileVacuum" --export-plain-svg="sanitised.svg" 预期这会删除JavaScript,但并未实现。

  • iframe中的图像 - 易受攻击:SVG作为iframe的源加载,未设置特殊属性。

  • 沙盒iframe中的图像 - 不易受攻击:SVG作为iframe的源加载,但沙盒属性设置为阻止脚本。

如您所见,有多种选项允许安全上传和显示文件,这意味着客户可以愉快地保持其功能,同时保护自己和用户的安全。

如果您想查看这些场景的实际效果,我准备了以下演示:SVG XSS防御场景,实现了所有上述场景。您还可以从我的GitHub仓库获取完整代码副本。

最近存档

  • SteelCon Ninja Run 2022
  • Cracked Flask Lab
  • WSL2 DNS Oddness
  • Splitting XSS payloads
  • Alert Function Hijacking
  • The CORS Demos
  • Entering a new community
  • Out running with friends at SteelCon 2019
  • An odd quirk with XSS through JavaScript URI
  • Becoming More Accessible
  • Using HTTP Pipelining to hide requests
  • Domain Fronting with Cloudflare
  • Domain Fronting with CloudFront
  • A 101 on Domain Fronting
  • More …

支持本站

本站上的任何项目均未获得报酬,因此如果您想支持我的工作,可以通过使用下面的联盟链接来实现,我会获得账户积分或现金返还。通常只有几分钱,但它们会积少成多。

给我买一杯冰沙

所有内容均由Robin Wood创建,除非另有说明。

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