网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

什么是跨站请求伪造(CSRF)?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

跨站请求伪造(CSRF)这是一种严重的网络漏洞,攻击者可以利用该漏洞诱使经过身份验证的用户执行一些非预期的操作,比如更改账户信息,甚至完全控制这些用户的账户。

网络应用程序通常依赖于……饼干为了维持用户会话,由于HTTP是一种无状态协议,因此无法提供持久性的身份验证功能。如果没有Cookie的话,用户每次请求都需要重新输入自己的凭据,这会严重影响用户体验。Cookie可以存储会话信息,从而解决这一问题。不过,如果Cookie没有得到适当的保护,那么应用程序就容易受到CSRF攻击的威胁。

想象一下,你登录了在线银行账户来查看自己的余额。与此同时,一个恶意网站悄悄诱导你的浏览器进行未经授权的交易。这就是跨站请求伪造攻击的一种表现。这种严重的网络安全漏洞会影响无数网站。识别这种威胁对于用户和开发者来说都非常重要,这样才能打造更安全的在线体验。

实施 CSRF 攻击所需的条件

为了成功实施 CSRF 攻击,以下条件必须同时满足:

有意义的行动/有效的行动该应用程序会展示攻击者想要触发的操作,例如:

  • 更改用户的电子邮件或密码
  • 转账
  • 修改账户权限

基于Cookie的会话处理

  • 该应用程序仅通过会话Cookie(或浏览器自动包含的其他凭证)来识别用户。
  • 浏览器会自动将那些凭证发送出去,同时也会从其他网站那里获取请求信息。
  • 没有实施任何额外的服务器端验证措施,例如CSRF令牌、同源Cookie策略或重新认证等。

可预测的请求参数

  • 攻击者可以确定或猜测出执行该操作所需的所有参数。
  • 如果某个请求需要一种保密或随机的值作为参数(例如,当前密码、一次性令牌或不可预测的非唯一值),那么CSRF攻击将会失败。

现实中的剥削行为

攻击者可以创建这样的恶意网页:

