【Web渗透】jQuery是怎么形成XSS的

最近有人问我怎么检测jQuery的XSS,之前因为有强大的扫描器,只管上报即可,没有认真的分析形成的原因。

这次真的给问倒了,于是自己搭了个环境来研究一下。

分了如下几个可能出现的问题来解决。

1、是否所有的jQuery都存在XSS漏洞?

首先答案是否认的,用如下的例子来解决这个问题。

之前被误导,在网上发现这个代码,说是用来检测jQuery的XSS代码。

var value = location.hash.split('#')[1]
$(value)

让我一度以为所有的jQuery都存在XSS。

其实这个代码,出现的原则是当你的代码以这样的形式出现的时候。

$(可被用户输入)

这个时候,你的代码就已经是存在隐患的了,而检测的代码正是如此。

并且这个代码还为攻击者做了帮手,它使用split('#')[1],这里的#被忽略掉了,如果你输入的是如下的地址。

/test.html#

那么在被这段代码处理了以后,结果就变成了。

因为jQuery是可以识别这种字符串的,并且它会被当做一个正确的字符串去匹配,还被正确匹配了,因为jQuery本来就具有这样的功能。

但是,如果你去掉这样的处理以后,像下面的这段代码。

$(function () {
    try { $(location.hash) } catch (e) { }
})

你就会发现,不是所有的jQuery都存在XSS漏洞。

经过测试,1.6(包含1.6版本)以及以下版本,在这段代码中,都弹窗了,也就是存在XSS。

1.7(包含1.7版本)以上版本,均没有弹窗。

那么引出第二和问题了。

2、jQuery中XSS漏洞形成的真正原因是什么?

经过打断点调试,得出以下结论:

    1、选择器正则表达式漏洞

    2、onerror执行JavaScript

在1.6版本中,它选择器的正则表达式是这样的

quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/

而到了1.7及其以上版本,它的选择器的正则表达是这样的。

rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/

如果想自己检测这个表达式,只要去掉头尾的/就是它的正则表达式。

两个表达式有明显的差异,输入相同的匹配文字。

#

1.6以下

共找到 1 处匹配:
#

1.7以上

(没有匹配)

所以可以说这个问题是由于正则表达式匹配不严谨带来的,并且伴随着

onerror="JavaScript代码"

使得在图片没有被正确加载的时候,在VM中执行了如下代码。

(function(event){// 被输入在onerror中的JavaScript代码
})

3、总结

其实在所有jQuery中想要形成XSS,前提都是需要$(可被用户输入)这样的代码。

但是在1.6版本以及以下版本中,错误的正则表达式使得它可以更容易的被利用。

 

最后推荐一个在线匹配正则表达式的网站。

https://c.runoob.com/front-end/854

4、交流

如果你是网络安全爱好者,欢迎加群交流:

【Web渗透】jQuery是怎么形成XSS的_第1张图片

QQ:425343603

你可能感兴趣的:(Web渗透)