点击劫持漏洞

什么是点击劫持?

点击劫持是一种基于界面的攻击,通过点击诱饵网站中的一些其他内容,诱使用户点击隐藏网站上的可操作内容。考虑以下示例:

网络用户访问诱饵网站(可能这是电子邮件提供的链接)并单击按钮以赢取奖品。不知不觉中,他们被攻击者欺骗,按下了一个替代的隐藏按钮,这导致在另一个网站上支付一个帐户。这是一个点击劫持攻击的例子。该技术取决于在 iframe 中包含一个不可见的、可操作的网页(或多个页面),其中包含一个按钮或隐藏链接。iframe 覆盖在用户预期的诱饵网页内容之上。这种攻击与CSRF攻击的不同之处在于,用户需要执行诸如单击按钮之类的操作,而CSRF 攻击则依赖于在用户不知情或不输入的情况下伪造整个请求。
对 CSRF 攻击的保护通常是通过使用CSRF 令牌来提供的:特定于会话的一次性号码或随机数。CSRF 令牌不会减轻点击劫持攻击,因为目标会话是使用从真实网站加载的内容建立的,并且所有请求都发生在域上。CSRF 令牌被放入请求中并作为正常行为会话的一部分传递给服务器。与普通用户会话相比的不同之处在于该过程发生在隐藏的 iframe 中。

如何构建基本的点击劫持攻击

点击劫持攻击使用 **CSS **来创建和操作图层。攻击者将目标网站合并为覆盖在诱饵网站上的 iframe 层。使用样式标签和参数的示例如下:

<head>
  <style>
    #target_website {
      position:relative;
      width:128px;
      height:128px;
      opacity:0.00001;
      z-index:2;
      }
    #decoy_website {
      position:absolute;
      width:300px;
      height:400px;
      z-index:1;
      }
  </style>
</head>
...
<body>
  <div id="decoy_website">
  ...decoy web content here...
  </div>
  <iframe id="target_website" src="https://vulnerable-website.com">
  </iframe>
</body>

目标网站 iframe 位于浏览器内,以便使用适当的宽度和高度位置值将目标操作与诱饵网站精确重叠。无论屏幕大小、浏览器类型和平台如何,绝对和相对位置值用于确保目标网站准确地与诱饵重叠。z-index 确定 iframe 和网站层的堆叠顺序。不透明度值定义为 0.0(或接近 0.0),以便 iframe 内容对用户透明。浏览器点击劫持保护可能会应用基于阈值的 iframe 透明度检测(例如,Chrome 76 版包含此行为,但 Firefox 不包含)。攻击者选择不透明度值,以便在不触发保护行为的情况下实现预期效果。

使用预填表单输入进行点击劫持

一些需要表单完成和提交的网站允许在提交之前使用 GET 参数预填充表单输入。其他网站可能需要在提交表单之前输入文本。由于 GET 值构成 URL 的一部分,因此可以修改目标 URL 以包含攻击者选择的值,并且透明的“提交”按钮覆盖在诱饵站点上,如基本的点击劫持示例。

帧破坏脚本

只要网站可以被陷害,就可能进行点击劫持攻击。因此,预防性技术基于限制网站的框架功能。通过 Web 浏览器制定的常见客户端保护是使用框架破坏或框架破坏脚本。这些可以通过专有浏览器 JavaScript 附加组件或扩展程序(例如 NoScript)来实现。脚本通常经过精心设计,以便它们执行以下部分或全部行为:

  • 检查并强制当前应用程序窗口是主窗口或顶部窗口,
  • 使所有帧可见,
  • 防止点击隐形框架,
  • 拦截并向用户标记潜在的点击劫持攻击。

帧破坏技术通常是特定于浏览器和平台的,并且由于 HTML 的灵活性,它们通常可以被攻击者规避。由于帧破坏者是 JavaScript,因此浏览器的安全设置可能会阻止其运行,或者浏览器甚至可能不支持 JavaScript。针对框架破坏者的有效攻击者解决方法是使用 HTML5 iframesandbox属性。当使用allow-formsorallow-scripts值设置此值并且allow-top-navigation省略该值时,可以中和 frame buster 脚本,因为 iframe 无法检查它是否是顶部窗口:

