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

本文探讨SVG文件中的XSS攻击风险,分析不同展示方式的安全性,提供防护建议,包括直接查看、CSP策略、iframe沙箱等场景,帮助开发者在允许SVG上传的同时确保安全。

防范SVG中的XSS攻击

2018年8月16日 星期四

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

由于SVG能够包含JavaScript,它们成为跨站脚本(XSS)攻击的完美载体,特别是对于那些允许任意文件上传或限制文件类型为图像但接受SVG的网站。以下是一些受此问题影响的网站示例:

  • Ubuquiti Networks
  • Paragon Initiative Enterprises
  • Lutim

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

  • 直接查看 - 易受攻击:文件直接链接。
  • 带有content-disposition: attachment的直接查看 - 不易受攻击:发送标头强制文件下载。
  • 带有CSP的直接查看 - 不易受攻击:内容安全策略设置为禁止内联JavaScript。
  • 图像标签 - 不易受攻击:SVG通过图像标签引用,防止脚本执行。
  • 带有CSP的标签 - 不易受攻击:图像标签和相同的CSP,提供双重保护。
  • 通过Inkscape清理 - 易受攻击:这是直接查看,但文件已通过以下命令处理:
    1
    
    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 设计