Skip to main content

ClickJacking 点击劫持

一、点击劫持的定义

点击劫持(ClickJacking)是一种视觉欺骗的攻击手段。攻击者使用一个透明的、不可见的 iframe 覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的 iframe 页面。通过调整 iframe 页面的位置,可以诱使用户恰好点击在 iframe 页面的一些功能性按钮上。

二、点击劫持的特点

  • 隐蔽性较高,骗取用户操作
  • "UI-覆盖攻击"
  • 利用iframe或者其它标签的属性

三、如何防御点击劫持

1、X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一个为了防御用 iframe 嵌套的点击劫持攻击的 HTTP 响应头。

该响应头有三个值可选:

  • DENY:表示页面不允许通过 iframe 的方式展示;
  • SAMEORIGIN:表示页面可以在相同域名下通过 iframe 的方式展示;
  • ALLOW-FROM:表示页面可以在指定来源的 iframe 中展示。

2、通过 JS 禁止 iframe 的嵌套

通过 JS 禁止 iframe 的嵌套称为 frame busting,某些远古浏览器不能支持上面的这种方式,只能通过 JS 的方式来防御点击劫持。

<head>
<style id="click-jack">
html {
display: none !important;
}
</style>
</head>

<body>
<script>
if (self == top) {
var style = document.getElementById('click-jack')
document.body.removeChild(style)
} else {
top.location = self.location
}
</script>
</body>

以上代码的作用就是当通过 iframe 的方式加载页面时,攻击者的网页直接不显示所有内容了。

常见的 frame busting 有以下这些方式:

if (top ! = self)
if (top.location ! = self.location)
if (top.location ! = location)
if (parent.frames.length > 0)
if (window ! = top)
if (window.top ! == window.self)
if (window.self ! = window.top)
if (parent && parent ! = window)
if (parent && parent.frames && parent.frames.length>0)
if((self.parent&&! (self.parent===self))&&(self.parent.frames.length! =0))
top.location = self.location
top.location.href = document.location.href
top.location.href = self.location.href
top.location.replace(self.location)
top.location.href = window.location.href
top.location.replace(document.location)
top.location.href = window.location.href
top.location.href = "URL"
document.write('')
top.location = location
top.location.replace(document.location)
top.location.replace('URL')
top.location.href = document.location
top.location.replace(window.location.href)
top.location.href = location.href
self.parent.location = document.location
parent.location.href = self.document.location
top.location.href = self.location
top.location = window.location
top.location.replace(window.location.pathname)
window.top.location = window.self.location
setTimeout(function(){document.body.innerHTML=''; },1);
window.self.onload = function(evt){document.body.innerHTML=''; }
var url = window.location.href; top.location.replace(url)

但是 frame busting 也存在一些缺陷。由于它是用 JavaScript 写的,控制能力并不是特别强,因此有许多方法可以绕过它。

四、与 XSS 和 CSRF 的区别

ClickJacking 相对于 XSS 与 CSRF 来说,因为需要诱使用户与页面产生交互行为,因此实施攻击的成本更高,在网络犯罪中比较少见。但 ClickJacking 在未来仍然有可能被攻击者利用在钓鱼、欺诈和广告作弊等方面,不可不察。