【CSRF-01】跨站请求伪造漏洞基础原理及攻防

article/2025/9/23 3:59:50

目录

  • 1 CSRF概述
  • 2 CSRF攻击过程及原理
    • 2.1 CSRF场景例子
    • 2.2 攻击过程
    • 2.3 原理
    • 2.4 攻击成功的条件:
  • 3 CSRF攻击方式/如何触发
  • 5 CSRF的防御
    • 5.1 一些无效的防御手段
    • 5.2 有效的防御手段
  • 6 总结
  • 参考文章

1 CSRF概述

定义:CSRF(Cross-site request forgery,跨站请求伪造) 也被称为One Click Attack 或者 Session Riding ,通常缩写为 CSRF或者XSRF,是一种欺骗受害者提交恶意请求的攻击。它继承了受害者的身份和特权,代表受害者执行非本意、恶意的操作。强制终端用户在当前对其进行身份验证后Web应用程序上执行非本意的操作。

发生地点:Web应用程序上,不是系统也不是组件。
发生时间:在终端用户在当前对其进行身份验证后。
发生形式:“强制”执行用户非本意的操作,此处的强制也可以是诱导用户执行的。

目标
主要目的是伪造更改状态(如修改密码、转账)的请求而不是盗取数据,因为攻击者无法看到对伪造请求的响应。借助一些社工的帮助(例如通过电子邮件或聊天发送链接),攻击者可以诱骗用户执行攻击者选择的操作。

CSRF 攻击目标是能够更改服务器状态或数据的业务或功能,例如更改受害的电子邮件地址、密码或购买商品。强制受害者查询数据,对于供给者来说没什么用,因为无法获得服务器响应。因此,SCRF攻击正对引起状态变化的请求。

有时可以将CSRF 攻击存储在易受攻击的站点上。这些漏洞被称为“存储的CSRF漏洞”。这可以通过简单地接受HTML 的字段中存储IMG 或IFRAME 标记,或通过更复杂的跨站点脚本攻击来实现。如果攻击可以在站点中存储SCRF 攻击,则攻击的严重性会放大。特别是,收到攻击的可能性增加,因为受害者比互联网上的某个随机页面更有可能查看包含攻击的页面。(具备普遍性)

与XSS对比
尽管CSRF听起来像跨站脚本XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站 。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)也难以防范,所以被认为比XSS更具危险性。

CSRF危害

  • 如果受害者是普通用户,则CSRF攻击可以成功地强制用户执行状态更改的请求,例如以目标用户的名义发送邮件、发消息,盗取目标用户的账号,甚至购买商品、虚拟货币转账,这会泄露个人隐私并威胁到了目标用户的财产安全。
  • 如果受害者是管理员账户,CSRF可能危害整个Web应用程序。
  • 例子:你想给某位用户转账100元,那么单击“转账”按钮后,发出的HTTP请求会与http://www.xxbank.com/pay.php?user=xx&money=100类似。而攻击者构造链接http://www.xxbank.com/pay.php?user=hack&money=100,当目标用户访问了该URL后,就会自动向Hack账号转账100元,而且这只涉及目标用户的操作,攻击者并没有获取目标用户的cookie或其他信息。

2 CSRF攻击过程及原理

2.1 CSRF场景例子

假如有一个受信任的站点银行网站,用户登录了银行网站并已经进行了身份验证,用户在未退出银行网站的情况下,访问了黑客发的某个钓鱼链接,使得用户在不知情的情况下相当于向银行发起了转账请求。
在这里插入图片描述

2.2 攻击过程

(1)用户C浏览并登陆信任的服务器站点A;
(2)用户C登陆A验证通过,在用户C的浏览器上产生A的Cookie等相关信息;
(3)用户C在没有退出登陆的情况下访问攻击站点B;
(4)用户C被攻击站点B载入了恶意代码;
(5)载入的恶意代码给第三方的站点A发出一个伪造的请求(该请求不是用户非本意的请求);发送请求时,用户C的浏览器会将第2步中自身所携带的cookie等信息发送给站点A;
(6)站点A无法区分5中发出的请求是否是由用户C的本意,由于浏览器会自动带上用户C的Cookie,所以A会根据C的权限处理5的请求。

