Bubbles~blog

用爱发电

xss in jquery

最近一直在看前端,研究了一下jquery框架,单论框架的话这个差不多应该是最火的吧,而且也确实非常简单方便,很容易上手,既然是前端框架那么相应的漏洞差不多就是xss,csrf之类的,这里先试试jquery使用中可能导致的xss

当然,毕竟jquery使用量这么大,被这么多人不断测试,要说找危害很大的漏洞是很难了,这里举的几个也大都是对输入的过滤不当或者函数使用不当

在jquery里我们可以直接向$里传入一些字符生成Dom元素,如果这一行为可以被用户操纵的话那就十分危险了

<head>
<script src="http://code.jquery.com/jquery-2.1.4.js">
</script>
</head>
<body>
<script type="text/javascript">
    var x=location.hash.split('#')[1];
    $(x)
</script>
</body>
</code>

在#后就可以接上我们的测试语句,使用

<img src=2 onerror=confirm(1)>
<img src=2 onerror=alert(1)>
</code>

基本随便弹

或者我们也可以使用一些函数来达到类似效果,jquery里添加元素的方法有很多

<script>
    var x=location.hash.split('#')[1];
    $(document.body).append(x);
</script>

像类似的函数还有
after()
append()
appendTo()
before()
html()
insertAfter()
insertBefore()
prepend()
prependTo()
replaceAll()
replaceWith()
unwrap()
wrap()
wrapAll()
wrapInner()
prepend()

当然,对于某些函数我们还是无能为力的,像是text()方法,当用它来传递文本时,它会调用createTextNode,转义所有特殊字符,而上面几种方法当检测到标签时会调用createElement来创建一个节点,所以我们传入一个script标签就能顺利执行xss了
其实js自带的innerHTML也会这么干,但是得益于浏览器加载js时只会在页面加载时执行一次,所以传入的标签实际上还是相当于当作文本处理了,所以无法触发xss,这一点上innerHTML和text()是相似的
使用text()时,我们可能会传入

$(document.body).text('<img src=1 onerror=alert(1)>');

但是实际上会变成

$(document.body).text('&amp;lt;img src=1 onerror=alert(1)&amp;gt;');
</code>

其实感觉危害比较大的还是jquery结合location.hash,真要碰上这样写的那也算是危害挺大的洞了,现在应该是很少见了
这里举一个典型的location.hash的例子

<body>
<script>
(function() {  
    var fromurl = window.location.href,  
        tourl = originalUrl.split('#')[1];  
    if (toUrl) {  
        window.location.href = toUrl;  
    }  
})();  
</script>
</body>

我们还是可以在#后接上攻击代码,这里要利用JavaScript伪协议

www.xxx.com/index#javascript:alert(document.cookie);

一定要在输入上做好过滤,才能避免被恶意攻击