『跨站脚本攻击』点击劫持
概述
点击劫持是一种视觉上的欺骗手段。
黑客使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,
此时用户将在不知情的情况下点击透明的iframe页面。
通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,从而使用户完成不知情的操作。
攻击类型
图片覆盖攻击
图片覆盖攻击,Cross Site Image Overlaying攻击,简称XSIO。
例如,以下代码:
1 | <a href="http://disenchant.ch"> |
通过调整图片的style使得图片能够覆盖在黑客所指定的任意网页位置。
如果用户打算点击网页的的logo,而此logo已经被黑客的图片所覆盖,那么点击后就会链接到http: //disenchant. ch
。如果 http: //disenchant. ch
是钓鱼网站,那用户很可能会上当。
拖拽劫持与数据窃取
背景
很多浏览器都开始支持Drag & Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。
攻击思路
拖拽劫持的思路是诱使用户从隐藏的不可见iframe中“拖拽”出黑客希望得到的数据,
然后放到黑客能控制的另外一个页面中,从而窃取数据。所以拖拽部分为iframe中黑客想要的数据,即正常的页面。
放置部分为黑客控制页面,黑客可以从这里获取这部分数据
例子
黑客制作了一个网页小游戏,将球拖拽到小海豹的头顶上
小球和小海豹的头顶都有隐藏的iframe。
黑客利用event.dataTransfer.getData(‘Text’)来获取“drag”到的数据。当用户拖拽小球时,实际上是选中了隐藏的iframe里的数据;在放下小球时,把数据也放在了隐藏的textarea中,从而完成一次数据窃取的过程。
触屏劫持
点击劫持防御
一般是通过禁止跨域的iframe来防范
frame busting
通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫frame busting。
例如:
1 | if ( top.location != location ) { |
由于frame busting是用JS写的,控制能力并不是特别强,因此有许多方法可以绕过它。
例,对parent.location的frame busting,就可以采用嵌套多个iframe的方法绕过。
X-Frame-Options
因为frame busting存在被绕过的可能,一般使用HTTP头——X-Frame-Options来进行防御。
它有三个可选的值:
- DENY:浏览器会拒绝当前页面加载任何frame页面;
- SAMEORIGIN:frame页面的地址只能为同源域名下的页面;
- ALLOW-FROM origin:允许frame加载的页面地址;
一些浏览器拓展,如Firefox的NoScript扩展也可以防御。