一、什么是CSRF攻击
CSRF攻击的全称为跨站脚本伪造,也称为One Click Attack或者Session Eiding,通常缩写为CSRF或者XSRFCSRF通过伪装来自受信任的用户的请求来攻击受信任的网站。与XSS相比,CSRF攻击往往不太流行(因此对其进行防范的资源也是相当紧缺的)和难以防范的,所以被认为比XSS更具危险性。我们可以这么理解CSRF攻击:首先攻击者会先盗用你的身份,然后以你的名义进行某些非法操作,甚至盗走你的账户购买的商品等。CSRF攻击其值是利用web中用户身份认证验证的一个漏洞:简答的身份验证仅仅可以保证请求发自某一个用户的浏览器,却无法保证请求本身是用户资源发出的。
二、CSRF攻击的流程

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攻击,必须达成两个基本条件。

1、登录受信任网站A,并且在本地生成Cookie。
2、在不退出登录网站A的前提下,访问危险网站B.

三、常见的CSRF攻击
1、GET类型的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&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危害没有GET类型的大,利用起来通常使用的是一个自动提交的表单,如
<form action=http://wooyun.org/csrf.php method=POST><input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成一次POSt操作。

四、CSRF测试
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本可以确定存在CSRF漏洞。随着对CSRF漏洞研究的不断深入,不断涌现一些专门针对CSRF漏洞进行检测的工具,比如CSRFTester,CSRF Request Builder等,以CSRF Tester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息(比如说更改Referer字段的信息),重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
五、预防CSRF攻击
5.1、验证HTTP Referer字段
还拿上述的银行转账的例子来说,首先我们向银行站点发出一个请求时,此时HTTP协议头部会携带Referer字段,其中包含着请求该站点的域名,此时如果我们在访问银行站点时并且向银行发出请求,此时携带的Referer就是mybank.com,如果此时我们从存在危险的网站B向银行站点发起请求,此时的Referer就是危险网站B的域名。所以我们可以通过判断Referer来进行判断是否可以执行操作。这样就会很简单的就防止了CSRF,但是任然存在一些问题,比如说我们通过检查Referer来判断域名,这种决策权在浏览器,此时如果一些浏览器对于Referer的值是可改写的,那么CSRF的攻击任然有效。还存在一些用户会禁用Referer字段,此时就会造成无法请求网站数据。
验证Referer方式总计:
优点:使用方便,开发简单,一定程度上能预防CSRF攻击
缺点:这种机制完全依托于浏览器,Referer字段容易被故意篡改,或者被禁用。
5.2、添加token验证
我们可以当用户请求时,在安全站点A中生成一个SessionId,保存在服务器端,该值可以作为token传递给客户端。客户端可以设置一个隐藏的input框,其中的值为该token,当我们进行请求时,就会将该值传入到站点A的服务器,此时在服务器端就可以进行比较生成的token和保存的token是否一样,如果一样的话,就表示是从安全站点上发出的请求,就做出具体的相应。在危险网站B就无法拿到token,所以也就无法进行正确的请求了。如果使用的是post请求,我们可以放入隐藏的input框中,如果要是get请求,则我们可以如下写法。例如https://www.myBank.com?token=XXXXX。那么一个网站中存在很多请求,此时我们如果每一个都设置token,则就会显得非常的笨拙。此时我们可以遍历全部的dom,获取全部的a标签和form标签,进行添加就行了。但是如果页面的DOM是动态生成的,则需要程序员自己编写代码将token放入。还存在一个问题就是:如何才能保证token不被攻击者截获。
添加token方式总结:
安全程度比Referer更高
实现方式上稍微复杂
需要保证token存储的安全性
5.3、在HTTP头中自定义属性并验证
这种方法也是保存token,但是其实和上述不同的是,其在HTTP头部保存token,我们可以一次性给访问该网站的请求都加上该自定义字段,但是如何将数据存放在HTTP中呢?此时我们就需要另一个模块,XHRHTTPRequest,当我们使用该模块时,存在另一个弊端,就是只能是异步请求。其他请求都是无法访问的。另外,对于没有进行 CSRF防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
验证head方式总结:
1、使用方式简单,不容易泄漏
2、使用地方局限