2.3 原理

(1)原理简答概况为:攻击者利用目标用户的身份,以目标用户的名义执行某些非法操作。

(2)对于大多数站点,浏览器请求自动发送与站点关联的所有凭据,例如用户的会话cookie、IP地址、Windows域凭证等。因此,如果用户当前已对站点进行了身份验证,则该站点将无法区分客户端发送的请求是攻击者伪造的还是受害者本意的。

2.4 攻击成功的条件:

(1)用户已经登录了站点 A,并在本地记录了 cookie。
(2)在用户没有退出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B(B 站点要求访问站点A)。
(3)站点 A 没有做任何 CSRF 防御。

3 CSRF攻击方式/如何触发

(1)GET请求类型

  • 使用a标签定义超链接。例如攻击者在恶意网页中,某个a标签语句源代码是<a href="目标站点网页+相关参数">兼职</a>,当受害者点击该网页时,就会向目标站点发送攻击者伪造的请求。
  • 使用img标签插入图像。例如攻击者在恶意网页中,某个img标签语句源代码是<img src="目标站点网页+相关参数">,当受害者刷到该网页的时候,就会向目标站点发送攻击者伪造的请求,由于src不是一个图片的远程地址,所以此时图片显示出错。
  • 其他一些可以触发攻击者伪造URL的标签。

(2)POST请求类型

  • 即使网站相关操作采用的是POST方法,攻击者也可以通过构造表单的方式来伪造请求,核心代码如下:其中第2~5行是攻击者伪造的请求和参数,通过受害者点击a标签触发JS代码提交伪造请求。
<meta charset='utf-8'>
<form name ='csrf'
action ='目标站点网页'
method = 'post'>
<input type= 'hidden' name='username' vlaue='攻击者伪造'>
<input type= 'hidden' name='money' vlaue='攻击者伪造'>
</form>
<script>document.csrf.submit()</script>
<img src='./1.jpg'><br />
<a href='javascript:document.csrf.submit()'>兼职</a>
  • 与XSS相结合,上述两种攻击方式,攻击者需要自己搭建一个网站用于存放那些带有恶意代码的网页,而与XSS相结合的CSRF跨站请求伪造是将恶意代码存放与他人的网站中。比如,攻击者通过研究目标网站的业务流程,构造以下代码,假如目标网站的管理员在登录目标网站的情况下触发了这段代码,则会在网站上自动注册一个账户。
