赞
踩
最近有人问我怎么检测jQuery的XSS,之前因为有强大的扫描器,只管上报即可,没有认真的分析形成的原因。
这次真的给问倒了,于是自己搭了个环境来研究一下。
分了如下几个可能出现的问题来解决。
首先答案是否认的,用如下的例子来解决这个问题。
之前被误导,在网上发现这个代码,说是用来检测jQuery的XSS代码。
- var value = location.hash.split('#')[1]
- $(value)
让我一度以为所有的jQuery都存在XSS。
其实这个代码,出现的原则是当你的代码以这样的形式出现的时候。
$(可被用户输入)
这个时候,你的代码就已经是存在隐患的了,而检测的代码正是如此。
并且这个代码还为攻击者做了帮手,它使用split('#')[1],这里的#被忽略掉了,如果你输入的是如下的地址。
/test.html#<img src=1 onerror=alert(1) />
那么在被这段代码处理了以后,结果就变成了。
<img src=1 onerror=alert(1) />
因为jQuery是可以识别这种字符串的,并且它会被当做一个正确的字符串去匹配,还被正确匹配了,因为jQuery本来就具有这样的功能。
但是,如果你去掉这样的处理以后,像下面的这段代码。
- $(function () {
- try { $(location.hash) } catch (e) { }
- })
你就会发现,不是所有的jQuery都存在XSS漏洞。
经过测试,1.6(包含1.6版本)以及以下版本,在这段代码中,都弹窗了,也就是存在XSS。
1.7(包含1.7版本)以上版本,均没有弹窗。
那么引出第二和问题了。
经过打断点调试,得出以下结论:
1、选择器正则表达式漏洞
2、onerror执行JavaScript
在1.6版本中,它选择器的正则表达式是这样的
quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/
而到了1.7及其以上版本,它的选择器的正则表达是这样的。
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/
如果想自己检测这个表达式,只要去掉头尾的/就是它的正则表达式。
两个表达式有明显的差异,输入相同的匹配文字。
#<img src=1 onerror=alert(1) />
1.6以下
- 共找到 1 处匹配:
- #<img src=1 onerror=alert(1) />
1.7以上
(没有匹配)
所以可以说这个问题是由于正则表达式匹配不严谨带来的,并且伴随着
onerror="JavaScript代码"
使得在图片没有被正确加载的时候,在VM中执行了如下代码。
- (function(event){// 被输入在onerror中的JavaScript代码
- })
其实在所有jQuery中想要形成XSS,前提都是需要$(可被用户输入)这样的代码。
但是在1.6版本以及以下版本中,错误的正则表达式使得它可以更容易的被利用。
最后推荐一个在线匹配正则表达式的网站。
https://c.runoob.com/front-end/854
如果你是网络安全爱好者,欢迎加群交流:
QQ:425343603
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。