什么是CSRF攻击,如何防范CSRF攻击?相关推荐

  1. 「安全系列之CSRF」如何防范csrf攻击

    背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络劫持 ...

  2. 什么是CSRF,怎么防范CSRF!

    学习web安全就一定不能不知道CSRF,那么什么是CSRF呢?对于CSRF攻击我们应该如何进行防御呢?小编这里就整理了CSRF的介绍.原理以及防御方法来帮助大家认识CSRF. 一.什么是CSRF? C ...

  3. Django CSRF(什么是CSRF?)\Django前后端分离csrf token获取方式

    文章目录 Django CSRF 什么是CSRF? Django CSRF Django CSRF 中间件 Django,Ajax提交csrf_token处理 Django 设置 cookie 中的 ...

  4. 什么是中间人攻击?如何抵御中间人攻击?

    相对于其他攻击方式,中间人攻击是一个特殊的存在,它是一种间接性的入侵攻击,由来已久,而且随着通信技术的不断发展,中间人攻击也越来越多样化.那么到底什么是中间人攻击?如何防范中间人攻击?本文为大家介绍一 ...

  5. 关于防范csrf攻击基于token鉴权

    在web开发中,之前都使用cookie + session方式来实现身份认证鉴权.但是现在前后端分离,以及终端有可能不支持cookie的情况下,一般都采用token方式.现在系统设计思路如下: 服务端 ...

  6. Django中如何防范CSRF跨站点请求伪造攻击

    CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望 ...

  7. csrf攻击与防护—2用flask简单演示防范csrf攻击之referer

    接上篇 csrf攻击与防护-1用flask简单演示csrf攻击 以下是根据referer字段防止csrf攻击的新代码: bank.py import uuid from flask import re ...

  8. CSRF跨站点伪造请求攻击之——CSRF钓鱼添加管理员账号及安全防范

    CSRF钓鱼添加管理员账号及安全防范 目录 CSRF钓鱼添加管理员账号及安全防范 本地网络设备 CSRF 攻击 CSRF 无需浏览器案例 burp 添加管理员账号 小结 CSRF 蠕虫模型 同域内 C ...

  9. 【CSRF】学习关于CSRF攻击和防范

    文章目录 1.CSRF攻击是什么 2.CSRF攻击如何实现 2.1 使用GET请求的CSRF的攻击例子 2.2 使用post请求的CSRF攻击 3.如何防御CSRF攻击 3.1 什么是CSRF令牌 3 ...

最新文章

  1. IPM: Mass IP generation can only support 99 numbers of IP at maximum
  2. mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...
  3. python操作excel_使用Python操作Excel时必学的3个库
  4. 4 Convex optimization problems
  5. 化工原理物性参数_化工原理知识点总结整理
  6. pytorch 一些关于模型参数冻结的问题
  7. ubuntu物理机上搭建Kubernetes集群 -- 准备
  8. 简单计算器 -python
  9. 110 redis的哨兵集群 redis-cluster docker安装
  10. 程序员应当注意的肢体语言
  11. CTF web题常用解题工具
  12. 洛谷P3369 AVL树
  13. Symbol Factory Universal v3.X 工业图形库
  14. 深入理解 OpenStack Neutron:VXLAN
  15. [激光原理与应用-43]:《光电检测技术-10》- 激光测距原理、方案与案例分析:TOF VL53L0X模块
  16. Android的数据存储之一------SharedPreferences
  17. NLTK(3)处理文本、分词、词干提取与词形还原
  18. Matlab p文件解密,pcode解密 MATLAB .p 转换为.m文件
  19. mysql 字段名 列名 排序
  20. java encodeuri_encodeURI()和encodeURIComponent()方法

热门文章

  1. 安装vmware虚拟机fedora
  2. 制作html如何换行,css如何强制换行?
  3. 15种下载文件的方法
  4. mysql创建表时打错了怎么修改_MySQL 创建,修改和删除表
  5. Linux基本命令笔记
  6. 数据仓库金融行业逻辑数据模型FS-LDM
  7. JAVA高级特性(六)——IO流(第一讲)
  8. 记一次放内存切图|BytesIO|PIL库
  9. unity webgl加载全屏设置
  10. 明天又上班了,真好~