首页 > 其他分享 >CSRF跨站请求伪造攻击详解

CSRF跨站请求伪造攻击详解

时间:2024-12-25 21:41:49浏览次数:3  
标签:跨站 请求 攻击 Referrer 用户 Token 详解 CSRF

一、CSRF攻击概述

1.1 CSRF攻击定义

  1. 用户浏览器加载恶意网站时,浏览器中的恶意网站页面向另一目标网站自主发起一个恶意HTTP请求,该攻击方式即为CSRF攻击。

1.2 CSRF攻击的本质

  1. 在CSRF攻击中,攻击者诱使用户的浏览器发起一个恶意请求,本质上是借助用户的凭证,以用户的身份去执行特定的操作。
  2. 在用户访问攻击者构造的恶意页面时,如果此时浏览器访问第三方站点带上了第三方的Cookie,那么第三方站点会认为这是一个已登录的用户的访问请求,浏览器就可顺利完成请求操作,因此该攻击方式叫做“跨站请求伪造”。
  3. 在整个攻击过程中,攻击者并没有拿到受害者的身份凭证,也拿不到操作后的返回结果(同源策略),攻击者只是诱使受害者发出了一个特定的请求。

二、CSRF蠕虫

  1. 实现蠕虫传播需要利用漏洞携带攻击代码自动扩散,如果CSRF漏洞满足以下两个条件,即可实现自动扩散:
    1. 在应用中发送其他用户课件内容的功能存在CSRF漏洞,比如发私信、发个人动态、发博客等功能。
    2. 发送的内容中可以嵌入链接,诱使用户点击,从而触发CSRF漏洞。
  2. 以“发博客功能存在CSRF漏洞”为例,攻击者可以构造恶意页面,内容如下:
<form id="myForm" astion="http://example.com/new_blog" method="POST">
    <input name="content" value='<a href="http://evil.site/csrf.html">click me</a>'>
</form>
<script>
    document.getElementById('myForm').submit();
</script>

三、防御CSRF攻击

3.1 不成熟方案

3.1.1 验证码

  1. CSRF攻击在用户不知情的情况下构造了网络请求,而验证码则强制用户必须与应用进行交互才能完成最终请求,因此在通常情况下,验证码能够很好地遏止CSRF攻击。
  2. 缺点
    1. 处于用户体验考虑,网站无法给所有操作都加上验证码,因此,验证码只能作为防御CSRF攻击的一种辅助手段,不能作为最主要的解决方案。

3.1.2 Referrer校验

  1. 常见的互联网应用,页面与页面之间都有一定的逻辑关系,因此每个正常请求的Referrer会有一定规律,比如在论坛“发帖”的操作,在正常情况下需要先登录到用户后台,或者访问具有发帖功能的页面,在提交“发帖”的表单时,Referrer值必然是发帖表单所在的页面。如果Referrer值不是这个页面,甚至不是发帖网站的域,那么该请求极有可能是CSRF攻击。
  2. 缺点
    1. 缺点一:服务器并非在什么时候都能获取到请求头中的Referrer。
      1. 不少浏览器扩展为了保护个人隐私,常常会限制Referrer的发送;在某些情况下,浏览器本身就不会发送Referrer,比如从HTTPS跳转到HTTP,出于保护HTTPS全链路数据的考虑,浏览器不会发送Referrer到明文的HTTP请求中。
      2. 如果服务端应用忽略了Referrer为空的情况,对这种请求不做拦截,那么CSRF防御功能将完全失效。
    2. 缺点二:很多Web应用功能复杂,开发者如果对每个功能都校验完整的Referrer,代码将很难维护。
      1. 当业务变化导致URL变动时,还得更改其他接口的Referrer校验逻辑,因此大部分校验Referrer的CSRF防御方案都仅仅是校验Referrer中的域名。
      2. 如果应用内部本身就能发送链接,那么在应用内部就能发起Referrer合法的恶意GET请求,这样还是能够绕过检测Referrer值的方案。

3.1.3 Cookie的SameSite属性

  1. Cookie的SameSite属性可以控制Cookie在跨站点请求中是否生效。
  2. 尽管将Cookie的SameSite属性设置为Strict模式能够缓解域外的CSRF攻击,但仍避免不了从域内发起CSRF攻击。
  3. Cookie的SameSite属性在设计时就不是用于CSRF防御的,其只能在一定程度上缓解CSRF攻击。

3.2 成熟方案

