点击劫持
本文约需 2 分钟阅读
点击劫持是指将透明或不可见的 iframe 叠加在正规页面之上,诱使用户执行其本不打算进行的操作 (点击按钮、提交表单等) 的攻击手法。由于用户眼中只看到正规页面,因此不会意识到自己正在另一个网站上进行操作。 2008 年由安全研究人员 Jeremiah Grossman 和 Robert Hansen 命名,作为将社会工程学与技术性攻击相结合的精巧手法而广为人知。
攻击的原理
用户以为自己点击的是“礼物”,实际上却在执行“删除账户”
攻击者用 iframe 加载目标网站,并通过 CSS 的 opacity: 0 使其完全透明。在其下方放置有吸引力的内容 (抽奖、视频播放按钮等),诱导用户点击。点击会穿透透明的 iframe 到达目标网站,因此只要用户已登录目标网站,操作就会以其权限被执行。CSRF 与之相似,但 CSRF 是伪造请求,而点击劫持则是劫持用户自身的点击操作,二者不同。
变种与衍生形态
用透明的 iframe 叠加在 Facebook 的“赞”按钮上,让用户在无意识中点击“赞”。 2010 年前后大为流行,促使 Facebook 加强了应对措施。
将光标的显示位置与实际指针位置错开,让用户点击其本不打算点击的位置。滥用 CSS 的 cursor 属性。
劫持拖放操作,让用户将本地文件上传到攻击者的服务器。滥用 HTML5 的 Drag and Drop API。
防御措施
点击劫持的防御,基本在于防止自己的网站被嵌入到其他网站的 iframe 中。
X-Frame-Options 标头可指定 DENY (拒绝所有 iframe 嵌入) 或 SAMEORIGIN (仅允许同源)。如果需要更灵活的控制,则使用 CSP 的 frame-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)也有助于理解防御措施。
这篇文章对您有帮助吗?