SVG在Web攻击中的应用


SVG在Web攻击中的应用

文章插图
【SVG在Web攻击中的应用】0x00 前言
在过去几周中 , FortiGuard Labs一直在研究带有SVG(Scalable Vector Graphics)图像的Web应用 。根据研究结果 , 我们找到了Web应用中的一些常见问题 。在本文中 , 我们简要介绍了SVG的特点以及针对SVG图像的常见攻击面 。
根据之前的研究结果 , 我们梳理了一些常见的SVG攻击方式 , 如下所示:
  • 跨站脚本(Cross-Site Scripting)
  • html注入
  • XML实体:“Billion Laughs”攻击(针对XML文档解析器的一种DoS攻击)
  • DoS(拒绝服务):新型SVG “Billion Laughs”攻击 。
0x01 SVG简介
SVG的全称为 Scalable Vector Graphics(可缩放矢量图) , 是一种基于XML的二维矢量图格式 , 支持交互性及动画展示 。SVG图像及具体行为由XML文本文件定义 , 可以通过任何文本编辑器以及绘图软件来创建并编辑 。目前所有主流web浏览器都支持渲染SVG图像 。
来观察一个示例 , 更好理解SVG图像 。如下图所示 , 我们编写了一些代码来渲染SVG图像:
SVG在Web攻击中的应用

文章插图
 
图1. simple.svg代码片段
将该图像保存为simple.svg , 然后直接打开 , 或者将其包含在img/image/object/embed HTML标签中 , 如下图所示:
SVG在Web攻击中的应用

文章插图
 
图2. 通过代码渲染图像
图1代码渲染生成的图像如图2所示 , 这是rect元素 , 浏览器会在x, y (100, 100)(即宽度和高度)位置渲染一个红色矩形 。
0x02 使用SVG的攻击场景
虽然SVG提供了较大的灵活性 , 可以方便创建更多的动态web内容 , 但同时也引入了一些安全风险 。在下文中 , 我们将讨论一些常见的攻击向量 , 我们在互联网上的一些主流站点上都观察到过这些攻击方式 。
跨站脚本
我们可以通过脚本方式来访问并修改SVG文档的任何内容 , 这与HTML操作方式类似 。默认的脚本语言为ECMAScript(与JAVAScript密切相关) , 每个SVG元素及属性都对应已定义的DOM(Document Object Model , 文档对象模型)对象 。相关脚本被封装在<script>元素中 。
这意味着如果web服务器允许用户上传任意SVG图像 , 就存在XSS(跨站脚本)安全风险 。如下所示 , 我们将脚本存放在图像中:
SVG在Web攻击中的应用

文章插图
 
图3. xss.svg代码片段
将该图像保存为xss.svg , 然后直接打开 , 如下图所示:
SVG在Web攻击中的应用

文章插图
 
图4. 直接访问该文件触发XSS
如果将该文件链接到某个HTML页面 , 访问该页面也可以触发 , 如下图所示:
SVG在Web攻击中的应用

文章插图
 
图5. 通过链接文件触发XSS
JavaScript代码会在浏览器上下文中执行 , 这意味着攻击者可以使用该文件执行恶意行为 , 比如窃取用户隐私信息等 。
HTML注入
在某些情况下 , XSS payload会被服务端过滤 , 然而我们依然能够通过SVG图像的特定功能来注入HTML代码 。如前文所述 , SVG是基于XML的一种矢量图 , 因此我们无法简单将HTML内容放入其中 , 不然会破坏XML的语法 。
为了避免这种情况 , SVG提供了一个foreignObject元素 , 可以用来包含来自其他XML命名空间的元素 。在浏览器上下文中 , 这部分数据很可能采用(X)HTML形式 。
来看一下html.svg图像:
SVG在Web攻击中的应用

文章插图
 
图6. html.svg代码片段
当我们在foreignObject内添加一个body标签以及XHTML命名空间时 , 可以使用xmlns属性来声明命名空间 。采用这种方式 , 浏览器会将body标签及其所有子标签解析为属于XHTML的元素 。因此 , 我们可以将来自SVG的任意XHTML代码渲染到页面中:
SVG在Web攻击中的应用

文章插图
 
图7. HTML注入漏洞


推荐阅读