<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms"></iframe>

无论是allow-forms和allow-scripts值允许的iframe,但顶级导航中指定的行为被禁止。这会抑制框架破坏行为,同时允许目标站点内的功能。

将点击劫持与 DOM XSS攻击相结合

到目前为止,我们已经将点击劫持视为一种独立的攻击。从历史上看,点击劫持已被用于执行行为,例如在 Facebook 页面上增加“喜欢”。然而,当点击劫持被用作另一种攻击(例如DOM XSS攻击)的载体时,它的真正威力就会显现出来。假设攻击者首先识别了 XSS 漏洞,则这种组合攻击的实施相对简单。然后将 XSS 漏洞与 iframe 目标 URL 结合起来,以便用户单击按钮或链接,从而执行 DOM XSS 攻击。

多步点击劫持

攻击者对目标网站输入的操纵可能需要采取多项行动。例如,攻击者可能想要诱使用户从零售网站购买商品,因此需要在下订单之前将商品添加到购物篮中。攻击者可以使用多个分区或 iframe 来实现这些操作。从攻击者的角度来看,此类攻击需要相当精确和谨慎,才能有效且隐蔽。

如何防止点击劫持攻击

我们已经讨论了一种常见的浏览器端预防机制,即帧破坏脚本。但是,我们已经看到,攻击者通常很容易绕过这些保护措施。因此,已经设计出服务器驱动的协议来限制浏览器 iframe 的使用并减轻点击劫持。

点击劫持是浏览器端的行为,其成功与否取决于浏览器功能以及是否符合现行 Web 标准和最佳实践。服务器端针对点击劫持的保护是通过定义和传达对组件(如 iframe)使用的约束来提供的。但是,保护的实施取决于浏览器的合规性和这些约束的实施。服务器端点击劫持保护的两种机制是 X-Frame-Options 和Content Security Policy。

X-Frame-Options

X-Frame-Options 最初是作为 Internet Explorer 8 中的非官方响应标头引入的,它很快被其他浏览器采用。标题为网站所有者提供对 iframe 或对象使用的控制,以便可以使用deny指令禁止在框架中包含网页:

X-Frame-Options: deny

或者,可以使用sameorigin指令 将框架限制为与网站相同的来源

X-Frame-Options: sameorigin

或使用allow-from指令访问指定网站:

X-Frame-Options: allow-from https://normal-website.com

X-Frame-Options 在浏览器中的实现不一致(allow-from例如,Chrome 76 版或 Safari 12 不支持该指令)。但是,当与内容安全策略一起作为多层防御策略的一部分正确应用时,它可以提供针对点击劫持攻击的有效保护。

内容安全策略 ( CSP )

内容安全策略 (CSP) 是一种检测和预防机制,可缓解 XSS 和点击劫持等攻击。CSP 通常在 Web 服务器中实现为表单的返回标头:

Content-Security-Policy: policy

其中 policy 是一串由分号分隔的策略指令。CSP 向客户端浏览器提供有关允许的 Web 资源来源的信息,浏览器可以将这些信息用于检测和拦截恶意行为。

推荐的点击劫持保护是frame-ancestors在应用程序的内容安全策略中加入该指令。该frame-ancestors 'none'指令的行为类似于 X-Frame-Optionsdeny指令。该frame-ancestors 'self'指令大致等同于 X-Frame-Optionssameorigin指令。以下 CSP 仅将帧列入同一域的白名单:

Content-Security-Policy: frame-ancestors 'self';

或者,可以将框架限制为命名站点:

Content-Security-Policy: frame-ancestors normal-website.com;

为了有效对抗点击劫持和 XSS,CSP 需要仔细开发、实施和测试,并应作为多层防御策略的一部分。

posted @ 2021-08-23 18:44  Zeker62  阅读(1540)  评论(0编辑  收藏  举报