点击劫持是一种诱骗用户点击不可见或伪装成其他元素的网页元素的攻击。这可能会导致用户无意中下载恶意软件、访问恶意网页、提供凭据或敏感信息、转账或在线购买产品。
通常,点击劫持是通过在用户看到的页面顶部的 iframe 内显示一个不可见的页面或 HTML 元素来执行的。用户认为他们点击的是可见页面,但实际上他们点击的是移调到其顶部的附加页面中的不可见元素。
不可见页面可能是恶意页面,也可能是用户不打算访问的合法页面——例如,用户银行网站上授权转账的页面。
点击劫持攻击有多种变体,例如:
- Likejacking – 一种操纵 Facebook“喜欢”按钮的技术,导致用户“喜欢”他们实际上不打算喜欢的页面。
- Cursorjacking – 一种 UI 修复技术,可将用户感知到的位置的光标更改为另一个位置。Cursorjacking 依赖于 Flash 和 Firefox 浏览器中的漏洞,这些漏洞现已修复。
点击劫持攻击示例
- 攻击者创建了一个有吸引力的页面,承诺为用户提供免费的塔希提岛之旅。
- 在后台,攻击者检查用户是否登录到他的银行站点,如果是,则加载启用资金转移的屏幕,使用查询参数将攻击者的银行详细信息插入表单。
- 银行转账页面显示在免费礼物页面上方的一个不可见的 iframe 中,“确认转账”按钮与用户可见的“接收礼物”按钮完全对齐。
- 用户访问该页面并单击“Book My Free Trip”按钮。
- 实际上,用户点击了不可见的 iframe,并点击了“Confirm Transfer”按钮。资金转移给攻击者。
- 用户被重定向到包含免费礼物信息的页面(不知道后台发生了什么)。
此示例说明,在点击劫持攻击中,无法将恶意操作(在本例中是在银行网站上)追溯到攻击者,因为用户是在合法登录自己的帐户的情况下执行的。
点击劫持缓解
防御点击劫持的一般方法有两种:
- 客户端方法 ——最常见的方法称为 Frame Busting。客户端方法在某些情况下可能有效,但被认为不是最佳实践,因为它们很容易被绕过。
- 服务器端方法 ——最常见的是 X-Frame-Options。服务器端方法被安全专家推荐为防御点击劫持的有效方法。
使用 X-Frame-Options 响应标头减轻点击劫持
X-Frame-Options 响应标头作为网页 HTTP 响应的一部分传递,指示是否应允许浏览器在 <FRAME> 或 <IFRAME> 标记内呈现页面。
X-Frame-Options 标头允许三个值:
- DENY – 不允许任何域在框架内显示此页面
- SAMEORIGIN – 允许当前页面显示在另一个页面的框架中,但仅限于当前域
- ALLOW-FROM URI—— 允许当前页面显示在框架中,但仅限于特定的 URI——例如 www.example.com/frame-page
使用 SAMEORIGIN 选项来防御点击劫持
X-Frame-Options 允许内容发布者防止他们自己的内容被攻击者在不可见的框架中使用。DENY 选项是最安全的,它可以防止在框架中使用当前页面。更常见的是,使用 SAMEORIGIN,因为它确实允许使用框架,但将它们限制在当前域内。
X-Frame-Options 的局限性
- 要跨网站启用 SAMEORIGIN 选项,X-Frame-Options 标头需要作为每个单独页面的 HTTP 响应的一部分返回(不能跨站点应用)。
- X-Frame-Options 不支持允许域的白名单,因此它不适用于需要在它们之间显示框架内容的多域站点。
- 单个页面上只能使用一个选项,因此,例如,同一页面不可能在当前网站和外部网站上都显示为框架。
- 并非所有浏览器都支持 ALLOW-FROM 选项。
- X-Frame-Options 在大多数浏览器中都是不推荐使用的选项。
点击劫持测试——您的网站易受攻击吗?
测试您的网站是否容易受到点击劫持的基本方法是创建一个 HTML 页面并尝试将您网站的敏感页面包含在 iframe 中。在另一台 Web 服务器上执行测试代码很重要,因为这是点击劫持攻击中的典型行为。
使用如下代码,作为 OWASP 测试指南的一部分提供:
<html> <头> <title>点击劫持测试页面</title> </头> <正文> <p>网站容易受到点击劫持!</p> <iframe src="http://www.yoursite.com/sensitive-page" width="500" height="500"></iframe> </body> </html>
在浏览器中查看 HTML 页面并对页面进行评估,如下所示:
- 如果出现“网站容易受到点击劫持”的文本,并且在其下方看到敏感页面的内容, 则该页面容易受到点击劫持。
- 如果只出现“网站容易受到点击劫持”的文本,而您没有看到敏感页面的内容,则该页面不会受到最简单形式的点击劫持。
但是,还需要额外的测试来查看页面上使用了哪些反点击劫持方法,以及它们是否可以被攻击者绕过。