HTML
<HTML =“en”><头部>  <元数据/元数据 字符集=“utf-8” />  < 名称=“视口” 内容=“width=device-width, initial-scale=1” />  <标题>GFG BANK</标题>  <风格/样式>身体{字体族:Inter,系统界面设计,-苹果系统,“Segoe UI”,Roboto,无衬线字体;背景/背景信息:#f2f6fb;边际:0;填充:0;显示/展示:灵活性/适应性;对齐方式:中心;justify-content:中心;高度:100vh;}.卡片{背景/背景信息:#fff;边框圆角:12px;盒阴影:06px24pxrgba(20,30,50,0.08);宽度:360px;填充:28px;}.品牌{显示/展示:灵活性/适应性;对齐方式:中心;差距/差异:10px;底部边距:18px;}.标志/标识{宽度:40px;高度:40px;边框圆角:8px;背景/背景信息:线性渐变(135deg,#0066ff,#00a3ff);}h1{字体大小:18px;边际:0;}p.注意/备注{颜色:#b23;字体粗细:600;边际:12px0;字体大小:13px;}标签/名称{字体大小:13px;颜色:#334155;显示/展示:块/区块;顶部边距:12px;}输入[类型/种类=“文本”],输入[类型/种类=“密码”]{宽度:100%;填充:10px12px;顶部边距:6px;边界:1px固体#e6eef9;边框圆角:8px;背景/背景信息:#fbfdff;盒模型:边框框;}.行为/行动{显示/展示:灵活性/适应性;justify-content:中间的空间/间距;对齐方式:中心;顶部边距:18px;}按钮{背景/背景信息:#0066ff;颜色:白色;边界:没有;填充:10px14px;边框圆角:8px;光标:指针;}.鬼魂/幽灵{背景/背景信息:透明的;边界:1px固体#e6eef9;颜色:#334155;填充:8px12px;边框圆角:8px;光标:指针;}.放弃权利/声明不承担责任{字体大小:12px;颜色:#667085;顶部边距:14px;行高:1.3;}页脚{顶部边距:16px;文本对齐方式:中心;字体大小:12px;颜色:#9aa4b2;}</风格/样式></头部><身体>  <除法 类/类别=卡片 角色/职责=“主要” 带有指定标签的“aria”元素=标题>    <除法 类别/等级=品牌>      <除法 类/类别=“标志” aria-hidden=“真实”></除法>      <除法>        <h1 id=标题>GFG Bank</h1>      </除法>    </除法>    <形式/结构 id=“demoForm” 未提交=“return handleDemo(event)” 自动完成功能=“关闭” 确认/批准>      <标签/名称 为了=“用户”>Username or email</标签/标记>      <输入 id=“用户” 名字=“用户” 类型/种类=“文本” 占位符=“输入用户名” 必需的/必要的 />      <标签/标记 为了=“通过”>Password</标签/名称>      <输入 id=“通过” 名字=“通过” 类型/种类=“密码” 占位符=•••••••• 必需的/必要的 />      <除法 类别/分类=“行为”>        <按钮 类型/种类=提交/呈交>Sign in</按钮>        <按钮 类型/种类=“按钮” 类/类别=“鬼” onclick=“resetForm()”>Reset</按钮>      </除法>    </形式/结构>    <页脚>      <除法>GFG BANK</除法>    </页脚>  </除法>  <脚本/程序>功能/作用消毒/杀菌(s){返回字符串(s).替换(/[<>]/g,'');}功能/作用handleDemo(e){e.防止默认行为();常量用户=消毒/杀菌(文件/文档.通过ID获取元素(“用户”).价值);常量通过/传递=消毒/杀菌(文件/文档.使用 `getElementById` 方法可以轻松地获取具有特定ID的元素。(“通过”).价值);if(!用户||!通过/传递){警报/提示(请填写两个字段的内容。);返回错误的/不正确的;}// 演示行为:仅显示本地模态窗口,并清除所有输入内容。警报/提示(演示:凭据在本地被捕获(未发送)。\n用户名:‘+用户+密码长度:‘+通过/传递.长度);重置表单();返回错误的/不正确的;}功能/作用重置表单{文件/文档.通过ID获取元素(‘demoForm’).重置();}</脚本/程序></身体></HTML>
  1. 隐藏的表单会自动被提交。
  2. 受害者的浏览器在请求中包含了他们有效的会话Cookie。
  3. 这个易受攻击的网站认为用户已经请求了更改,于是会将电子邮件地址更新为攻击者所指定的内容。

示例场景

以下是一些以现实世界中的场景为灵感而设计的CSRF攻击示例。

示例1:基于GET请求的状态变更(存在漏洞的端点 + 图像标签)

当应用程序对HTTP进行状态变更操作时获取/获得这是一种不良的做法。攻击者可以通过图像或脚本标签来触发这种操作,这些标签会被浏览器自动加载。这样一来,浏览器就会将这些请求与相关的Cookie一起存储起来。

脆弱的终端设备:

GET /vote?post=123&up=1

逐步的攻击流程

  1. 受害者已登录系统。forum.example.
  2. forum.example存在易受攻击的端点访问路径:GET /vote?post=123&up=1该记录包含了投票结果(通过GET请求获取状态变更信息)。
  3. 攻击者插入了内容/数据<img src="https://forum.example/vote?post=123&up=1">可以通过页面或电子邮件来发送。
  4. 受害者打开该页面或邮件;浏览器通过Cookie请求图片的URL,此时投票行为被记录下来。

经过消毒处理的攻击代码片段

<img src="https://forum.example/vote?post=123&up=1" alt="">

获取/得到永远不要改变服务器的状态;应使用安全的HTTP方法(如POST、PUT、DELETE),同时还需要采取CSRF防护措施。

示例2:使用Cookie认证方式的SPA与REST API的结合(API CSRF机制)

那些使用基于Cookie的会话机制的单页应用程序,如果其API能够接受仅通过Cookie进行身份验证的请求,并且缺乏CSRF防御机制的话,那么这些应用程序就存在安全漏洞。

逐步的攻击流程

  1. 用户已登录。该人进行登录操作。example.com该网站会向用户的浏览器发送一个名为“小文件”的文件。会话Cookie请记住,他们已经登录了系统。
  2. 攻击者的诈骗页面:攻击者会创建一个网页,该网页会秘密地发送这样的请求:
    fetch("https://api.example.com/user/delete-account", { method: "POST", credentials: "include" });
    这段代码告诉浏览器:“发送一个请求来删除该用户的账户,同时需要带上用户已经拥有的所有Cookie信息。”
  3. 浏览器发送该Cookie:由于该会话的Cookie属于同一个网站,因此浏览器会自动将其添加到请求中。api.example.com).
  4. 该账户已被删除(如果没有任何保护措施的话)。如果该API没有实施CSRF保护机制,那么它会认为该请求是有效的,并删除账户。而实际上,用户根本没有点击过“删除”按钮。

CSRF的实战演练

以下是关于 CSRF 的逐步实验步骤:

步骤1:将DVWA的安全级别设置为“LOW”。

以用户名“DVWA”登录。管理员在 DVWA 安全页面中,将级别设置为这样一来,CSRF保护就变得非常弱,甚至完全不存在了。这对于学习来说显然是不利的。

步骤2:找出存在漏洞的操作,并对该操作进行仔细检查。

  • 在DVWA中,打开该应用程序。CSRF这是一个包含相关功能的脆弱性页面,用户可以通过它来执行状态变更操作。
  • 通常,该操作只需执行一次即可(填写表单并提交)。在“网络”选项卡中,你会看到对目标端点的请求信息。点击该请求信息后,可以查看以下信息:请求方式(POST或GET)、请求URL,以及表单字段的名称和值等。新密码确认新的P点。密码)
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料