概述

点击劫持是一种视觉上的欺骗手段。

黑客使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,
此时用户将在不知情的情况下点击透明的iframe页面。

通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,从而使用户完成不知情的操作。

攻击类型

图片覆盖攻击

图片覆盖攻击,Cross Site Image Overlaying攻击,简称XSIO。

例如,以下代码:

1
2
3
4
<a href="http://disenchant.ch">
<img src=http://disenchant.ch/powered.jpg
style=position:absolute;right:320px;top:90px;/>
</a>

通过调整图片的style使得图片能够覆盖在黑客所指定的任意网页位置。

如果用户打算点击网页的的logo,而此logo已经被黑客的图片所覆盖,那么点击后就会链接到http: //disenchant. ch。如果 http: //disenchant. ch 是钓鱼网站,那用户很可能会上当。

拖拽劫持与数据窃取

  1. 背景

    很多浏览器都开始支持Drag & Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的

  2. 攻击思路

    拖拽劫持的思路是诱使用户从隐藏的不可见iframe中“拖拽”出黑客希望得到的数据,
    然后放到黑客能控制的另外一个页面中,从而窃取数据。

    所以拖拽部分为iframe中黑客想要的数据,即正常的页面。

    放置部分为黑客控制页面,黑客可以从这里获取这部分数据

  3. 例子

    黑客制作了一个网页小游戏,将球拖拽到小海豹的头顶上

    image-20240607173659420

    小球和小海豹的头顶都有隐藏的iframe。

    黑客利用event.dataTransfer.getData(‘Text’)来获取“drag”到的数据。当用户拖拽小球时,实际上是选中了隐藏的iframe里的数据;在放下小球时,把数据也放在了隐藏的textarea中,从而完成一次数据窃取的过程。

触屏劫持

image-20240607174131863

image-20240607174143674

点击劫持防御

一般是通过禁止跨域的iframe来防范

frame busting

通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫frame busting。

例如:

1
2
3
if ( top.location != location ) {
top.location = self.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扩展也可以防御。