博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Clickjacking简单介绍
阅读量:7087 次
发布时间:2019-06-28

本文共 3207 字,大约阅读时间需要 10 分钟。

瞌睡龙 · 2013/05/20 18:37

0x00 相关背景介绍

Clickjacking(点击劫持)是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在2008年首创的。

是一种视觉欺骗手段,在web端就是iframe嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。

由于点击劫持的出现,便出现了反frame嵌套的方式,因为点击劫持需要iframe嵌套页面来攻击。

下面代码是最常见的防止frame嵌套的例子:

if(top.location!=location)    top.location=self.location;复制代码

事实上,这种代码很容易被绕过,在后文中讨论。

0x01 防御的几种方式

防止frame嵌套的js使用代码由高到低比例:

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.locationtop.location.href = document.location.hreftop.location.href = self.location.hreftop.location.replace(self.location)top.location.href = window.location.hreftop.location.replace(document.location)top.location.href = window.location.hreftop.location.href = "URL"document.write('')top.location = locationtop.location.replace(document.location)top.location.replace('URL')top.location.href = document.locationtop.location.replace(window.location.href)top.location.href = location.hrefself.parent.location = document.locationparent.location.href = self.document.locationtop.location.href = self.locationtop.location = window.locationtop.location.replace(window.location.pathname)window.top.location = window.self.locationsetTimeout(function(){document.body.innerHTML='';},1);window.self.onload = function(evt){document.body.innerHTML='';}var url = window.location.href; top.location.replace(url)复制代码

0x02 绕过的几种方式

对于使用parent.location来防御的可以使用多层嵌套的方式绕过。

一、例如防御代码为:

if(top.location!=self.location){     parent.location = self.location;}复制代码

建立两个页面:

1.html代码为:

2.html代码为:

访问1.html之后可以看到页面并无跳转等动作。

二、onBeforeUnload函数的利用:

onBeforeUnload的介绍以及各种浏览器的支持情况请见:

http://w3help.org/zh-cn/causes/BX2047

如下的防御代码:

if(top != self) top.location.replace(location);复制代码

新建立页面,代码如下:

打开页面显示如下:

欺骗用户点击留在此页后显示:

三、XSS filter的利用

IE8以上以及Chrome浏览器都有XSS筛选器,这些可以用来对付防御frame嵌套的代码。

防御代码如下:

if(top!=self){    top.location=self.location;}复制代码

新建立页面,代码如下:

访问后页面显示:

IE的xss筛选器自动拦截了跳转。

斯坦福的文章里写了Chrome也会出现这种情况,并给出了攻击代码:

但是测试发现,新版的Chrome并不会拦截了,会直接跳转过去。

如果跟的参数中有变量在页面中显示的,会把变量过滤一遍再输出,但不会阻止跳转。

四、Referer检查的问题

有一些站点允许自己的域名嵌套自己,禁止外站对自己的嵌套。

通常是用document.referer来检测来源是否为自己的域名。

if(top.location!=location){    if(document.referrer && document.referrer.indexOf("aaa.com")==1)    {        top.location.replace(document.location.href);    }}复制代码

判断字符串中是否含有本域名是常见的错误用法,利用二级域名的方式便可绕过,如:

http://aaa.com.bbb.com

注:从https域下post数据到http域的时候,浏览器不带Referer。

IE有个属性可以设置security为restricted可以禁止iframe里执行js脚本,但是要达到点击劫持的效果,必须要能够执行js所以很鸡肋。

代码如下:

复制代码

重点是手机站点,很多主站做的很不错,但是手机站点没有做任何防护,很容易造成点击劫持。

五、location劫持

在IE浏览器中,如果能够在防御代码的前面可以插入form表单的话,可以利用form表单对location进行劫持。

复制代码

用iframe嵌套此代码,可以看到没有跳转,执行了alert(1)。

相关案例:

0x03 推荐防御的方法:

一、X-FRAME-OPTIONS

X-FRAME-OPTIONS是微软提出的一个http头,专门用来防御利用iframe嵌套的点击劫持攻击。

并且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支持。

这个头有三个值:

DENY               // 拒绝任何域加载SAMEORIGIN         // 允许同源域下加载ALLOW-FROM         // 可以定义允许frame加载的页面地址复制代码

php中设置示例:

header ( "X-FRAME-OPTIONS:DENY");复制代码

二、目前最好的js的防御方案为:

复制代码

转载地址:http://brgml.baihongyu.com/

你可能感兴趣的文章
简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)...
查看>>
最近2个月的生活
查看>>
有哪些问题应该得到解决?
查看>>
FineReport中如何自定义登录界面
查看>>
元素始终居浏览器窗口中间的位置
查看>>
Docker持续部署图文详解 | 高效运维最佳实践06
查看>>
NoSQL生态系统
查看>>
DELPHI自定义事件
查看>>
江苏钢铁业联合重组胎动 重整方式多元化
查看>>
为何3D打印技术普及一直很慢?因为人们还不够了解这项技术
查看>>
Linux的常用目录(Ubuntu)
查看>>
linux 下更改文件名编码方式
查看>>
浏览器内核相关
查看>>
深入了解java运行时的内存区域
查看>>
Azkaban的Exec Server分析 30:JobRunner如何构造一个Job大揭秘
查看>>
Completely Uninstall Node.js from Mac OS X
查看>>
Linux中什么是动态网站环境及如何部署
查看>>
搜狗输入法初体验
查看>>
在 RHEL/CentOS 上为Web服务器架设 “XR”(Cro***oads) 负载均衡器
查看>>
消息中间件--RabbitMQ
查看>>