详解入门安全测试最难懂的概念 —— CSRF

news2024/11/24 16:28:57

 

对于刚刚入门安全的同学来说,csrf是最难理解的概念之一,本文会用最简单的方式对csrf进行讲解,包括csrf的定义,csrf典型的攻击流程以及如何对其进行防范,希望本文能够帮到大家!

CSRF定义

CSRF(Cross Site Request Forgery, 跨站域请求伪造)攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。经典图解如下:

 

一个典型的CSRF攻击流程

1.受害者登录a.com,并保留了登录凭证(Cookie)。

例如:受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000&for=bob2 可以使 Bob 把 1000的存款转到 bob2 的账号下。

2.攻击者引诱受害者访问了b.com,b.com 向 a.com 发送了一个请求:a.com/act=xx

例如:黑客 Kevin 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Kevin自己做一个网站,在网站中放入如下代码src=”http://bank.example/withdraw?account=bob&amount=1000&for=kevin”,

并且通过广告等诱使 Bob 来访问他的网站。

3.a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。a.com以受害者的名义执行了act=xx。

例如:当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到Kevin 的账号,而 Bob 当时毫不知情。

4.攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作

从上面的例子可知,CSRF 攻击是黑客借助受害者的 cookie 骗取服务器的信任,但是黑客并不能拿到 cookie,也看不到 cookie 的内容。黑客无法从返回的结果中得到任何东西,他做的就是给服务器发送请求,执行请求中的用来干坏事的命令,在服务器端改变了数据的值,而非窃取服务器中的数据。所以关于csrf,我们要保护的对象是那些可以直接产生数据改变的服务,而非读取数据的服务。

CSRF防范

防范csrf,通常可以采用如下三种方式:

1.验证 HTTP Referer 字段

请求:http://bank.example/withdraw?account=bob&amount=1000&for=bob2 

Referer 的值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。这种方法是有缺陷的。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。但是随着ie低版本的产品逐步淡出历史舞台,所以大家还是可以放心使用的!

2. 通过csrf token验证

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

具体实现思路如下:

提交需要进行csrf防护的请求到服务器,后台会去查一下session里面,有没有token,如果有的话,就把它销毁掉,然后生成一个新的token,赋值到session里面去。下图实现了

后端生成的token,显示到前端的代码示例:

 

这个例子对应了一个POST请求,由于token是随机生成的,黑客很难对其进行伪造!如果是

GET 请求,token 将附在请求地址之后,例如 URL  http://url?csrftoken=tokenvalue

另外如果在一个应用中多处请求都需要进行csrf进行校验,那么会对应用性能产生一定的影响,需要对此做出平衡。

3.Set-Cookie响应头新增Samesite属性

SameSite属性可以让 Cookie 在跨站请求时不会被发送,从而阻止了跨站请求伪造攻击(CSRF)。它有三个属性值

  1. Strict 完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。
  2. Lax 允许部分第三方请求携带 Cookie。
  3. None 无论是否跨站都会发送 Cookie。

这种方式与HTTP Referer 类似,只不过支持 SameSite需要使用各个浏览器厂商提供的更为高版本的产品,如下图所示:

 

详情请参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

CSRF目前已不是高危漏洞

其实,目前csrf已经不算高危安全漏洞了(因为攻击成功概率较小),但是对csrf的理解是非常有助于帮助大家对安全知识的理解和学习的!2021 owasp top10中csrf已经没有上榜了,已经如下图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos学习笔记 (1)Nacos的简介与安装

1. Nacos 介绍与发展前景 1.1 官网概览: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一…

性能测试(一)—— 概述、策略、指标、流程

目录 一、性能测试概述 1、为什么要进行性能测试? 2、性能测试的概念 2.1 什么是性能? 2.2 什么是性能测试? 2.3 性能测试目的 3、性能测试与功能测试 3.1 焦点不一样 3.2 关系 二、性能测试策略 1、性能测试策略 1.1 基准测试 …

PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)

1080608 28.8 KB PO的思想最早是2013年由IT大佬Martin Flower提出的: martinfowler.com bliki: PageObject A page object wraps an HTML page, or fragment, with an application-specific API, allowing you to manipulate page elements for testing without d…

MVC操作方法如何绑定Stream类型的参数

1、我需要读取HTTP消息的整个 body 来填充 MVC 方法参数; 2、HTTP消息的 body 不是 form-data,而是完全的二进制内容。 最简单的方法就是不使用模型绑定,即在MVC方法中直接访问 HttpContext.Request.Body。 var request HttpContext.Requ…

