CSRF漏洞原理攻击与防御

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

与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被 认为比XSS更具危险性。

csrf漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要 是访问这个都网站,会默认你已经登录的状态。而在这个期间,攻击者发送了构造好的csrf脚本或包含 csrf脚本的链接,可能会执行一些用户不想做的功能(比如是添加账号等)。

CSRF可以做什么?

你这可以这么理解CSRF攻击:

攻击者盗用了你的身份,以你的名义发送恶意请求。

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......

造成的问题包括:个人隐私泄露以及财产安全。

想要深入理解CSRF的攻击特性我们有必要了解一下网站Session的工作原理。

Session大家都不陌生,无论是用.net还是PHP开发过网站的程序员都肯定用过Session对象,然而 Session它是如何工作的呢?如果我们把浏览器的Cookie禁用了,大家认为Session还能正常工作吗? 答案是否定的。

在这里举个简单的例子帮助大家理解Session。比如我买了一张高尔夫俱乐部的会员卡,俱乐部给了我一 张带有卡号的会员卡。我能享受哪些权利呢?如果我是高级会员卡可以打19洞和后付费喝饮料,而初级 会员卡只能在练习场挥杆。我的个人资料都是保存在高尔夫俱乐部的数据库里,我每次去高尔夫俱乐部 只需要出示这张高级会员卡,俱乐部就知道我是谁了,并且为我服务了。 因此我们的高级会员卡卡号 相当于保存在Cookie的Sessionid;而我的高级会员卡权利和个人信息就相当于服务端的Session对象。

我们知道Http是无状态的协议,它不要求浏览器在每次请求中标明客户端自己的身份,并且浏览器以及 服务器之间并没有保持一个持久性的连接用于多个页面之间的访问。为了维持web应用程序状态的问 题,每次Http请求都会将本域下的所有Cookie作为Http请求头的一部分发送给服务端,服务器端就可以 根据请求中的Cookie所存放的Sessionid去Session对象中找到该会员资料了。

我们理解了Session的工作机制后,CSRF也就很容易理解了。CSRF攻击就相当于攻击用户复制了我的高 级会员卡,然后攻击用户就可以拿着这张假冒的高级会员卡去高尔夫俱乐部打19洞,享受美味的饮料, 而我这个受害者在月底就会收到高尔夫俱乐部的账单。

CSRF原理:

CSRF攻击过程有以下两个重点:

1.目标用户已经登录了网站,能够执行网站的功能

2.目标用户访问了攻击者构造的URL

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 发送的垃圾信息还带有蠕虫链接的话,那些接收到这些有害信息的好友万一打开私信中的链接就也成为 了有害信息的散播着,这样数以万计的用户被窃取了资料种植了木马。整个网站的应用就可能在瞬间崩 溃,用户投诉,用户流失,公司声誉一落千丈甚至面临倒闭。曾经在MSN上,一个美国的19岁的小伙子 Samy利用CSS的background漏洞几小时内让100多万用户成功的感染了他的蠕虫,虽然这个蠕虫并没有 破坏整个应用,只是在每一个用户的签名后面都增加了一句“Samy 是我的偶像”,但是一旦这些漏洞被恶 意用户利用,后果将不堪设想,同样的事情也曾经发生在新浪微博。

相关举例:

受害者Bob 在银行有一笔存款,通过对银行的网站发送请求 “http://bank.example/withdraw?account=bob&amount=1000000&for=bob2”可以使 Bob把1000000 块的存款转到Bob2的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个 合法的Session,并且该Session的用户Bob已经成功登陆。黑客Hacker自己在该银行也有账户,他知道 上文中的URL可以把钱进行转帐操作。 Hacker可以自己发送一个请求给银行: http://bank.example/withdrawaccount=bob&amount=1000000&for=Hacker。 但是这个请求来自Hacker而非 Bob,他不能通过安全认证,因此该请求不会起作用。这时,Hacker想 到使用CSRF的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=“http://bank.example/withdrawaccount=bob&amount=1000000&for=Hacker”,并且通过广告 等诱使 Bob 来访问他的网站。当Bob访问该网站时,上述URL就会从Bob的浏览器发向银行,而这个请 求会附带Bob浏览器中的 Cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求Bob 的认证信息。但是,如果Bob当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的Session尚 未过期,浏览器的Cookie之中含有Bob的认证信息。这时,悲剧发生了,这个URL请求就会得到响应, 钱将从Bob的账号转移到Hacker的账号,而Bob当时毫不知情。等以后Bob发现账户钱少了,即使他去 银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕 迹。而Hacker则可以拿到钱后逍遥法外。

CSRF检测:

检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字 段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。 随着对CSRF漏洞研究的不 断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder 等。以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先 需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应 的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接 受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

CSRF防御:

目前防御 CSRF 攻击主要有三种策略:

  • 验证 HTTP Referer 字段;
  • 在请求地址中添加token并验证;
  • 在HTTP头中自定义属性并验证。

