前端api漏洞-jquery DOM型漏洞
1、漏洞介绍
漏洞编号:CVE-2016-7103、CVE-2015-9251、CVE-2014-6071、CVE-2012-6708、CVE-2011-4969
漏洞环境:jquery
影响范围:
- 1.x系列版本等于或低于1.12的jQuery
- 2.x系列版本等于或低于2.2的jQuery
漏洞原理:$(val)形式的jquery代码,由于某些版本的jquery的解析规则存在漏洞,导致将参数val解析为html元素执行,如果其是<img src=1 onerror=alert(‘xss’)>类似的值,会解析触发js。
由于经常搭配hash作为参数被利用,所以称作jquery dom-based漏洞。
2、测试和复现
(1)引入jquery
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
(2)poc
<script>
//(1)基于img标签执行xss,成功执行
$("<img src='xx' onerror='alert(/a1b2/)'>")
//(2)测试script和iframe标签是失败的,没有报错,但是不引入外部js,也不执行js伪代码
$("<script src='test_j.js'><\/script>")
$("<iframe src='javascript:alert(/xss/)'></iframe>")
//(3)img标签执行过程可以拆分
s = "<img onerror='alert(/a1b2/)'>"
obj = $(s)
obj.attr('src', 'xx')
//(4)或者
$("<img onerror='alert(/abc/)'>").attr('src','xx')
</script>
- 注意,作为$的参数值,可以是直接的字符或者js转义,不能是url编码。且必须是一个直接的html标签,不能添加#等前缀
- 在Edge、chrom、firefox浏览器都测试成功。
3、漏洞发现和利用
(1)漏洞发现
- 确定jquery的版本,是否存在该漏洞。
- 可以查看jquery文件,然后搜索version,是否存在注释或者变量
- 如果进行了文件重命名或者删除版本信息,可以与jquery库进行比较
- 存在$(val)形式的js代码,分析参数val的来源,是否可受攻击者控制
(2)漏洞利用
该漏洞一般是基于dom型xss,攻击者将待解析的payload保存在hash部分,但是还需要页面内存在截取#之后的文本,以及对其url解码,否则无法解析。
(貌似,Safari 浏览器js读取hash会自动进行js解码,所以无需再手动对hash进行js解码,直接的$(location.hash))
当然,其他处传递过来的文本也是可以的。
4、漏洞防护
- 最好的就是升级版本,避开存在该漏洞的版本
- 其次,尽量避免$中的变量被用户控制
- 还可以对$中的变量提前进行过滤和实体编码
- 对jquery文件重命名和删除版本标识,使攻击者无法简单判断版本也是临时之举