跳转到主要内容

点击劫持

本文约需 2 分钟阅读

点击劫持是指将透明或不可见的 iframe 叠加在正规页面之上,诱使用户执行其本不打算进行的操作 (点击按钮、提交表单等) 的攻击手法。由于用户眼中只看到正规页面,因此不会意识到自己正在另一个网站上进行操作。 2008 年由安全研究人员 Jeremiah Grossman 和 Robert Hansen 命名,作为将社会工程学与技术性攻击相结合的精巧手法而广为人知。

攻击的原理

攻击者的页面 (用户可见)
“领取免费礼物”按钮
↑ 透明的 iframe (opacity: 0) 叠加在上方
目标网站的“删除账户”按钮

用户以为自己点击的是“礼物”,实际上却在执行“删除账户”

攻击者用 iframe 加载目标网站,并通过 CSS 的 opacity: 0 使其完全透明。在其下方放置有吸引力的内容 (抽奖、视频播放按钮等),诱导用户点击。点击会穿透透明的 iframe 到达目标网站,因此只要用户已登录目标网站,操作就会以其权限被执行。CSRF 与之相似,但 CSRF 是伪造请求,而点击劫持则是劫持用户自身的点击操作,二者不同。

变种与衍生形态

Likejacking

用透明的 iframe 叠加在 Facebook 的“赞”按钮上,让用户在无意识中点击“赞”。 2010 年前后大为流行,促使 Facebook 加强了应对措施。

Cursorjacking

将光标的显示位置与实际指针位置错开,让用户点击其本不打算点击的位置。滥用 CSS 的 cursor 属性。

Filejacking

劫持拖放操作,让用户将本地文件上传到攻击者的服务器。滥用 HTML5 的 Drag and Drop API。

防御措施

点击劫持的防御,基本在于防止自己的网站被嵌入到其他网站的 iframe 中。

X-Frame-Options 标头
CSP frame-ancestors
阻止 iframe 嵌入
防止点击劫持

X-Frame-Options 标头可指定 DENY (拒绝所有 iframe 嵌入) 或 SAMEORIGIN (仅允许同源)。如果需要更灵活的控制,则使用 CSPframe-ancestors 指令。frame-ancestors 'self' 等同于 SAMEORIGIN,还可以将特定域名添加到允许列表中。目前推荐使用 CSP frame-ancestors,并通常将 X-Frame-Options 作为面向旧版浏览器的后备方案一并使用。

常见误解

有一种误解认为“用 JavaScript 编写破框代码 (frame busting) 就能防御”,但攻击者可以通过带 sandbox sandbox 属性的 iframe 禁用 JavaScript 的执行,因此仅靠基于 JS 的对策是不够的。请务必在 HTTP 标头层面实施防御。此外,如果存在 XSS 漏洞,攻击者可能绕过标头注入 iframe,因此还需要通过安全编码实施 XSS 对策。

现场使用案例

“在安全审计中发现,管理后台没有设置 X-Frame-Options 标头。当时存在攻击者将管理后台嵌入 iframe、诱使管理员点击权限变更按钮的可行情形。我们通过添加 CSP frame-ancestors 并在所有页面限制 iframe 嵌入来加以处理。”

浏览器扩展程序的安全性,在浏览器扩展程序安全性的文章中详细讲解;浏览器的密码管理在浏览器密码安全性的文章中详细讲解;钓鱼防护在钓鱼防护的文章中详细讲解。Web 安全相关书籍 (Amazon)也有助于理解防御措施。

相关术语

这篇文章对您有帮助吗?

XHatena