验证Referer

根据 HTTP 协议,在HTTP头中有一个字段叫Referer,它记录了该 HTTP 请求的来源地址。在通常情况 下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问

http://bank.example/withdraw?account=bob&amount=1000000&for= Hacker,

用户必须先登陆bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer值就会是转账按钮所在的页面的URL,通常是以bank.example域名开头的地址。而如果黑客要 对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行 时,该请求的 Referer 是指向黑客自己的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转 账请求验证其Referer值,如果是以bank.example开头的域名,则说明该请求是来自银行网站自己的请 求,是合法的。如果Referer是其他网站的话,则有可能是黑客的CSRF攻击,拒绝该请求。

这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心CSRF的漏洞,只需要在最后 给所有安全敏感的请求统一增加一个拦截器来检查Referer的值就可以。特别是对于当前现有的系统,不 需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。

然而,这种方法并非万无一失。Referer的值是由浏览器提供的,虽然 HTTP协议上有明确的要求,但是 每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安 全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer值。如果 bank.example网站支持 IE6 浏览器,黑客完全可以把用户浏览器的Referer值设为以bank.example域名 开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

<?php
header("Content-type:text/html;charset=utf-8");
// 如果没有token, 怎么保证请求是合法的呢?
// 请求头里面有一个字段: referer, 专门用于记录请求来源
// http://www.s285.com/csrf/referer.php
$referer_conf = "http://www.s285.com/csrf/referer.php";
// 获取请求过来的referer
$request_referer = $_SERVER['HTTP_REFERER'];
// 对referer进行对比
if ($referer_conf != $request_referer){
die("请求不合法!");
}
echo "进来啦!";
// 有些浏览器,是不会自带referer的,还有一些浏览器referer可以修改。
// 就会造成一些问题,referer判断不准确

添加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=tokenv alue。 而对于 POST 请求来说,要在 form 的最后加上这样就把 token 以参数的形式加入请求了。

表单令牌:

<?php
header("Content-type:text/html;charset=utf-8");
// 开启session
session_start();
// 在配置文件里面有一个key
$key = "qwaerfewasfasfadgkljdgslkdfjiadfjads";
// 生成token
$token = md5(rand(1, 100000).$key);
// 存放到session中
$_SESSION['token'] = $token;
?>
<form action="./edit_back.php" method="post">
<label>姓名:</label><input type="text" name="username">
<br><br>
<label>年龄:</label><input type="text" name="userAge">
<br><br>
<label>地址:</label><input type="text" name="userAddress">
<input type="hidden" name="token" value="<?=$token?>">
<br><br>
<input type="submit">
</form>

后台验证:

<?php
header("Content-type:text/html;charset=utf-8");
// 开启session
session_start();
// 获取表单的令牌
$token = $_POST['token'];
// 获取session中的token
$session_token = $_SESSION['token'];
echo $token."~~~".$session_token;
// 判断令牌
if ($token != $session_token){
die('提交的数据有问题!');
}
echo "修改成功!";

自定义属性进行校验jwt: Json web token主要是用于前后端分离的项目。

CSRF核心是借COOKIE,XSS核心是偷COOKIE

怎么防止别人借用COOKIE? 怎么才能不让别人借COOKIE? 所有的和认证信息相关的一些数据,都不存放在COOKIE中, 全部放在请求头Authorization这个字段 中。 这个字段(Authorization)里面存放的就是:用户ID,用户的角色........ JWT: 会对传输的数据进行加密, 如果要解密,需要服务端私钥的。 就算JWT被劫持,被修改, 在服务端校验的时候依然通不过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-工厂模式设计与详解

一、设计模式介绍 设计模式是我们开发中常常需要面对的核心概念&#xff0c;它们是解决特定问题的模板或者说是经验的总结。这些模式被设计出来是为了让软件设计更加清晰、代码更加可维护且能应对未来的变化。良好的设计模式不仅能解决重复代码的问题&#xff0c;还能使团队中…

408数据结构-哈夫曼树 自学知识点整理

前置知识&#xff1a;二叉树的概念、性质与存储结构 哈夫曼树 哈夫曼树的定义 首先需要明确几个概念。 路径&#xff1a;从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度&#xff1a;路径上的分支数目称为路径长度。 权(值)&#xff1a;树中结点…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快&#xff0c;日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式&#xff0c;如电话报修、纸质报修单等方式&#xff0c;不仅效率低下&#xff0c;而且难以追踪维修进度&#xff0c;给我们…

无人机+自组网:空地点对点无人机通信解决方案

随着智能化技术的迅速发展, 无人化设备在战场上发挥的作用日益突显。在近期发生的多次局部战争中, 无人设备代替人类承担了多项危险且复杂的攻击任务, 达到 “兵不血刃” 的效果. 2020 年 1 月 3 日, 美军利用无人机执行了刺杀伊朗 “圣城旅” 指挥官苏莱曼尼行动. 纳戈尔诺 - …

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

