浏览器安全相关(笔记)

411 阅读7分钟

参考文档:

美团技术团队-如何防止XSS攻击

美团技术团队-如何防止CSRF攻击

一些安全相关名词

  1. XSS

  2. CSRF

  3. HTTPS

  4. CSP(内容安全策略,禁止加载外域代码,禁止外域的提交)

  5. HSTS(强制使用HTTPS)

  6. X-Frame-options 控制当前页面是否可以被嵌入到iframe

  7. SRI subresource intergrity 子资源完整性

    打包文件后,根据文件内容生成hash值,并且注入到script标签上. 防止黑客篡改cdn上的资源内容

    浏览器加载script时,会根据内容生成hash值 并和script标签上的hash进行对比,如果相同,则认为内容是安全的

  8. Referer-Policy 控制referer的携带策略

Node(服务器)攻击

1. 本地文件操作安全问题,由字符串拼接路径

一般框架都可以规定静态资源文件,这个很容易理解,如果不做资源的访问限制,那用户访问服务器后,直接改变URL地址,就可以获取到服务器上的所有文件.

express.static

koa-static 中间件

resolve-path 第三方库

const app = express()
app.static("html")

http.createServer(app).listen(3000)

2. ReDos

2-1. 什么是dos攻击

dos攻击就是攻击者通过大量访问服务器,造成服务器负载过大,使正常的访问受到影响. 比如个人开发者购买了流量付费的某☁️服务器,如果不做安全措施,攻击者通过脚本或其他方式大量访问该服务器,就会造成额外的费用

2-2. ReDos

ReDos就是使用正则进行dos攻击,正则表达式嵌套关系深的时候,计算量增上速度很快 可能造成服务器宕机

前端攻击

XSS

1. 概念

Cross-site Script 跨站脚本攻击.

攻击者想尽一切办法把代码注入到网页中.

2. 攻击类型

外在表现
  1. 评论区、可输入位置植入js代码

  2. url上拼接js代码,诱使用户打开

技术实现
  1. 存储型 Server

    论坛发帖、商品评价、用户私信等储存到服务器攻击

    恶意代码上传到服务器,其他用户加载页面时从服务器拉取到恶意代码在浏览器解析执行,导致攻击漏洞

  2. 反射型 Server

    攻击者构造出自己的恶意url

    攻击者结合各种手段,诱导用户点击URL

    通过URL传参的功能,比如网站的搜索框,搜索时向后台发送请求,可以写一些奇奇怪怪的搜索内容

  3. DOM型 Browser

    也是URL传参的功能,传入可执行文本,举例:

    const a = document.queryElementsByTagName("a")[0]
    
    const queryObj = []
    const search = window.location.search
    search.replace(//, (m, $1, $2) => {
      	queryObj[$1] = decodeURIComponent($2)
    })
    
    // 通过浏览器url传参来决定a标签的跳转,可能有xss注入漏洞
    // 攻击者可以传入 javascript:xxx 参数,用户点击链接时会执行恶意代码
    a.href = queryObject.redirectUrl;
    

3. 如何防范

XSS 可以攻击成功,一定是因为被攻击网站的服务端或客户端出现的代码漏洞。

  1. 对数据进行严格的编码,比如 html元素、js、css、url

    使用框架时要注意一些危险的API:

    • vue : v-html

    • react : dangerousHtml

  2. CSP (Content Security Policy) 内容安全策略

    浏览器提供的一种安全策略

    服务端可以设置响应头Content-Security-Policy,本质上是设立白名单,规定浏览器只能执行指定域名的代码,可防止 XSS 攻击

    也可以使用meta标签进行设置

    <meta
      http-equiv="Content-Security-Policy"
      content="default-src https://example.net; child-src 'none'; object-src 'none'"
    />
    
  3. 防止Cookie盗用,配置HttpOnly

    • 配置HttpOnly后可以禁止JS获取Cookie
  4. 验证码

  5. 控制输入长度,增加XSS攻击难度

