CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / SECURITY / P-024 · 开发安全

开发安全 006:点击劫持详解

点击劫持是一种恶意技术,欺骗网络用户点击与用户认为他们点击的内容不同的内容,从而可能在点击看似无害的网页时泄露机密信息。——维基百科

点击劫持简介

点击劫持攻击基本上意味着欺骗用户通过框架页面点击某些东西来执行一些恶意攻击。比如,当攻击者在窗口中使用透明 iframe 诱骗用户点击 CTA(例如按钮或链接)到另一个具有相同外观窗口的服务器时发生攻击。从某种意义上说,攻击者劫持了原始服务器的点击并将其发送到另一台服务器。这是对访问者本身和服务器的攻击。

以下是点击劫持的几种可能漏洞或用途:

  • 诱骗用户公开其社交网络个人资料信息
  • 在 Facebook 上分享或喜欢链接
  • 点击 Google Adsense 广告即可生成每次点击付费收入
  • 让用户在 Twitter 或 Facebook 上关注某人
  • 下载并运行恶意软件(恶意软件),允许远程攻击者控制其他计算机
  • 在 Facebook 粉丝页面上获得喜欢或在 Google Plus 上获得 +1
  • 播放 YouTube 视频以获取观看次数

点击劫持很容易实现,如果您的网站只需单击即可完成操作,那么很可能是点击劫持。它可能不像跨站点脚本或代码注入攻击那样常见,但它仍然存在另一个漏洞。有时看到视觉效果会很有帮助(原文此处配有演示视频,已丢失)。

攻击方式

图片覆盖攻击(XSIO)

点击劫持的本质就是一种视觉欺骗,通过这种思想,黑客可以完成很多劫持,例如:钓鱼网站的实现,通过图片覆盖导致链接到一些未知的网站,从而达到黑客真正的目的。原理:通过调整图片的 style 使得图片能够覆盖在他所指定的任意位置。

XSIO 不同于 XSS,它利用的是图片的 style,或者能够控制 CSS。如果应用没有限制 style 的 position 为 absolute 的话,图片就可以覆盖到页面上的任意位置,形成点击劫持。

Flash 点击劫持

攻击者通过 Flash 构造出了点击劫持,在完成一系列复杂的动作之后,最终控制了用户的摄像头。原理:黑客在 Flash 游戏页面内嵌了一个 iframe,通过游戏选项按钮诱导用户去点击按钮,从而最终实现 Flash 点击劫持——每次点击完成之后按钮的位置都是可变化的、移动的。

拖拽劫持与数据窃取

目前很多浏览器都开始支持 Drag & Drop 的 API。对于用户来说,拖拽他们的操作更加简单。浏览器拖拽的对象可以是一个连接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽不受同源策略的影响。

“拖拽劫持”的思路是诱使用户从隐藏的不可见 iframe 中拖拽出攻击者希望得到的数据,然后放到攻击者能够控制的另外一个页面,从而窃取数据。

触屏劫持(TapJacking)

触屏,从手机 OS 的角度来看,触屏实际上就是一个事件,手机 OS 捕捉这些事件,并执行相应的动作。

一次触屏操作,可能会对应以下几个事件的发生:

  • touchstart:手指触摸屏幕时发生
  • touchend:手指离开屏幕时发生
  • touchmove:手指滑动时发生
  • touchcancel:系统可取消 touch 事件

攻击示例

点击劫持(ClickJacking)是一种视觉上的欺骗手段。大概有两种方式:一是攻击者使用一个透明的 iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的 iframe 页面;二是攻击者使用一张图片覆盖在网页,遮挡网页原有位置的含义。

flowchart LR
    A[攻击者页面] --> B[透明 iframe 覆盖目标页面<br/>opacity: 0, z-index 更高]
    B --> C[诱饵按钮置于底层<br/>如'查看详情']
    C --> D[用户点击诱饵按钮位置]
    D --> E[实际命中的是透明 iframe 中<br/>目标站的功能按钮]
    E --> F[以用户身份触发非本人意愿的操作]

iframe 覆盖(嵌入 iframe 框)

以下是网上的一个例子,忽略其真实性和意义,只是辅助你理解其思路。

假如我们在百度有个贴吧,想偷偷让别人关注它。于是我们准备一个页面:

<!DOCTYPE HTML>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<head>
    <title>点击劫持</title>
    <style>
        html, body, iframe {
            display: block;
            height: 100%;
            width: 100%;
            margin: 0;
            padding: 0;
            border: none;
        }
        iframe {
            opacity: 0;
            filter: alpha(opacity=0);
            position: absolute;
            z-index: 2;
        }
        button {
            position: absolute;
            top: 315px;
            left: 462px;
            z-index: 1;
            width: 72px;
            height: 26px;
        }
    </style>