海外静态IP购买:全面解析与购买指南

在当今这个信息化、网络化的时代&#xff0c;IP地址成为了网络世界中不可或缺的一部分。随着跨国业务的不断增多&#xff0c;海外静态IP的需求也日益增长。海外静态IP&#xff0c;作为一种稳定、可靠的网络资源&#xff0c;为企业在全球范围内的业务拓展提供了强有力的支持。本…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

aws s3

列出关键点 创建s3 设置s3策略&#xff0c;所有人访问 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", …

Spring Boot | Spring Boot 消息管理 ( 消息中间件 ) 、RabbitMQ“消息中间件“

目录: 一、"消息服务" 概述 :1.1 为什么要使用 "消息服务" ( 消息中间件 ) &#xff1f;① 异步处理② 应用解耦③ 流量削峰④ 分布式事务管理 1.2 常用 "消息中间件" 介绍 :ActiveMQ ( 广泛应用于中小型企业 )RabbitMQ ( 没有特别要求的场景下…

Unity导出的webgl包在浏览器下报错:Unable to parse Build/导出的项目名称.framework.js.gz

先根据链接Unity WebGL项目打包后本地打开报错问题解决方法_unity 打包webgl报错:webassembly.instantiate()-CSDN博客文档操作一番后,在360极速里面兼容模式——黑屏如图: 极速模式:进度条走不满,在谷歌浏览器里面的红色报错文字不出现。 然后打开谷歌浏览器,报如下错:…

2024年可以做的网上兼职有哪些?10个正规赚钱软件平台分享

在数字化浪潮席卷全球的今天&#xff0c;兼职工作早已不再局限于传统的线下模式。只要有一部手机或电脑&#xff0c;你就能轻松开启兼职之旅&#xff0c;实现躺着也能赚钱的梦想&#xff01; 接下来&#xff0c;就让我们一起看看2024年那些靠谱又有趣的网上兼职项目吧&#xff…

[猫头虎分享21天微信小程序基础入门教程]第8天:发布与审核流程

第8天&#xff1a;发布与审核流程 &#x1f680; 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们将继续微信小程序的学习&#xff0c;重点了解如何将开发完成的小程序提交审核并发布上线。这是小程序从开发到用户使用的关键步骤。&#x1f…

国标GB28181协议EasyGBS视频监控云平台端口正常却不能播放,是什么原因?

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

【Linux学习笔记】一篇文章彻底搞定“Linux生产者与消费者“!

本章重点 1.生产者消费者模型2.posix信号量&#xff0c;以及读写锁。3. 理解基于读写锁的读者写者问题。 一. 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0…

算力网络简介

一、什么是算力网络 在计算能力发展的基础上&#xff0c;通过网络手段&#xff0c;将计算、存储、存储等基础资源&#xff0c;在云、边、端之间进行有效调配的方式&#xff0c;以此提升业务服务质量和用户的服务体验。 移动、联通、电信这类网络运营商作为网络的拥有者&#…

基于微信小程序+JAVA Springboot 实现的【网上商城小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的网上商城 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信开发者工具&#xff0c;微信小程序框架 项目展示 5.1 管理员服务…

react18【系列实用教程】moxb —— 集中状态管理 (2024最新版)

官方文档 https://www.mobxjs.com/ moxb 和 redux 都能用于 react 的状态管理&#xff0c;但 moxb 更简单&#xff0c;适合规模不大的应用 &#xff08;规模大的应用若合理组织代码结构&#xff0c;也能用 moxb&#xff09; 安装 moxb npm i mobx npm i mobx-react-lite此处安…

Kubernetes的Pod控制器深度解析

1.1 Pod控制器介绍 在Kubernetes中&#xff0c;Pod是最小的管理单元&#xff0c;用于运行容器。根据Pod的创建方式&#xff0c;可以将其分为两类&#xff1a; 自主式Pod&#xff08;Stateless Pods&#xff09;&#xff1a;这些Pod是直接由用户或管理员创建的&#xff0c;通常…

【058】基于SpringBoot+Vue校园失物招领系统的设计与实现

系统介绍 基于SpringBootVue校园失物招领系统主要通过使用Java语言编码设计系统功能&#xff0c;MySQL数据库管理数据&#xff0c;AJAX技术设计简洁的、友好的网址页面&#xff0c;然后在IDEA开发平台中&#xff0c;编写相关的Java代码文件&#xff0c;接着通过连接语言完成与…

【中级软件设计师】上午题16-算法(应试考试简略版)

上午题16-算法 1 回溯法1.1 n皇后问题 2 分治法3 动态规划3.1 0-1背包问题3.2 最长公共子序列3.3 矩阵连乘 4 贪心算法5 分支限界法总结 1 回溯法 深度优先方法搜索 1.1 n皇后问题 2 分治法 一般来说&#xff0c;分治算法在每一层递归上都有3个步骤 &#xff08;1&#xff…