target=“_blank”属性引入的漏洞总结
target=”_blank”应用场景
该属性通常情况主要注重相关用户体验而产生,其本意就是在用户点击一个链接的时候是否在新窗口中打开还是在原窗口打开进行分别,比如百度页面:当我们在百度搜索框中输入内容,然后点击“百度一下”时是不会跳出一个新页面,而在搜索结果列表时,点击列表链接是会重新跳出一个标签页或浏览器窗口(chrome中文网和旧版本ie不同,旧版本ie重新跳一个窗口,chrome是打开新标签页),新版本IE和Chrome都是打开新的标签页。
target=”_blank”安全隐患分析
使用该属性来打开新标签或者新窗口时,站点会通过window.openr API给了新页面对原有窗口的访问入口,并授予一些权限,其中window.location是没有被跨域限制拦截的。这可能就存在一个安全隐患
2.1 钓鱼例子
下是cmswing网站发布博文为例(纯属演示,请勿模仿):
测试页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script lang="javascript">
console.log(123,window.opener)
if (window.opener) {
alert('opener')
window.opener.location = 'http://www.baidu.com'
}
</script>
</body>
</html>
进入博客发布博文,点击超链接,输入演示网站,并选择新窗口页面打开:
其他按要求填写发布博文,回到博文列表看到自己刚发布的博文,并点开:
上图显示博文中有刚才插入的演示链接,点击链接发现以下情况:
因此可以发现,原页面已经跳到百度,此时非常明显地发现了原页面已经跳转,但是如果此时是黑客将原页面跳转至其精心模拟的社区盗版网站,并且页面标题一样,很少有人会去关注地址栏的信息变化。此时若是测试网站也是一个非常精美的网络段子,比如是糗事百科,我们还会因为搞笑而驻足浏览了很长时间,等到回到hi社区盗版网站时发现,网站提示你:多久多久没有操作,请重新登入,那么一登陆,黑客网站获取用户名密码同时返回给你一个正确的登入页面,不知不觉的被盗走了用户名密码。
上述这种情况,比较危险的是邮件中发来一个链接,比如验证登入等等之类,改密码之类的邮件都有链接。获取邮箱用户名密码后,还可以跟邮箱中的联系人进行链式钓鱼。
因此可以发现,原页面已经跳到百度,此时非常明显地发现了原页面已经跳转,但是如果此时是黑客将原页面跳转至其精心模拟的hi社区盗版网站,并且页面标题一样,很少有人会去关注地址栏的信息变化。此时若是测试网站也是一个非常精美的网络段子,比如是糗事百科,我们还会因为搞笑而驻足浏览了很长时间,等到回到hi社区盗版网站时发现,网站提示你:多久多久没有操作,请重新登入,那么一登陆,黑客网站获取用户名密码同时返回给你一个正确的登入页面,不知不觉的被盗走了用户名密码。
上述这种情况,比较危险的是邮件中发来一个链接,比如验证登入等等之类,改密码之类的邮件都有链接。获取邮箱用户名密码后,还可以跟邮箱中的联系人进行链式钓鱼
2.2 漏洞存在原理
当我们开发人员不注意添加rel=“noopener”(火狐浏览器中要使用rel="noopener noreferrer"完整覆盖)或者社区网站,邮件等可以添加链接的方式传播知识或重要的邮件时,这都很可能就被黑客用来进行钓鱼的一个可大可小的漏洞存在。
这其实就是利用target=”_blank”触发window.openr API实现,其中window.location还是浏览器跨域访问的漏网之鱼,利用这种方式,只要在链接网页的Javascript中添加以下代码就可以很容易实现钓鱼。
if(window.opener){
window.opener.location = "链接的网页地址";
}
2.4 解决方法
-
最简单的方法是所有跳转链接都在原窗口打开。
-
通过Java后台分析富文本中超链接所带的标签中是否存在target=”_blank”,存在则单独给标签添加rel=“noopener”属性。Rel属性可以很好的屏蔽关于target=”_blank”漏洞存在。这种方式最好是在后台编码添加这个属性,通过js方式并不是很好的防范措施。
-
由于大部分邮箱、博客等等网站存在这个漏洞,如果每一项都单独对页面修改会有非常大的工作量,并且会出现纰漏,因此对于这个漏洞的防范,最好通过写一个补丁文件来修补一个网站所有页面。
总结分析
关于target=”_blank”漏洞的发现已经有段时间,然后由于这个漏洞的攻击方式没有被展开,因此在短时间内还没有出现大规模的攻击案例,并且Google将该漏洞防范退给了浏览器,因此是被严重忽视的一个漏洞存在。
漏洞攻击都是存在随机性和盲目性,只有想不到,没有做不到。这种钓鱼方式所需要的成本会增加,但是对于攻击范围和攻击力度来说也是非常大的,当获取网站个人用户名密码后,完全可以实施链式钓鱼,并且这种链式钓鱼会呈现正反馈信任方式增加危险,当攻击了一个邮箱,那么通过该用户名和密码可以对邮箱内的成员攻击(甚至可以添加蠕虫代码自动攻击获取大量用户信息),此时已经是作为一个认识的人来操作带有黑客链接的网页了,增加了信任度。
因此解决上述存在漏洞是一个必要的条件,以防止真正大规模攻击实例出现。