x-note
  • Introduction
  • JavaScript
    • JavaScript 作用域链
    • JavaScript 数据结构与类型
    • JavaScript 原型
    • JavaScript this 关键字
    • JavaScript 函数
    • JavaScript delete 运算符
    • JavaScript 内存管理与垃圾回收
    • JavaScript 严格模式与混乱模式
    • JavaScript 数字精度丢失
    • JavaScript 并发模型
    • 利用原型链实现继承
  • ECMAScript
    • ECMAScript 6 变量及常量的声明
    • ECMAScript 6 变量的解构赋值
    • ECMAScript 6 Promise 对象
    • ECMAScript 6 Symbol
    • ECMAScript 6 Proxy
    • ECMAScript 6 Reflect
    • ECMAScript 6 new.target
    • ECMAScript 6 Set 和 WeakSet
    • ECMAScript 6 Map 和 WeakMap
    • ECMAScript 6 Iterator
    • ECMAScript 6 Generator
    • ECMAScript 6 class
    • ECMAScript 7
    • ECMAScript 8 async 函数
    • ECMAScript 8 内存共享与原子性
    • ECMAScript 8 Others
    • ECMAScript 2018
    • ECMAScript 2019
  • CSS
    • CSS 块格式化上下文(BFC)
    • CSS 盒模型
    • CSS 外边距合并
    • CSS Float
    • CSS Position
    • CSS Border-Image
    • CSS BEM
    • CSS 表布局详解
    • 页面布局之单列布局
    • 页面布局之多列布局
  • React
    • React 组件的生命周期
    • React 虚拟 DOM
    • React Reconciliation
    • React Diff 算法核心
    • React Fiber
    • React Scheduling
    • React Context API
    • React Refs
    • React HMR
    • React Hook
  • VUE
    • VUE 响应式系统
    • VUE 渲染机制
    • 关于 Vue 的思考
  • Webpack
    • Webpack 基本概念
    • Webpack HMR
  • Babel
    • @babel/preset-env
  • WEB
    • WEB 基础知识及概念
      • 屏幕测量单位
      • 重绘与重排
      • 前端模块化系统
      • WEB 客户端存储
      • 浏览器的渲染过程
    • WEB 性能优化
      • WEB 性能指标
      • WEB 图片优化
      • 懒加载资源
    • WEB 安全
      • XSS
      • XSRF
      • 点击劫持
      • 同源策略(Same Origin Policy,SOP)
    • WEB 解决方案
      • webp 兼容方案
      • WEB 拖拽实现方案
    • WEB SEO
  • Git
    • Git 工作流
    • Git 内部原理
  • 传输协议
    • UDP
      • UDP 基本概念
    • TCP
      • TCP 基本概念
    • HTTP
      • HTTP 基础
      • HTTP 缓存
      • HTTP-2
      • HTTP-3
      • HTTPS
      • 自定义 HTTPS 证书
  • Protocol Buffers
    • Protocol Buffers 基础
  • gRPC
    • gRPC 简介
    • gRPC 基础概念
    • GRPC with GraphQL and TypeScript
  • 正则表达式
    • 正则表达式基础
    • 正则表达式的悲观回溯
  • 基础算法
    • 冒泡排序
    • 插入排序
    • 选择排序
    • 快速排序
    • 归并排序
    • 希尔排序
    • 堆排序
    • 桶排序
    • 计数排序
    • 基数排序
    • 二叉树的遍历
    • 动态规划
    • 回溯
  • 压缩算法
    • HPACK
    • QPACK
  • 设计模式
    • DDD
      • 模型元素的模式
    • 常见设计模式
      • 工厂方法
      • 抽象工厂
      • 构造器
      • 原型
      • 单例模式
      • 适配器模式
      • 桥接模式
      • 组合模式
      • 外观模式
      • 享元模式
      • 代理模式
      • 责任链模式
      • 命令模式
      • 迭代器模式
      • 中介者模式
      • 备忘录模式
      • 观察者模式
      • 状态模式
      • 策略模式
      • 模版方法模式
      • 访问者模式
      • 依赖注入
    • MVC
    • MVP
    • MVVM
  • 颜色空间
    • LCH
由 GitBook 提供支持
在本页
  • 攻击类型
  • Flash 点击劫持
  • 图片覆盖
  • 拖拽劫持
  • 触屏劫持
  • 防御手段
  • Frame Busting
  • x-frame-options
  • Content-Security-Policy
  • Reference
在GitHub上编辑
  1. WEB
  2. WEB 安全

点击劫持