</head>
<body>
    那些不能说的秘密
    <button>查看详情</button>
    <iframe src="http://tieba.baidu.com/f?kw=%C3%C0%C5%AE"></iframe>
</body>
</html>

网址传播出去后,用户手贱点击了查看详情后,其实就会点到关注按钮(PS:可以把 iframe 透明设为 0.3 看下实际点到的东西)。这样贴吧就多了一个粉丝了。

粘贴劫持

假设你现在是一个黑客,并且你已经建了一个论坛,在注册页面设置两处常见的要求 “Enter your email” 栏以及 “Retype your email” 栏。然后悄悄地在 “Retype your email” 栏放个隐藏 iframe,此位置会加载另一个正常网站的设置页面表单(网上示例:https://security.love/XSSJacking/index2.html)。

当用户在你的网站上注册时,大多数人会先输入一遍邮箱,然后复制第一栏中的邮箱再粘贴到第二栏中——就在这个过程中,用户剪切板中的内容已经神不知鬼不觉地被插入到那个正常网站设置页面中。如果这家正常网站相应表单字段存在 XSS 漏洞,则攻击代码就能发挥作用。受害者根本就不知道整个过程是怎么进行、何时进行的。

攻击中所利用的粘贴劫持技术,是将 XSS payload 粘贴到其他域名的文本栏框架。由于这些框架的位置可以改变,并且不可见,因此可以利用点击劫持让用户觉得他还在访问他”正在”访问的那个网站。事实上,他已经触发了 Self-XSS 漏洞,黑客可得到他的敏感信息。

通过 XSS 劫持攻击,黑客可以盗取该用户的 cookie、收件箱信息、配置详情,修改配置文件设置(比如手机号、邮箱号)或是执行其他恶意操作。

拖放劫持

实际上就是点击劫持的演进版本。

在现在的 Web 应用中,有一些需要用户采用鼠标拖放完成的操作,而且用户也经常在浏览器中使用鼠标拖放操作来代替复制粘贴。因此,拖放操作劫持很大程度的扩展了点击劫持的攻击范围,也将劫持模式从单纯的鼠标点击扩展到了鼠标拖放行为。

例子:通过劫持某个页面的拖放操作实现对其他页面链接的窃取,这些链接中可能会有 session key、token、password 等信息;或者可以把其他浏览器中的页面内容拖放到富文本编辑器模式中,这样就能够看到页面源代码了,而这些 HTML 源代码中可能会存在敏感信息。

组合利用方式

在挖掘 xss 时,你可能会遇到 self-xss,那么这时你可以考虑 self-xss + 点击劫持,或 csrf + self-xss。

点击劫持利用框架

点击劫持防御

X-FRAME-OPTIONS 是目前最可靠的方法。

X-Frame-Options(XFO)是一个 HTTP 响应头,也称为 HTTP 安全头,自 2008 年以来一直存在。在 2013 年,它正式发布为 RFC 7034,但不是互联网标准。此标题告诉您的浏览器在处理您网站的内容时的行为方式。其成立的主要原因是通过不允许在帧中呈现页面来提供点击劫持保护。这可以包括在页面的呈现 <frame><iframe> 方广告,甚至一些 OAuth 实施。

并且在 IE8、Firefox3.6、Chrome4 以上的版本均能很好的支持。这个头有三个值:

DENY         // 拒绝任何域加载
SAMEORIGIN   // 允许同源域下加载
ALLOW-FROM   // 可以定义允许frame加载的页面地址,比如 x-frame-options: ALLOW-FROM https://domain.com/

在 Nginx 上启用:要 x-frame-options 在 Nginx 上启用标头,只需将其添加到服务器块配置中即可:

add_header x-frame-options "SAMEORIGIN" always;

在 Apache 上启用:要在 Apache 上启用,只需将其添加到您的 httpd.conf 文件(Apache 配置文件):

header always set x-frame-options "SAMEORIGIN"

在 IIS 上启用:要在 IIS 上启用,只需将其添加到您站点的 Web.config 文件中即可:

<system.webServer>
    ...
    <httpProtocol>
        <customHeaders>
            <add name="X-Frame-Options" value="SAMEORIGIN" />
        </customHeaders>
    </httpProtocol>
    ...
</system.webServer>

除此之外有的浏览器厂商也增加扩展功能来防御 clickjacking,如 Firefox 的 “content security policy” 和 “No-script”。

参考文章

系列导航

← 开发工具 006:Lombok工具库详解 目录 算法 007:冒泡排序(Bubble Sort) →
← 返回文章列表