点击劫持

点击劫持

点击劫持(ClickJacking)本质上是一种视觉欺骗手段,攻击者将需要攻击的网站嵌入到自己网页中,然后诱导用户在网页上进行操作。

在移动端,点击劫持通常被称为触屏劫持(TapJacking),攻击原理与 PC 端大致相同。

嵌入元素

点击劫持实现的基础是需要将被攻击的网站嵌入到自己的网页中,嵌入的方式有以下四种:

frame

由于性能问题,以及使用屏幕阅读器的用户缺少可访问性,这种方式已废弃。

iframe

用于包含来自其他域或子域的资源,当然也可用于包含同域的内容。iframe 的优势在于嵌入的内容是”实时”的,并且可以与父文档进行通信。

embed

用于嵌入浏览器插件的内容,也可以嵌入 SVG 和 HTML。

object

表示引入外部资源,这个资源可以是图片、文档之类的。

emberobject 的作用相同,都是嵌入外部资源;但 object 只支持 IE 系列浏览器。

防御

点击劫持是一种视觉欺骗,通常的攻击手段是 iframe。因此,防御点击劫持的方法也主要从这方面入手。

X-Frame-Options

通过在嵌入页面的响应头中增加 X-Frame_Options 字段来限制是否允许被其他网站嵌入。

X-Frame-Options 属性包含三个值:

  • deny

    不允许在 iframe 中展示

  • sameorigin

    只允许被同域的页面嵌入

  • allow-from uri

    可以被指定来源的页面嵌入

Frame busting

通过 window.topwindow.self 等信息比较来判断是否被嵌入到 iframe。通常情况下,网页的 window.top === window.self,但如果被嵌入到其他网站时,window 指网页自身,window.top 指嵌套网页的容器;可以通过判断两者信息来防止网站被嵌套。

img

frame-ancestors

Content Security Policy Level 2 中在 Content-Security-Policy 响应头中新增了 frame-ancestors 属性,用于设置哪些网站允许通过 iframeembed 等方式嵌入当前资源。

1
Content-Security-Policy: frame-ancestors <source> <source>;

source 可以是下面这些值:

  • scheme-source

    1
    scheme-source     = scheme-part ":"
  • host-source

    1
    host-source       = [ scheme-part "://" ] host-part [ port-part ] [ path-part ]

    host-source 指主机的域名或 IP 地址,可以使用通配符(*

    1
    2
    3
    4
    5
    *.demo.com;

    mail.demo.com:*;

    https://demo.com;
  • self

    self 指向当前资源所在的源,也就是只允许同源的站点嵌入该资源

  • none

    none 的效果与 X-Frame-Options: deny 一致,不允许被嵌入