点击劫持本质上是一种视觉欺骗手段。 攻击者使用一个透明不可见的 iframe 覆盖在一个网页上,然后诱使用户在不知情的情况下点击透明的 iframe 页面。

<html>
  <body>
    <button>这是一个很安全的按钮</button>
    <iframe
      src="https://attact-site-url"
      style="position:fixed;opacity:0;"
      scrolling="no"
    ></iframe>
  </body>
</html>

攻击类型

  1. flash 点击劫持

  2. 图片覆盖

  3. 拖拽劫持

  4. 触屏劫持

Flash 点击劫持

Flash 点击劫持就是在 flash 内容上隐藏了一个看不见的 iframe。

图片覆盖

顺着点击劫持本质上是一种视觉欺骗手段这个思路,产生了跨站图片覆盖(Cross Site Image Overlaying)攻击。

XSIO 不同于 XSS , 它利用的是图片的 style 或能够控制 CSS。 如果应用没有限制 style 的 position 为 absolute,图片就可以覆盖到页面上的任意位置,形成点击劫持。

<html>
  <body>
    <iframe src="https://attact-site-url"></iframe>
    <a href="https://钓鱼网站">
      <!-- 调整图片样式至被攻击站点的相同的位置 -->
      <img src="https://attact-site-domin/image-url" style="position:fixed;" />
    </a>
  </body>
</html>

拖拽劫持

在浏览器开始支持 Drag & Drop API 后。 浏览器的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另一个窗口。

拖拽劫持的思路是诱导用户从不见的 iframe 中“拖拽”出攻击者希望得到的数据,然后放到攻击者能够控制的另一个页面中,从而窃取数据。

触屏劫持

通过讲一个不可见的 iframe 覆盖到当前页面上,可以劫持用户的触屏操作。

在移动互联占据主要市场的这个时代,大多数手机浏览器为了节约空间,隐藏了地址栏,因此手机上的视觉欺骗变得更加容易实施。

防御手段

  1. frame busting

  2. x-frame-options

Frame Busting

通常可以写一段 JavaScript 代码禁止 iframe 嵌套:

<style>
  body {
    display: none;
  }
</style>
<script>
  // 最佳 Frame Busting:
  if (self == top) {
    document.getElementsByTagName('body')[0].style.display = 'block';
  } else {
    top.location = self.location;
  }
</script>

常见 iframe busting:

  • if (top != self)

  • if (top.location != self.location)

  • if (top.location != location)

  • if (parent.frames.length > 0)

  • if (window != top)

  • if (window.top !== window.self)

  • if (window.self != window.top)

  • if (parent && parent != window)

  • if (parent && parent.frames && parent.frames.length>0)

  • if ((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0))

破坏框架的条件语句:

  • top.location = self.location

  • top.location.href = document.location.href

  • top.location.href = self.location.href

  • top.location.replace(self.location)

  • top.location.href = window.location.href

  • top.location.replace(document.location)

  • top.location.href = window.location.href

  • top.location.href = "URL"

  • document.write(’’)

  • top.location = location

  • top.location.replace(document.location)

  • top.location.replace(’URL’)

  • top.location.href = document.location

  • top.location.replace(window.location.href)

  • top.location.href = location.href

  • self.parent.location = document.location

  • parent.location.href = self.document.location

  • top.location.href = self.location

  • top.location = window.location

  • top.location.replace(window.location.pathname)

  • window.top.location = window.self.location

  • setTimeout(function(){document.body.innerHTML=’’;},1);

  • window.self.onload = function(evt){document.body.innerHTML

Frame Busting 可以通过各种手段绕过。 比如 H5 中 iframe 的 sandbox 属性、IE 中 iframe 的 security 属性

x-frame-options

x-frame-options 就是为了解决点击劫持产生的 HTTP 响应头

X-Frame-Options 有三个可能的值:

X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/

在不支持 x-frame-options 的浏览器中,只能继续使用 Frame Busting。

Content-Security-Policy

Content-Security-Policy: frame-ancestors <source>;

Reference

  • 白帽子讲 WEB 安全

上一页XSRF下一页同源策略(Same Origin Policy,SOP)

最后更新于4年前

可以通过 控制哪些页面能够 <frame>, <iframe>, <object>, <embed>, 或 <applet> 嵌入当前页面。

Content-Security-Policy 的 frame-ancestors 指令
Busting frame busting: a study of click-jacking vulnerabilities at popular sites
Framing Attacks on Smart Phones and Dumb Routers: Tap-jacking and Geo-localization
HTTP Header Field X-Frame-Options