CSRF Cross-site Request Forgery 跨站请求伪造

1. 概念

用户登录了某网站后,浏览器会储存该用户的登录信息,当用户访问了攻击者的网站时,攻击者可以通过在网站内部向被攻击网站发送请求,该请求会默认携带Cookie信息

CSRF 攻击已经不常见了,因为现代浏览器的安全策略已经比较严格。

2. 如何攻击

  1. 某人登陆了邮箱,浏览器储存了用户的cookie
  2. 该人访问了第三方网站,第三方网站发起修改邮箱配置的请求,比如设置邮箱自动转发到其他邮箱,由于Cookie还没过期,就可以顺利发起请求达到黑入邮箱的目的.

3. 攻击类型

  1. Get 请求

    使用Img标签

    <img src="xxx" />
    
  2. Post 请求

    2-1. 使用form表单

    <form method="POST">
    	<input type="hidden" name="account" value="xxx"/>
    </form>
    <!-- 发起请求 -->
    <script>document.forms[0].submit()</script>
    

    2-2. 诱导客户点击链接

    <a href="xxxx"/>
    

CSRF 攻击不需要确切的获取用户的Cookie,由用户自己在不知情的情况下发起请求,所以设置HttpOnly无法防范 CSRF 攻击.

XSS 攻击是执行攻击者的代码,获取用户的登录信息,再使用用户的登录信息发起请求.

XSS 和 CSRF 是有区别的

XSS 是攻击者侵入到当前网站内部,在当前网站注入恶意代码造成的攻击(当前网站)

CSRF 是用户访问或者点击第三方网站链接时,向服务器发送请求造成的攻击(第三方网站)

XSS 是利用了用户对网站的信任;

CSRF 是利用了网站对用户的信任;

3. 防范

3-1. 阻止不明外域的访问
  1. 同源检测

    • Origin Header

      如果存在Origin Header 直接通过它来判断就可以

      但是IE 11 不会在跨站CORS请求上添加Origin标头,Referer头将仍然是唯一的标识

      302重定向也会丢失Origin

    • referer header

    Referer 简介 (制定规范的时候有拼写错误,正确的单词是referrer)

    这个单词有拼写错误,它翻译过来是推荐人的意思

    当你使用google搜索访问A网站时,就会携带Referer信息,表明你是通过google来访问的A网站

    以下情况会发送Referer信息 🔥🔥 (刚好这三种情况都可能造成CSRF攻击)

    1. 用户点击网页上的链接
    2. 用户发送表单
    3. 网页加载静态资源,比如加载图片、脚本、样式

    可以通过 document.referrer来获取。

    Referrer Policy 策略

    如何设置:

    1. 在CSP设置
    2. 页面头部增加meta标签
    3. a标签增加referrerpolicy属性

    当客户访问第三方网站,并且发送了恶意的请求到服务器时,服务器就可以比对 referer 字段,来判断这个请求是否是信任的网站发送的.

    不过要注意一点:Referer在一些情况下也会丢失,可参考MDN

    • 无法确认 origin 和 referer的情况下,建议直接进行阻止

    3-2. Cookie SameSite

    默认禁止跨域携带Cookie

    3-3. 提交时要求附加本域才能获取的信息
    1. 某些安全性较高的请求需要输入手机验证码,比如支付请求等
    2. 由于攻击者拿不到Cookie,提交请求的时候可以增加附加校验,比如 Token
      • 用户登录后,服务器会生成一个加密的token作为该用户的标示返回给客户端,客户端会储存这个token

      • 用户在浏览网站发送请求时,为每个请求携带token

      • 服务器收到token后对其验证其有效性,对其解密来获取到用户信息(一般可以存到redis中)

    CSRF Token虽然可以防止CSRF攻击,但是可能遭到XSS攻击泄漏token

    1. 双重Cookie验证

      • 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。
      • 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。
      • 后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

      优点:

      • 比token简单

      缺点:

      • 这样的模式注定不能使用HttpOnly,意味着可能遭到XSS攻击