CSRF(跨站请求伪造)

article/2025/9/23 3:48:01

目录

CSRF

原理及过程

概述

关键点

pikachu靶场之CSRF

GET型

POST型

Token

防御

如何挖掘CSRF漏洞

使用burp验证csrf

总结


CSRF

(Cross-Site Request Forgery) CSRF是一种欺骗受害者提交恶意请求的攻击,攻击者盗用你的身份,向服务器发送请求

原理及过程

  1. 小明用浏览器访问受信任网站A,输入用户名及密码进行登录;
  2. 小明的用户信息验证通过后,网站A会返回一个cookie信息给浏览器。
  3. 小明没有退出浏览器前,用同一浏览器访问了假网站B
  4. B站收到请求后返回攻击性代码,要求访问站A
  5. 浏览器携带用户的cookie信息,向网站A发出请求,此时网站A并不知道是请求其实是恶意网站B发出的,所以会根据小明的cookie信息以小明的身份进行处理,导致来自b站的恶意代码被执行

概述

跨站请求伪造(Cross-site request forgery,CSRF)是一种攻击,它强制终端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作。CSRF攻击的着重点在伪造更改状态的请求,而不是盗取数据,因为攻击者无法查看对伪造请求的响应。

关键点

  • CSRF是一种欺骗受害者提交恶意请求的攻击。
  • 它继承了受害者的身份和特权,代表受害者执行非本意、恶意的操作。
  • 对于大多数站点,浏览器请求自动发送与站点关联的所有凭据,例如用户的会话cookie,IP地址,Windows域凭据等。
  • 因此,如果用户当前已对该站点进行了身份验证,则该站点将无法区分受害者发送的伪造请求和受害者发送的合法请求。

pikachu靶场之CSRF

GET型

如下我们进行登录

点击修改个人信息,然后点击提交抓取数据包,观察数据包可知,该身份认证信息只有个cookie,且修改数据的请求参数都通过get进行发送。而这一动作是很容易进行伪造的

我们可以直接构造如下html,将其放在hacker的服务器(172.16.10.103)上。

<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><script>history.pushState('', '', '/')</script><form action="http://192.168.110.128/2_Shotting_Range/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php"><input type="hidden" name="sex" value="boy" /><input type="hidden" name="phonenum" value="18626545453" /><input type="hidden" name="add" value="chain" /><input type="hidden" name="email" value="vince&#64;pikachu&#46;com" /><input type="hidden" name="submit" value="submit" /><input type="submit" value="Submit request" /></form></body>
</html>

受害者在没有退出浏览器的情况下,点击了hacker的网站构造的链接并请求目标站点

因为用户在目标站点已经通过了身份验证,在用户没退出的情况下,只要用户继续请求该站点就会自动携带用户的cookie信息,只要有这cookie信息,就代表我是那个身份。所以当用户点击hacker构造的链接,该链接也是请求目标服务器,由于是用户自己点击的,这一操作也是在用户的浏览器完成的,所以也会自动携带用户的信息,所以服务器以为这个请求是来自于用户。携不携带cookie和请求来自哪个服务器没有关系。但是我们也可以看到referer指向hacker的服务器。

如下,信息成功被修改

当用户退出,或者在别的浏览器访问hacker构造的链接上,则不会携带cookie信息,也就无法更该信息。

所以说CSRF,它是一种欺骗用户在当前对其进行身份验证后的Web应用程序上 执行非本意的操作。

POST型

同样我们点击submit抓取数据包,所有参数在请求体中提交,我们不能通过伪造URL的方式进行攻击。

于是,这里通过构造表单的方式进行攻击。在另一个服务器上新建post.html,内容如下

<html>
<head>
<script>
window.onload = function() {document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.1.2/2_Shotting_Range/pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php"><input id="sex" type="text" name="sex" value="谢辰辰" /><input id="phonenum" type="text" name="phonenum" value="12345678922" /><input id="add" type="text" name="add" value="i am form 江西省吉安市" /><input id="email" type="text" name="email" value="lucy@pikachu.com" /><input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

如果用户点击这个链接post.html。即可攻击成功。

Token

SRF的主要问题是敏感操作容易被伪造,我们可以加入Token让请求不容易被伪造。每次请求,都增加一个随机码(随机生成,不容易被伪造),后台每次对这个随机码进行验证, 我们进入Pikachu平台的CSRF(token)页面并登录,我们可以看一下这个GET请求

防御

1)验证 HTTP Referer 字段 

简单理解:Refer记录了HTTP请求的来源地址,CSRF攻击,攻击者在他自己的网站构造请求,Refer值指向他自己的网站,服务器验证Refer值

如上面的实验中,referer中的值是指向的黑客自己搭建的网站。

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限的页面,请求需来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,即为bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。  但这一方法也不是万无一失的。

2)在请求地址中添加 token 并验证(Anti-CSRF token) 

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

这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 ,这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。          

该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

3)在 HTTP 头中自定义属性并验证    

4) 二次验证

二次验证,就是在转账等关键操作之前提供当前用户的密码或者验证码。二次验证可以有效防御CSRF 攻击。

如何挖掘CSRF漏洞

1. 对目标网站增删改的地方多进行注意,并观察其逻辑,判断请求是否可以被伪造。例如修改管理员账号时,不需要验证旧密码,导致请求容易被伪造;对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造

2. 确认凭证的有效期
虽然退出或关闭了浏览器,但cookie仍然有效,或者session并没有过期,导致CSRF攻击变得简单。

使用burp验证csrf

传送门 -》burp验证csrf

总结

CSRF其实就是一种伪造操作请求,欺骗用户执行非本意的一种攻击行为。当用户在一个网站上面通过了身份验证后,对某个敏感数据进行操作,而这一操作又是很容易进行伪造的。如果服务器没有对这一操作的安全性进行校验如未对referer值验证,未添加token进行唯一性验证,就容易导致csrf漏洞的发生                                                                                                                                       


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

相关文章

Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御

CSRF ,Cross-site request forgery,跨站请求伪造。是常见的网络攻击的方式之一,2007年曾被列为互联网20大安全隐患之一。攻击过程是攻击者伪造用户的浏览器请求,访问一个用户曾经访问过的网站, 使目标网站误以为是用户的操作而执行命令。 本篇j基于Spring Boot创建项目,…

每日漏洞 | 跨站请求伪造

01 漏洞描述 HTTP的无状态性&#xff0c;导致Web应用程序必须使用会话机制来识别用户。一旦与Web站点建立连接(访问、登录)&#xff0c;用户通常会分配到一个Cookie&#xff0c;随后的请求&#xff0c;都会带上这个Cookie&#xff0c;这样Web站点就很容易分辨请求来自哪个用户&…

CSRF跨站请求伪造

CSRF介绍&#xff1a; CSRF中文名称&#xff1a;跨站请求伪造&#xff0c;是一种“ 挟持用户”在当前已登陆的Web应用程序上执行“ 非本意操作”的攻击方法。 一、CSRF回放攻击流程 套用老师所给的一张攻击原理图 从这张流程图里我们总结一下CSRF攻击生效所需要的两个必要条件 …

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

目录 1 CSRF概述2 CSRF攻击过程及原理2.1 CSRF场景例子2.2 攻击过程2.3 原理2.4 攻击成功的条件&#xff1a; 3 CSRF攻击方式/如何触发5 CSRF的防御5.1 一些无效的防御手段5.2 有效的防御手段 6 总结参考文章 1 CSRF概述 定义&#xff1a;CSRF&#xff08;Cross-site request …

一文带你学习跨站点请求伪造(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…