彻底吃透浏览器安全(同源限制/XSS/CSRF/中间人攻击)

449次阅读  |  发布于3年以前

前言

随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点。在移动互联网时代,特别是前端人员除了传统的 XSS、CSRF 等安全问题之外,又时常遭遇网络劫持、非法调用 Hybrid API 等新型安全问题。当然,浏览器自身也在不断在进化和发展,不断引入 CSP、SameSite、HttpOnly、Cookies 等新技术来增强安全性,但是仍存在很多潜在的威胁,这需要我们不断进行“查漏补缺”

浏览器安全可以分为三大块:Web页面安全、浏览器网络安全、浏览器系统安全

Web页面安全主要就是同源策略限制

什么是同源策略

同源指的是我们访问站点的:协议域名端口号必须一至,才叫同源

浏览器默认同源之间的站点是可以相互访问资源和操作DOM的,而不同源之间想要互相访问资源或者操作DOM,那就需要加一些安全策略的限制,俗称同源策略

同源策略主要限制了三个方面:

  1. DOM层面:不同源站点之间不能相互访问和操作DOM
  2. 数据层面:不能获取不同源站点的Cookie、LocalStorage、indexDB等数据
  3. 网络层面:不能通过XMLHttpRequest向不同源站点发送请求

当然同源策略限制也不是绝对隔离不同源的站点,比如link、img、script标签都没有跨域限制,这让我们开发更灵活了,但是也同样带来了一些安全问题,也就是浏览器网络安全问题,最典型的就是XSS攻击和CSRF攻击

说一下XSS攻击

XSS攻击是一种代码注入攻击,通过恶意注入脚本在浏览器运行,然后盗取用户信息

造成XSS攻击其实本质上还是因为网站没有过滤恶意代码,与正常代码混在一起之后,浏览器没有办法分辨哪些是可信的,然后导致恶意代码也被执行。然后可能导致以下情况:

XSS攻击有三种类型:存储型反射型DOM型

  1. 存储型:是在有发贴评论等带有数据保存功能的网站的input、textarea将恶意代码提交到网站数据库中,如<script src="http://恶意网站"></script> ,然后比如在显示评论的页面就会从数据获取,并直接执行这个script标签里的恶意代码
  2. 反射型:是攻击者将恶意JS脚本作为用户发送给网站请求中的一部分,然后网站又把恶意脚本返回给用户,这时候就会在页面中被执行。比如打开包含带恶意脚本的链接,当打开后会向服务器请求后,服务器会获取URL中的数据然后拼接在HTML上返回,然后执行。它和存储型不同的是不会储存在服务器里
  3. 基于DOM型:就是攻击者通过一些劫持手段,在页面资源传输过程中劫持并修改页面的数据,插入恶意代码

怎么防范XSS攻击,有什么解决办法?

Set-Cookie: widget_session=123456; httpOnly

说一下CSRF攻击

就是跨站请求伪造攻击主要就是利用用户的登录状态发起跨站请求,比如邮箱里的乱七八糟的链接,打开链接的时候邮箱肯定是处于登录状态,然后黑客就可以用这个登录状态,伪造带有正确 Cookie 的 http 请求,直接绕过后台的登录验证,然后冒充用户执行一些操作

发起CSRF攻击有三个必要条件:

  1. 目标网站一定要有CSRF漏洞
  2. 用户登录过目标网站,并且浏览器保存了登录状态
  3. 需要用户主动打开第三方站点

本质是利用cookie在同源请求中携带发送给服务器的特点,来实现冒充用户

CSRF攻击也有三种类型:GET类型POST类型链接型

<img src="http://恶意网址" >
<form id="hack" action="https://恶意网址" method="post">
  ...
</form>
<script>document.getElementById('hack').submit()</script>
<a href="https://恶意网址">点击领取大礼包</a>
<a href="https://恶意网址">点击下载美女视频</a>

怎么防范CSRF攻击,有什么解决办法?

1 . 在Cookie信息中添加SameSite属性,这个属性有三个值:

Chrome 80之前默认值是none,之后是lax

  Set-Cookie: widget_session=123456; SameSite=None; Secure

2 . 验证请求来源:服务器根据http请求头中的OriginReferer属性判断是否为允许访问的站点,从而对请求进行过滤。优先判断Origin,如果两个都不存在的话就直接阻止。

3 . token验证:服务器向用户返回一个随机数token,再次请求时在请求头中以参数的形式添加入这个token,然后服务器验证这个token,如果没有或者内容不正确,就拒绝请求。缺点是

4 . 双重验证cookie:利用攻击者只能利用cookie,不能获取cookie的特点,用户访问页面时,服务器向请求域名添加一个cookie随机字符串,然后,用户再次请求时从cookie中取出这个字符串,添加到URL参数中,然后服务器通过对cookie中的数据和参数中的数据对比验证,不一样就拒绝请求。

缺点是如果网站存在XSS漏洞,这法子就会失效,而且不能做到子域名的隔离

浏览器系统安全 - 安全沙箱

首先,我们设想一下,如果我们下载了一个恶意程序,但是没有执行它,对我们有没有影响?

那肯定没有,而浏览器也是一样的

浏览器可以安全地下载各种网络资源,但是执行的时候就需要谨慎了。比如解析HTML、CSS、执行JS等操作,一不小心黑客就会利用这些操作对有漏洞的浏览器发起攻击

所以需要在渲染进程和操作系统之间建一堵墙,有这堵墙在挡着,黑客能黑进来,也只能获取渲染进的操作权限(如下图),不会影响到外面,而这隔离操作系统和渲染进程的一堵墙就是安全沙箱

安全沙箱最小的保护单位是进程,并且能限制进程对操作系统资源的访问和修改,这就意味着,安全沙箱所在的进程不能有读写操作系统的功能,比如读写本地文件、发起网络请求,调用GPU接口等

安全沙箱怎么影响各个模块功能

站点隔离你知道吗

我们知道一个标签页会有一个渲染进程,假如这个标签页里面有多个不同站点的 iframe 呢?这就会导致多个不同站点的内容运行在同一个渲染进程中,这肯定不行

所有操作系统中都存在两个A级漏洞:幽灵(Spectre)和熔毁(Meltdown),这是处理器架构导致的,很难修补

如果银行页面中有一个恶意 iframe ,这个恶意站点利用两个A级漏洞入侵渲染进程,那恶意程序就可以读取银行站点渲染进程内所有内容了,这对用户来说风险就很大了,如果没有沙箱保护,甚至还可以对操作系统发起攻击

所以后来Chrome对渲染进程进行重构,将标签级的渲染进程改成 iframe 级渲染进程,就是说一个标签页内可能运行多个渲染进程,并且相互隔离,这样恶意 iframe 就无法访问页面中其他的内容了,也就无法攻击其他站点了,这就是站点隔离

中间人攻击

在 http 数据提交给 TCP 层之后,会经过用户电脑、路由器、运营商、服务器,这中间每一个环节,都不是安全的

一句话就是:在 http 传输过程中容易被中间人窃取、伪造、篡改,这种攻击方式称为中间人攻击

那怎么让数据可以更安全的传输呢?

这里涉及知识点有安全层、加密方案、对称加密、不对称加密、数字证书、签名、摘要算法、优化等。内容过多,可以看我另一篇文章有详细介绍

参考

浏览器工作原理与实践

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8