<script>
xmlhttp=new XMLHttpRequest();
xmlhttp.open(\'post\',\'http://目标网站\',false);
xmlhttp.setRequestHeader("Cintent-type","application/x-www-form-urlencoderd");
xmlhttp.send(\'act=add&username=hacker&password=123456&password2=123456&其他参数\');
</script>

5 CSRF的防御

5.1 一些无效的防御手段

(1)使用密码cookie
所有的cookie,即便是密码的cookie,也会随着每个请求一起提交,无论最终用户是否被欺骗提交请求,都将提交所有身份证明令牌或凭证。

(2)仅接受POST请求
开发者可以开发应用程序以仅接受用于执行业务逻辑的POST请求,误解以为攻击者无法构建恶意链接,因此无法执行CSRF攻击。不幸的是,这种逻辑是不正确的,有许多方法可以让攻击者欺骗受害者提交伪造的POST,例如在隐藏值的攻击者网站中托管的简单表单,此表单可以由JavaScript自动触发,也可以由受害者(以为表单会执行其他操作的)触发。

(3)多步交易
多步交易不足以预防CSRF,只要攻击者可以预测或推断完整事务的每个步骤,就可以实现CSRF。

(4)URL重写
这可能被视为一种有用的CSRF预防技术,因为攻击者无法猜测受害者的会话ID,但是用户的会话ID在URL中公开,所以不建议通过引入另一个安全漏洞来修复一个安全漏洞。

(5)HTTPS
HTTPS本身无法低于CSRF,但是,HTTPS应被视为任何预防措施值得信赖的先决条件。只要目标网站没有使用https,渗透测试报告中就需要就该点提出问题。

5.2 有效的防御手段

(1)验证Referer字段
根据HTTP协议,在HTTP头中有Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于网站自身。由于Referer支持客户端自定义,所以只能认为不是来源于网站自身的请求不可信,但不足以认为referer是网站自身就可信。

(2)添加Token验证
CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中以参数的形式加入一个随机产生的token(随机字符串),并在服务器端建立一个拦截器来验证所有请求的token,如果请求中没有token或token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

(3)二次验证
二次验证就是在转账等关键操作之前提供当前用户的密码或验证码,该方法能有效低于CSRF攻击。

(4)用户养成良好的上网习惯
养成良好的上网习惯,则能够很大程度上减少CSRF攻击的危害。例如,用户上网时,不要轻易点击网络论坛、聊天室、即时通讯工具或电子邮件中出现的连接或图片;及时退出长时间不使用的已登录账户,尤其是系统管理,应尽量在登出系统的情况下点击未知来源的链接或图片。除此之外,用户还需要在连接互联网的计算机上安装合适的安全防护软件,并及时更新关键厂商发布的特征库,以保持安全软件对最新攻击的实时跟踪。

6 总结

(1)理解CSRF的攻击原理;
(2)重点掌握CSRF的三种攻击方式;
(3)了解CSRF的危害;
(4)重点掌握CSRF的防御手段。

参考文章

[1]《什么是CSRF?如何防御CSRF攻击?》


http://chatgpt.dhexx.cn/article/D1y9dHG0.shtml

相关文章

一文带你学习跨站点请求伪造(CSRF)

一文带你学习跨站点请求伪造&#xff08;CSRF&#xff09; 1.何为CSRF2.浏览器的Cookie策略3.P3P头的副作用4.CSRF攻击流程5.CSRF的分类GET型POST-表单型POST-JSON型 6.CSRF的快速验证7.CSRF的防御验证码Referer CheckAnti CSRF Token 1.何为CSRF CSRF的全名是Cross Site Requ…

flask中的csrf防御机制

csrf概念 CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&…

跨站请求伪造(csrf)

1、csrf介绍 CSRF (Cross-site request forgery&#xff0c;跨站请求伪造)也被称为One Click Attack或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS)&#xff0c;但它与XSS非常不同&#xff0c;XSS利用站…

跨站请求伪造

1. 什么是跨站请求伪造&#xff08;CSRF&#xff09; CSRF&#xff08;Cross-site request forgery跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&…

压缩包破解

压缩包破解 文章目录 压缩包破解伪加密压缩包格式压缩源文件数据区压缩源文件目录区压缩源文件目录结束标志真加密字节对比伪加密字节对比伪加密 工具 ZipCenOp.jarjoin 破解fcrackzip 或者 ziperello 暴力破解伪加密 压缩包格式 一个 ZIP 文件由三个部分组成: 压缩源文

android apk解包和打包

最近项目开发&#xff0c;我的jar包和资源文件给别的同事打包&#xff0c;这样我自己测试很麻烦&#xff0c;每次改一点东西都要找人打包测试&#xff0c;很麻烦&#xff0c;就想着能够解包&#xff0c;更新一下自己的部分代码&#xff0c;再打包apk直接测试。后来找了一些网上…

python基础语法之拆包(解包)

理解和使用python中的拆包会让我们的代码变得流畅&#xff0c;不仅对自己的手关节有好处&#xff0c;也使看官觉得很赏心悦目&#xff0c;既然拆包这么香那就抓紧用起来吧。 1、直接交换变量的本质 在C&#xff0c;C和Java语言中如果想交换两个变量的值就必须用到第三个临时变…

Python中的解包

一、解包&#xff0c;英文名字叫UNPACKING,就是讲容器中所有的元素逐个取出来。 python中解包是自动完成的&#xff0c;例如&#xff1a; a,b,c [1,2,3] print(a,b,c) 1 2 3 除列表对象可以解包外PYTHON中的任何可迭代对象都可以进行解包&#xff0c;元组&#xff0c;字典&…

【Python小知识】:什么是序列解包

前言&#xff1a; &#x1f482;作者简介&#xff1a;大家好&#xff0c;我是翼同学&#xff01; &#x1f4c3;个人主页&#xff1a;翼同学的CSDN博客 &#x1f525;系列专栏&#xff1a;【python学习笔记】 &#x1f44f;备注&#xff1a;如果文章有误&#xff0c;请指正&…

python 抓包与解包

我使用的环境为&#xff1a;Windows10、python3.6、scapy 2.4.0 一、基本知识 Sniff方法定义&#xff1a;sniff(filter"",iface"any", prnfunction, countN)filter的规则使用 Berkeley Packet Filter (BPF)语法 iface用来指定要在哪个网络接口上进行抓包&…

.pkg文件解包

PePKG下载 1、拖入 RePKG.exe文件到cmd中 2、输入 extract&#xff0c;并将需要解包的 .pkg文件拖入cmd中 3、输入 -o 4、选择输出路径 创建一个文件拖入cmd中 回车即可完成解包

文件打包解包的方法

文件打包 前言 在很多情况下&#xff0c;软件需要隐藏一些图片&#xff0c;防止用户对其更改&#xff0c;替换。例如腾讯QQ里面的资源图片&#xff0c;哪怕你用Everything去搜索也搜索不到&#xff0c;那是因为腾讯QQ对这些资源图片进行了打包&#xff0c;当软件运行的时候解…

python中拆包解包用法详解

python可以对元组和字典进行拆包或解包操作。 1、拆包&#xff1a;元组 示例代码1&#xff1a; def return_num():return 100, 200num1, num2 return_num() print(num1) # 100 print(num2) # 200运行结果&#xff1a; 示例代码2&#xff1a; def return_num1():return 1…

android-apk解包打包

title: android-apk解包打包 categories: Android tags: [android, 加壳] date: 2022-09-28 10:29:51 comments: false mathjax: true toc: true android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行 前篇 android apk解包和打包 - https://blog.csdn.net/u0114…

Vue 3 之什么是 解包

Vue 3 之什么是 解包 前言结合代码分析总结 前言 从 Vue2 升到 Vue3 之后,用法上有了很大很大的变化 Vue3可以通过 ref 来声明一些响应式数据,可以是 any 类型的响应式数据 ,在 script 标签中访问和修改这个属性需要用 变量名.value Vue3 3.1 在 template 模板中使用定义的数…

python的解包

解包在英文里叫做 Unpacking&#xff0c;就是将容器里面的元素逐个取出来&#xff08;防杠精&#xff1a;此处描述并不严谨&#xff0c;因为容器中的元素并没有发生改变&#xff09;放在其它地方&#xff0c;好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员&#xf…

apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程

修改之前一定要先安装java开发环境&#xff0c;不会装的去自行百度。文章较长&#xff0c;耐心阅读。 一直在做Android应用开发&#xff0c;但对于从自己手中输出的apk包&#xff0c;了解并不是很深。最近想研究一下&#xff0c;消除下自己的一些技术盲点。 好吧&#xff0c;…

Python中的解包用法

Python中的解包用法 解包&#xff08;unpacking&#xff1a;解包&#xff0c;拆包&#xff09;&#xff0c;基本意思将容器里面的元素逐个取出来使用。封包&#xff08;packing&#xff1a;封包&#xff0c;打包&#xff09;基本意思将多个元素合起来作为一个整体使用。 可迭代…

SIP协议说明以及报文字段解析

SIP协议的概念&#xff1a; SIP 协议&#xff0c;即 会话初始协议&#xff08;Session Initiation Protocol&#xff09;&#xff0c;是一个应用层的 点对点协议&#xff0c;用于初始、管理和终止网络中的语音和视频会话&#xff0c;是 GB28181 的核心之一。 SIP是一个基于文本…

SIP 协议格式简介

消息体结构&#xff0c;由三部分组成&#xff1a; Request-Line / Status-Line (请求行 / 状态行)Header (消息头)Body (正文) 示例&#xff1a; Request-Line / Status-Line 介绍 Request-Line 格式&#xff1a; MethodRequest-URISIP-VersionCRLFINVITEsip:10011.1.1.1:5060…