Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是点击劫持?
  • 如何构建基本的点击劫持攻击
  • 使用预先填写的表单输入进行点击劫持
  • 框架清除脚本
  • 将点击劫持与DOM相结合 XSS 攻击
  • 多步骤点击劫持
  • 如何防止点击劫持攻击
  • X-Frame-Options
  • 内容安全政策(CSP)
  1. 客户端主题

点击劫持

PreviousCORS和Access-Control-Allow-Origin响应标头Next点击劫持(UI伪装)

Last updated 2 years ago

在本节中,我们将解释什么是点击劫持,描述点击劫持攻击的常见示例,并讨论如何防范这些攻击。

什么是点击劫持?

点击劫持是一种基于界面的攻击,在这种攻击中,用户通过点击诱饵网站中的其他内容,被诱骗点击隐藏网站上可操作的内容。参考下面的例子:

网络用户访问诱饵网站(也许这是电子邮件提供的链接),然后单击按钮以赢取奖金。 不知不觉中,攻击者欺骗了他们,他们按下了另一个隐藏按钮,从而导致在另一个站点上支付了帐户费用。 这是一个点击劫持攻击的示例。 该技术取决于在iframe中包含按钮或隐藏链接的不可见,可操作的网页(或多个页面)的合并。 iframe覆盖在用户预期的诱饵网页内容之上。 此攻击与CSRF攻击的不同之处在于,要求用户执行诸如单击按钮之类的操作,而CSRF攻击则取决于在用户不知情或输入的情况下伪造整个请求。

通常通过使用CSRF令牌来提供针对CSRF攻击的防护:令牌是特定于会话的,一次性使用的数字或随机数。 CSRF令牌无法缓解点击劫持攻击,因为目标会话是使用从真实网站加载的内容建立的,并且所有请求都在域内发生。 CSRF令牌被放入请求中,并作为正常行为会话的一部分传递到服务器。 与普通用户会话相比,差异在于该过程发生在隐藏的iframe中。

如何构建基本的点击劫持攻击

点击劫持攻击使用CSS创建和操纵图层。 攻击者将目标网站合并为诱饵网站上覆盖的iframe图层。 使用样式标签和参数的示例如下:

<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>

目标网站iframe定位在浏览器中,因此使用适当的宽度和高度位置值,目标操作与诱饵网站存在精确的重叠。 无论屏幕大小,浏览器类型和平台如何,绝对位置和相对位置值均用于确保目标网站准确地与诱饵重叠。 z-index确定iframe和网站层的堆叠顺序。 不透明度值定义为0.0(或接近0.0),以使iframe内容对用户透明。 浏览器点击劫持保护可能会应用基于阈值的iframe透明度检测(例如,Chrome版本76包含此行为,而Firefox不包含)。 攻击者选择不透明度值,以便在不触发保护行为的情况下获得所需的效果。

实验室具有CSRF令牌保护功能的基本点击劫持

使用预先填写的表单输入进行点击劫持

一些需要表单填写和提交的网站允许在提交之前使用GET参数预先填充表单输入。 其他网站可能需要文本才能提交表单。 由于GET值构成URL的一部分,因此可以修改目标URL以合并攻击者的选择值,并且如基本点击劫持示例中一样,透明的“提交”按钮覆盖在诱骗站点上。

实验室使用URL参数预填充的表单输入数据进行点击劫持

框架清除脚本

只要可以对网站进行构架,就有可能发生点击劫持攻击。 因此,预防技术是基于对网站的成帧能力的限制。 通过web浏览器实施的常见客户端保护是使用帧清除或帧中断脚本。这些可以通过专有的浏览器JavaScript附加组件或扩展程序(例如NoScript)来实现。 脚本通常经过精心设计,以使其执行以下某些或全部行为:

  • 检查并强制当前应用程序窗口是主窗口还是顶部窗口,

  • 使所有框架可见

  • 防止点击看不见的框架,

  • 拦截并向用户标记潜在的点击劫持攻击。

框架清除技术通常是特定于浏览器和平台的,并且由于HTML的灵活性,它们通常可以被攻击者规避。 由于框架破坏程序是JavaScript,因此浏览器的安全设置可能会阻止其运行,或者实际上浏览器甚至可能不支持JavaScript。 针对框架破坏者的有效攻击者解决方法是使用HTML5 iframe沙箱属性。 如果将此值设置为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中执行指定的操作,但是顶层导航被禁用。 这抑制了框架破坏行为,同时允许目标站点内的功能。

实验室使用框架破坏脚本的点击劫持

将点击劫持与DOM相结合 XSS 攻击

到目前为止,我们将点击劫持视为一种独立的攻击。 从历史上看,点击劫持曾被用来在Facebook页面上执行诸如增加“喜欢”之类的行为。 但是,当点击劫持被用作诸如DOM XSS攻击之类的另一种攻击的载体时,就可以揭示其真正的效力。 假设攻击者首先确定了XSS攻击,则此组合攻击的实现相对简单。 然后,将XSS利用与iframe目标URL结合在一起,以便用户单击按钮或链接,从而执行DOM XSS攻击。

实验室利用点击劫持漏洞来触发基于DOM的XSS

多步骤点击劫持

攻击者操纵目标网站的输入可能需要采取多种措施。 例如,攻击者可能想诱使用户从零售网站上购买商品,因此需要在下订单之前将商品添加到购物篮中。 攻击者可以使用多个区块或iframe实施这些操作。 从攻击者的角度来看,这样的攻击需要相当大的精确度和谨慎性,才能使其有效和隐秘。

实验室多步骤点击劫持

如何防止点击劫持攻击

我们已经讨论了一种常见的浏览器端防护机制,即框架清除脚本。 但是,我们已经看到,攻击者通常很容易避开这些保护措施。 因此,已设计出服务器驱动的协议,以限制浏览器iframe的使用并减轻点击劫持。

点击劫持是浏览器端的行为,它的成功与否取决于浏览器的功能以及对现行web标准和最佳实践的符合性。 通过在使用iframe之类的组件时定义和传达约束,可以提供服务器端防止点击劫持的保护。 但是,保护的实现取决于浏览器的遵从性和这些约束的实施。 服务器端点击劫持保护的两种机制是X-Frame-Options和Content Security Policy。

了解更多

使用Burp Suite的网络漏洞扫描程序查找点击劫持漏洞

X-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指令)。 但是,当与内容安全策略一起作为多层防御策略的一部分正确应用时,它可以提供有效的保护,以防止点击劫持攻击。

内容安全政策(CSP)

内容安全策略(CSP)是一种检测和预防机制,可缓解XSS和Clickjacking等攻击。 CSP通常在web服务器中实现为以下形式的返回标头

Content-Security-Policy: policy

其中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需要进行仔细的开发、实施和测试,并应被用作多层防御策略的一部分。