3.2.1 Anti—CSRF Token

  1. CSRF攻击之所以能成功,其原因是重要操作的所有参数都是可以被攻击者猜到的。如果攻击者能够猜出URL中的所有参数与参数值,就能够成功构造一个伪造的请求;反之,则无法攻击成功。
  2. Anti—CSRF Token防御方案
    1. 用户在发起“进行重要操作”的请求时,需要指明一个Token参数值;
      1. 该Token参数值由服务端使用“足够安全的随机数生成算法”生成并存储在客户端的Cookie或服务端的session中,Token参数值为用户与服务端的共同秘密;
    2. 如果发送请求时的参数值与Cookie中的Token参数值或session中的Token参数值不相同,那么该请求无效;
    3. 由此,在用户不知情的情况下,攻击者无法构造出含有正确参数的恶意请求;
  3. Anti—CSRF Token方案的使用原则
    1. Token参数值一定要足够随机化;
    2. 为了使用方便,可以在一个用户的有效绘画周期内都使用同一个Token参数值;
    3. 在Web应用中执行敏感操作时,应该通过form表单或通过AJAX以POST请求的形式提交;
      1. 以POST请求提交能提高Token的保密性,因为如果Token出现在某个页面的URL中,则可能会通过Referrer的方式被泄露给其他站点;

四、LabCross-Site Request Forgery Attack Lab

【待更新】

标签:跨站,请求,攻击,Referrer,用户,Token,详解,CSRF
From: https://www.cnblogs.com/Yu-Xing-Hai/p/18631468/CSRF

相关文章

  • 嵌入式单片机中串口通信实现详解
    串口通信的概念通信的概念通信指的是CPU和外部设备之间或者计算机与计算机之间的数据交互。                  通信的种类处理器与外部设备之间的通信方式有两种:   串行通信            并行通信      ......
  • Transformers 框架 Pipeline 任务详解(六):填充蒙版(fill-mask)
    在自然语言处理(NLP)领域,填空或填补句子中的缺失部分是一项重要的任务。它不仅考验了模型对语言的理解能力,还展示了其生成合理且语义连贯的文本的能力。HuggingFace的Transformers框架通过其PipelineAPI提供了强大的fill-mask功能,允许开发者和研究者轻松构建并应用这种填空技......
  • Spring Boot 知识体系详解:原理、配置与开发实战
    一、概述目的SpringBoot的主要目的是简化Spring应用程序的初始搭建以及开发过程。它采用了“约定优于配置”的原则,减少了开发人员需要编写的样板代码(如配置文件)数量。例如,在传统的Spring应用中,要配置一个数据源,需要在XML配置文件或者Java配置类中进行大量的配置,包括数据库连......
  • 【开源-详解】基于51单片机的智能闹钟设计 - 第二节 - 硬件连接与模块函数解析
    51单片机智能闹钟--硬件连接与模块函数解析硬件准备:模块函数解析OLED驱动模块(调用部分)DHT11温湿度传感器(调用部分)DS1302时钟模块(调用部分)蜂鸣器模块(此处是无源蜂鸣器)空气质量检测模块(DO)按键模块小节总结硬件准备:使用到的模块:–DHT11温湿度传感器x1–MQ135空气......
  • 项目管理专业人员PMP认证超全详解,打造职场核心竞争力!
    PMP认证介绍PMP®指的是项目管理专业人士资格认证,它是由美国计算机协会(ProjectManagementInstitute,简称PMI®)发起的,PMP®认证是严格评估项目管理人员知识技能是否具有高品质的资格认证考试。是目前全球项目管理方面含金量最高的资格认证,也是项目管理专业人士身份的象征。......
  • Linux常用选项之tr命令详解
    tr(translate)是Linux系统中一个非常实用的命令行工具,主要用于字符转换或删除操作。它从标准输入读取数据,执行指定的转换处理,并将结果输出到标准输出。tr命令的主要功能包括但不限于大小写转换、删除特定字符、压缩重复字符等。功能与特性字符替换:可以将一组字符替换成另一......
  • 全面解析基数排序:定义、原理、复杂度、稳定性及实现步骤详解
    定义基数排序(RadixSort)是一种非比较型整数排序算法,它是根据数字的每一位来排序。它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。对于有d位的整数,需要进行d趟排序。工作原理以最低有效位(Least-Significant-Digit,LSD)为例首先,考虑待排序的整数......
  • 冒泡排序全攻略:概念、原理、复杂度与代码详解
    一、冒泡排序的基本概念冒泡排序(BubbleSort)是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢......
  • 详解选择排序:从概念到代码的完整指南
    一、选择排序的基本概念选择排序(SelectionSort)是一种简单的排序算法。它的基本思想是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。二、选择排序的过程......
  • Go语言基础数据类型详解:整型、浮点型、复数与字符串
    Go语言基础数据类型详解:整型、浮点型、复数与字符串Go语言作为一门静态强类型的语言,其数据类型设计简洁而高效。掌握Go的基本数据类型是每个开发者深入理解Go语言的基础。本篇文章将详细介绍Go语言中最常见的基本数据类型,包括整型、浮点型、复数、布尔型、字符串等,并结合实例代码......