点击劫持
翻译
原文:https://portswigger.net/web-security/clickjacking
- name: 翻译
desc: 原文:https://portswigger.net/web-security/clickjacking
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 0点击劫持(UI重叠攻击/UI覆盖攻击)
在本节中,我们将解释什么是点击劫持,描述点击劫持攻击的常见示例,并讨论如何防范这些攻击。
# 1什么是点击劫持?
点击劫持是一种基于界面的攻击,通过诱骗用户,使其单击诱饵网站中的其他内容,但他实际上单击的是网站中经过隐藏的可操作内容。请考虑以下示例:
一个网络用户访问了某个诱饵网站(也许这是通过电子邮件提供的链接),然后单击了一个按钮以赢得奖品。在不知不觉中,他们被攻击者欺骗,按下了另一个隐藏按钮,这导致该用户 在另一个网站上的帐户 进行了支付。这是一个点击劫持攻击的例子。
该技术依赖于iframe
标签,这将在其中包含一个不可见的、可操作的网页(或多个网页),该网页中又包含 隐藏的按钮或链接。iframe
覆盖在用户预期的诱饵网页内容之上。这种攻击与 CSRF (opens new window) 攻击的不同之处在于,用户需要执行 单击按钮 之类的操作,而CSRF攻击 (opens new window)依赖于 在用户不知情的情况下 伪造整个请求。
针对 CSRF 攻击的保护通常会使用 CSRF 令牌——特定于会话的一次性随机数。
CSRF 令牌不能缓解点击劫持攻击,因为这种会话是通过 从真实网站加载的内容 建立的,并且所有请求都发生在恶意域上。在这种情况下,CSRF 令牌将会被放入请求中,并作为 正常行为会话的一部分 传递给恶意服务器。与普通用户会话相比,这种攻击的不同之处在于 攻击过程发生在隐藏的iframe
中。
实验室
如果您已经熟悉 点击劫持 漏洞背后的基本概念,并且只想在一些实际的、易受攻击的目标上练习和利用它们,那么您可以从下面的链接访问本主题中的所有实验室。
# 2如何构造基本的点击劫持攻击
点击劫持攻击使用 CSS 来创建和操作图层。攻击者将目标网站合并,然后覆盖在诱饵网站上的iframe
层中。使用style
标签和参数的示例如下:
<head>
<style>
#target_website {
position:relative;
width:128px;
height:128px;
opacity:0.00001;
z-index:2;
}
#decoy_website {
position:absolute;
width:300px;
height:400px;
z-index:1;
}
</style>
</head>
...
<body>
<div id="decoy_website">
...decoy web content here...
</div>
<iframe id="target_website" src="https://vulnerable-website.com">
</iframe>
</body>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
包含目标网站的iframe
位于浏览器内,使用适当的宽度和高度位置值,以便将目标操作与诱饵网站精确重叠。绝对和相对位置值,用于确保目标网站准确地与诱饵重叠,无论屏幕尺寸、浏览器类型和平台如何。z-index 则确定iframe
图层和网站图层的堆叠顺序。不透明度值定义为 0.0(或接近 0.0),以便iframe
内容对用户透明展示。浏览器点击劫持保护 可能会应用基于阈值的iframe
透明度检测(例如,Chrome 76 版本包含此行为,但 Firefox 没有)。攻击者选择不透明度值,以便在 不触发保护行为的情况下 实现所需的效果。
- name: 实验室-学徒
desc: 基本点击劫持 与 CSRF令牌保护 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/clickjacking/lab-basic-csrf-protected
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 2.1Clickbandit
尽管你可以手动创建一个点击劫持的概念证明,就像上面提到的那样,但这在实践中可能 相当繁琐且耗时。当你在野外测试点击劫持时,我们建议你使用 Burp 的Clickbandit (opens new window)工具。你可以使用浏览器访问可被框柱的页面,并在其上执行所需的操作,然后自动创建一个 HTML 文件,其中包含合适的点击劫持叠加层。你可以使用该工具,在几秒钟内生成交互式概念证明,而无需编写任何一行 HTML 或 CSS。
# 3表单输入预填充中的点击劫持
一些网站存在表单填写和提交操作,同时允许在提交之前使用 GET 参数来对表单输入进行预填充。其他网站在提交表单之前,可能要求用户提供文本。由于 GET 参数值构成了 URL 的一部分,因此可以修改目标 URL,以包含攻击者所选择的值,并将透明的 “提交” 按钮覆盖在诱饵站点上,就像 基本点击劫持示例 中展示的那样。
- name: 实验室-学徒
desc: 点击劫持 与 URL参数对表单数据输入进行预填充 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/clickjacking/lab-prefilled-form-input
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 4子窗口破坏程序
点击劫持攻击是可行的,只要网站可以被框柱。因此,预防性技术 - 限制网站生成子窗口的能力。通过 Web 浏览器制定的常见客户端保护是,使用子窗口破坏 或 子窗口阻断程序。这些可以通过专有的浏览器 JavaScript 组件或扩展插件(如 NoScript)来实现。这类程序通常经过精心设计,以便执行以下部分或全部行为:
- 检查并强制设置 当前应用程序的窗口 为主窗口或顶部窗口,
- 使所有 frame 可见,
- 防止点击不可见的 frame,
- 拦截并向用户标记 潜在的点击劫持攻击。
子窗口破坏技术通常是特定于浏览器和平台的,但由于 HTML 的灵活性,攻击者通常可以绕过它们。由于子窗口破坏程序是通过 JavaScript 实现的,因此浏览器的安全设置可能会阻止其操作,甚至于浏览器可能不支持 JavaScript。攻击者 对付子窗口破坏程序 的一个有效方法是使用 HTML5 中 iframe 标签的sandbox
属性。当该属性的参数值被设置为allow-forms
或allow-scripts
,并且其中不存在参数值allow-top-navigation
时,则 子窗口破坏程序 可以被中和,因为 iframe 无法检查它是否是顶部窗口:
<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms"></iframe>
allow-forms
和allow-scripts
值都允许在 iframe 中执行指定的操作,但顶级导航处于禁用状态。这会抑制子窗口破坏行为,同时允许目标站点内的功能。
- name: 实验室-学徒
desc: 点击劫持 与 子窗口破坏程序 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/clickjacking/lab-frame-buster-script
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 5将点击劫持与 DOM XSS 攻击相结合
到目前为止,我们已经将 点击劫持 视为一种独立的攻击。从历史上看,点击劫持已被用于执行在 Facebook 页面上增加 “赞” 之类的行为。然而,当 点击劫持 被用作另一种攻击(例如DOM XSS攻击)的载体时,就会揭示点击劫持的真正威力。这种组合攻击的实现相对简单,假设攻击者首先发现了 XSS 漏洞。然后将 XSS 漏洞载荷与 iframe 的目标 URL 相结合,以便用户单击按钮或链接,从而执行DOM XSS攻击。
- name: 实验室-从业者
desc: 利用点击劫持漏洞触发基于DOM的XSS >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/clickjacking/lab-exploiting-to-trigger-dom-based-xss
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 6多步点击劫持
攻击者操纵目标网站的输入时,可能需要执行多个动作。例如,攻击者可能想要诱骗用户 从零售网站购买商品,因此在下订单之前,需要将商品添加到购物车中。攻击者可以使用多个分区或 iframe 来实现这些操作。从攻击者的角度来看,这种攻击需要一定的精确度和谨慎,才能有效地隐蔽。
- name: 实验室-从业者
desc: 多步点击劫持 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/clickjacking/lab-multistep
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 7如何防范点击劫持攻击
我们已经讨论了一种常见的浏览器端预防机制,即 子窗口破坏程序。但我们已经看到,这些保护措施通常很容易被攻击者绕过。为此,已经设计出了一种服务器驱动协议,用以限制浏览器 iframe 的使用并减轻点击劫持。
点击劫持是一种浏览器端行为,其成功与否 取决于浏览器功能,以及其是否符合现行的 Web 标准和最佳实践。而针对点击劫持的服务器端保护,是通过定义和传达对使用 iframe 等组件时的约束来实现的。但是,保护的实际实现取决于 浏览器合规性和这些约束的实施程度。服务器端点击劫持保护机制有两种,分别是X-Frame-Options
和内容安全策略 (opens new window)。
# 7.1X-Frame-Options
X-Frame-Options
最初是在 Internet Explorer 8 中作为非官方响应标头引入的,并迅速被其他浏览器采用。该标头为网站所有者提供了对 iframe 或对象使用的控制,以便可以使用deny
指令来禁止在子窗口中包含网页:
X-Frame-Options: deny
或者,可以使用sameorigin
指令将子窗口限制为 与网站相同的源:
X-Frame-Options: sameorigin
或使用allow-from
指令设置指定网站:
X-Frame-Options: allow-from https://normal-website.com
X-Frame-Options
在不同浏览器中的实现并不一致(例如,Chrome 76以及Safari 12 版本中不支持allow-from
指令)。但是,当其与 内容安全策略 正确结合并使用时,它可以作为多层防御策略的一部分,并提供针对点击劫持攻击的有效保护。
# 7.2内容安全策略(CSP (opens new window))
内容安全策略(CSP)是一种检测和预防机制,可提供针对 XSS 和点击劫持等攻击的缓解措施。CSP 通常在 Web 服务器中实现为以下形式的返回标头:
Content-Security-Policy: <策略>
其中 <策略> 是用分号分隔的一串策略指令。CSP 为客户端浏览器提供了有关于可被允许的 Web 资源来源信息,浏览器可以将这些信息 应用于检测和拦截恶意行为。
建议的点击劫持保护是,将frame-ancestors
指令合并到应用程序的内容安全策略中。frame-ancestors 'none'
指令的行为类似于 X-Frame-Options 中的deny
指令。frame-ancestors 'self'
指令与 X-Frame-Options 中的sameorigin
指令大致相同。以下 CSP 仅将子窗口列入同一域的白名单:
Content-Security-Policy: frame-ancestors 'self';
或者,可以将子窗口限制为指定的站点:
Content-Security-Policy: frame-ancestors normal-website.com;
为了有效地对抗点击劫持和 XSS,需要仔细开发、实施和测试 CSP,并将其作为多层防御策略的一部分来使用。