[附源码]计算机毕业设计Python的物品交换平台(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

使用设备树给DM9000网卡_触摸屏指定中断

目录 1 在设备树中描述网卡中断 2 dm9dev9000c.c 3 在设备树中描述触摸屏中断 1 在设备树中描述网卡中断 srom-cs420000000 {compatible "simple-bus";#address-cells <1>;#size-cells <1>;reg <0x20000000 0x8000000>;ranges;ethernet20000…

ESP 常用的低功耗配置选项解析

此篇博客介绍 ESP 常用的低功耗配置选项。 1.常用功耗优化配置选项 1.1.动态调频 CPU 工作的频率越高&#xff0c;功耗消耗也越大。通过 DFS&#xff08;dynamic frequency scaling&#xff0c;动态调频&#xff09;可以让系统自动切换工作频率&#xff0c;达到功耗和性能间…

Transformers学习笔记1. 一些基本概念和编码器、字典

Transformers学习笔记1. 一些基本概念和编码器、字典一、基本概念1. Hugging Face简介2. Transformers&#xff08;1&#xff09;简介&#xff08;1&#xff09;预定义模型&#xff08;2&#xff09;使用方法3. Datasets查看有哪些公开数据集方法1&#xff1a; 使用datasets包的…

深入分析JVM执行引擎

程序和机器沟通的桥梁 一、闲聊 相信很多朋友在出国旅游&#xff0c;或者与外国友人沟通的过程中&#xff0c;都会遇到语言不通的烦恼。这时候我们就需要掌握对应的外语或者拥有一部翻译机。而笔者只会中文&#xff0c;所以需要借助一部翻译器才能与不懂中文的外国友人交流。咱…

Android入门第51天-使用Android的SharedPreference存取信息

简介 上一篇我们介绍了在android里如何读写本地文件。我们有一种场景&#xff0c;类似网页的cookie&#xff0c;要把用户的一些储如上一次登录、使用的痕迹等信息保存下来以便于每次不需要做重复“填表单”的操作&#xff0c;当在这种场景下我们如果也使用本地文件读写的话显然…

关于Unity使用Aspose.Words创建表格单元格垂直合并不生效情况说明

文章目录&#x1f449;一、前言&#x1f449;二、问题重现1、首先看一下我用下面两段代码创建的表格&#xff1a;2、被这个问题折磨的心路历程&#x1f449;三、分析原因&#x1f449;四、解决方法&#x1f449;一、前言 最近在使用Aspose.Words.dll实现创建表格功能时&#x…

Google Earth Engine APP(GEE)——用一个选择器选择不同城市的应用

我们很多时候在进行应用制作的时候,都会用到选择器用于添加不同的城市,从而进一步选择不同的区域进行分析,本文就将准备一个包含有城市的矢量数据,按照名字进行筛选,最终展示不同城市的所在范围,从而实现简单的select选择器的调用。本文最主要的就是这个回调函数。 具体…

C语言基础—指针(地址引用、指针数组、二次指针)

本章主要讲解指针的基本定义和指针的传递、偏移。后面继续讲解指针数组和多维指针、二级指针等 知识点&#xff1a; 指针的定义和指针分类各类指针的字节长度取决于系统位数指针的传递&#xff08;值传递和引用(地址传递)&#xff09;指针的偏移&#xff08;自增自减号&#x…

动态优化解决方案空间中的最小支持(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 相对于求解函数极值这类静态问题&#xff0c;许多存在于真实世界的优化问题都是在动态变化的&#xff0c;这一类问题被称为动态…

201732-35-6,H2N-AFP-pNA

AFP-pNA&#xff0c;来自牙周病原体牙龈卟啉单胞菌和黑普氏菌的脯氨酸三肽基氨基肽酶的底物。 编号: 189876中文名称: 三肽Xaa-Xaa-Pro tripeptidylpeptidase substrateCAS号: 201732-35-6单字母: H2N-AFP-pNA三字母: H2N-Ala-Phe-Pro-pNA氨基酸个数: 3分子式: C23H27N5O5平均分…

React 入门:脚手架代理配置

文章目录React AjaxAxios在 React 中使用 Axios脚手架代理配置React Ajax 理解 React 本身只关注于界面&#xff0c;并不包含发送 ajax 请求的代码。前端应用需要通过 ajax 请求与后台进行交互&#xff08;json 数据&#xff09;。React 应用中需要继承第三方 ajax 库&#xff…

C++ · 入门 | 准备知识

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

uniapp实现楼层导航 ,滚动定位,锚点导航

uniapp实现楼层导航的核心技术要点&#xff1a; 1、scroll-view作为视图容器&#xff0c; 2、用其属性scroll-into-view,用于完成点击联动 3、uni.createSelectorQuery().selectAll();获取右侧所有元素信息&#xff0c;获取top值存入数组&#xff0c;用于计算滑动时需要的联动…

Vue-cli工程中每个文件夹和文件的用处

dist 文件夹&#xff1a;默认 npm run build 命令打包生成的静态资源文件&#xff0c;用于生产部署 node_modules&#xff1a;存放npm命令下载的开发环境和生产环境的依赖包 public&#xff1a;有的叫assets&#xff1a;存放项目中需要用到的资源文件&#xff0c;css、js、im…

【Linux】软件包管理器yum

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;Linux软件…