防范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清理 - 易受攻击:这是直接查看,但文件已通过以下命令处理:
预期这会移除JavaScript,但并未成功。
1inkscape --file="xss.svg" --verb="FileVacuum" --export-plain-svg="sanitised.svg" - 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创建,除非另有说明。