简介

CSRF的全称是Cross-site request forgery跨站点请求伪造,也称为一键攻击或会话劫持,它是对网站的一种恶意利用,主要利用的是已授权用户对于站点的信任,无辜的最终用户被攻击者诱骗提交了他们不希望的Web请求。 恶意网站可以通过多种方式来发送此类命令。 例如,特制的图像标签,隐藏的表单和JavaScript XMLHttpRequests都可以在用户不交互甚至不知情的情况下工作。

如果发生了CSRF攻击,可能导致客户端或服务器数据意外泄漏,会话状态更改或者修改用户的信息。

CSRF的特点

在CSRF的恶意攻击中,攻击者的目标是让被攻击者在不知不觉中向有权限访问的网站提交恶意的web请求。通过对该请求进行精心的设计,使其包含URL参数,Cookie和其他对处理该请求的Web服务器而言正常显示的数据。通过保存在用户Web浏览器中的cookie进行身份验证的用户可能会在不知不觉中将HTTP请求发送到信任该用户的站点,从而导致不必要的操作。

为什么会有这样的攻击呢?因为对于web浏览器来说,它们将在发送给该域的任何Web请求中自动且无形地包含给定域使用的任何cookie。 CSRF攻击利用了此属性,因为浏览器发出的任何Web请求都将自动包含受害者登录网站时创建的任何cookie(包括会话cookie和其他cookie)。如果用户被诱骗通过浏览器无意中提交了请求,这些自动包含的cookie将使伪造也能够通过目标服务器的认证,从而产生恶意攻击。

为了生成这样的攻击URL,恶意攻击者需要构造一个可以被执行的web请求,比如在目标页面上更改帐户密码。攻击者可以将该链接嵌入攻击者控制范围内的页面上。比如它可以嵌入到发送给受害者的电子邮件中的html图像标签中,当受害者打开其电子邮件时,该图像会自动加载。一旦受害者单击了链接,他们的浏览器将自动包含该网站使用的所有cookie,并将请求提交到Web服务器。 Web服务器将会执行该恶意请求。

CSRF的历史

早在2001年,就有人开始使用它来进行攻击了。不过因为攻击使用的是用户自己的IP地址,看起来就像是用户自己的一个正常的请求,所以很少有直接的攻击证据。目前知道的比较有名的CSRF攻击如下:

2006年Netflix爆出了众多CSRF漏洞,攻击者可以更改受害者的账户收货地址,从而为攻击者自己来购买商品。

YouTube在2008年也受到了CSRF的攻击,这使得任何攻击者都几乎可以执行任何用户的所有操作。

McAfee Secure也曾经受到过CSRF的攻击,它允许攻击者更改公司系统。

2018年,一些路由器也受到了CSRF的攻击,从而能够修改路由器的DNS设置。

CSRF攻击的限制

要想达成CSRF攻击是需要一定的条件的,事实上CSRF攻击也并不是一个很简单的事情,必须满足下面的条件:

  1. 目标web服务没有检查请求的referrer header,如果只允许同源请求的话,则无法使用CSRF。
  2. 攻击者必须在目标站点上找到表单提交文件,或者发现具有攻击属性的URL,该URL会执行某些操作(例如,转账或更改受害者的电子邮件地址或密码)。
  3. 攻击者必须为所有表单或URL输入确定正确的值;如果要求它们中的任何一个是攻击者无法猜到的秘密身份验证值或ID,则攻击很可能会失败(除非攻击者在他们的猜测中非常幸运)。
  4. 当受害者登录到目标站点时,攻击者必须诱使受害者进入带有恶意代码的网页。
  5. 攻击者只能发出请求,但是无法看到目标站点响应攻击请求发回给用户的内容,如果操作具有连续性的话,后续的CSRF攻击将无法完成。

CSRF攻击的防范

因为web浏览器对不同的HTTP请求处理方式是不同的,所以针对CSRF攻击的防范跟HTTP请求的方法相关。

在HTTP GET中,使用CSRF攻击非常简单,比如将攻击URL带入IMG标签就会自动加载。但是,根据HTTP规范,GET方法不应该被用于修改数据。使用GET进行更新数据操作的应用程序应切换到HTTP POST或使用反CSRF保护。

CSRF的HTTP POST漏洞取决于使用情况:

在最简单的POST形式中,数据编码为查询字符串(field1 = value1&field2 = value2),可以使用简单的HTML形式轻松实现CSRF攻击,这就意味着必须采取反CSRF措施。

如果以其他任何格式(JSON,XML)发送数据,标准方法是使用XMLHttpRequest发出POST请求,并通过同源策略(SOP)和跨域资源共享(CORS)防止CSRF攻击。

其他HTTP方法(PUT,DELETE等)只能使用具有同源策略(SOP)和跨域资源共享(CORS)来防止CSRF的XMLHttpRequest请求;但是,在使用Access-Control-Allow-Origin:*标头明确禁用它们的网站上,这些措施将无效。

下面我们来具体讲解几个防范CSRF的技巧

STP技术

STP的全称是Synchronizer token pattern。也就是说在所有的HTML表单上包含一个隐藏的token字段,token是可以由很多种方法来生成,只要保证其随机性就行了。因为攻击者无法预测到这个token的值,所以无法进行CSRF攻击。比如下面的代码:

<input type="hidden" name="csrfmiddlewaretoken" value="KbyUmhTLMpYj7CD2di7JKP1P3qmLlkPt" />

STP是兼容性最好的,因为它仅依赖HTML,但是每个请求都带上token会增加程序的复杂性, 由于token是唯一且不可预测的,因此还会强制执行适当的事件顺序,这会引发一些可用性的问题(例如用户打开多个选项卡)。 可以通过使用每个会话CSRF令牌而不是每个请求CSRF令牌来放宽它。

Cookie-to-header token

如果web应用程序主要使用javascript来进行交互的话,可以考虑使用这种方式。

在初次访问web服务的时候,会在cookie中设置一个随机令牌,该cookie无法在跨域请求中访问:

Set-Cookie: csrf_token=i8XNjC4b8KVok4uw5RftR38Wgp2BFwql; Expires=Thu, 23-Jul-2015 10:25:33 GMT; Max-Age=31449600; Path=/; Domain=.wikipedia.org; SameSite=Lax; Secure

在客户端运行javascript的时候,从cookie中读取这个token值,并将其复制到随每个事务请求发送的自定义HTTP标头中

X-Csrftoken:i8XNjC4b8KVok4uw5RftR38Wgp2BFwql

服务器验证令牌的存在和完整性。因为从恶意文件或电子邮件运行的JavaScript无法成功读取cookie值以复制到自定义标头中。即使将csrf token cookie与恶意请求一起自动发送,服务器任然需要有效的X-Csrf-Token头。

这项技术已经被很多框架实现了,比如Django 和AngularJS,因为令牌在整个用户会话中保持不变,所以它可以与AJAX应用程序很好地协同工作。

注意,使用这项技术,必须确保同源政策。

Double Submit Cookie

这个方法与cookie-to-header方法类似,但不涉及JavaScript,站点可以将CSRF令牌设置为cookie,也可以将其作为每个HTML表单中的隐藏字段插入。 提交表单后,站点可以检查cookie令牌是否与表单令牌匹配。 同源策略可防止攻击者在目标域上读取或设置Cookie,因此他们无法以其精心设计的形式放置有效令牌。

与同步器模式相比,此技术的优势在于不需要将令牌存储在服务器上。

SameSite cookie attribute

当服务器设置cookie时,可以包含一个附加的“ SameSite”属性,指示浏览器是否将cookie附加到跨站点请求。 如果将此属性设置为“strict”,则cookie仅在相同来源的请求中发送,从而使CSRF无效。 但是,这需要浏览器识别并正确实现属性,并且还要求cookie具有“Secure”标志。

Client-side safeguards

浏览器本身可以通过为跨站点请求提供默认拒绝策略,来阻止CSRF。比如Mozilla Firefox的RequestPolicy或者Firefox和Google Chrome / Chromium 的uMatrix之类。但是,这可能会严重干扰许多网站的正常运行。

有些浏览器扩展程序如CsFire扩展(也适用于Firefox)可以通过从跨站点请求中删除身份验证信息,从而减少对正常浏览的影响。

本文已收录于 http://www.flydean.com/csrf/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

密码学系列之:csrf跨站点请求伪造的更多相关文章

  1. Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造

    (一)数据分页  可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/ 模板:如果只要显示 1.2.3.4.5.6....的话, ...

  2. CSRF跨站点请求伪造漏洞问题

    最近在写php,项目写完后送检发现一个漏洞问题CSRF,强行拖了我一天的时间,沉迷解决问题,茶饭不思,日渐消瘦,时间比较赶,这篇比较糙,凑合看下. 好了废话不多说下面是今天的解决方案. 博主用的是Th ...

  3. csrf跨站点请求伪造

    什么是csrf(跨站请求伪造) 伪造请求的定义有很多种,我将不是用户本意发出的请求统称为伪造请求(在用户不知情的情况下执行某些操作)xss的通过用户对浏览器的信任造成的,csrf是通过服务器对浏览器的 ...

  4. python---xss(Cross Site Scripting)跨站脚本攻击和csrf(xsrf)跨站点请求伪造(Cross—Site Request Forgery)攻击

    xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而 ...

  5. 跨站点请求伪造(CSRF)学习

    一.CSRF介绍 伪造一个站点,在站点中伪造一个向其他站点的请求,在用户访问该站点时让用户执行 假设有如下URL能删除一篇文章: 攻击者在自己的域中构造一个页面: 内容为: 使用一个img标签,其地址 ...

  6. 跨站点请求伪造(CSRF)

    一.前言 跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动 ...

  7. [不常用] - CSRF(跨站点请求伪造)

    CSRF,Cross Site Request Forgery,即跨站点请求伪造.   这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作. 比如:如果删除用户操 ...

  8. Appscan漏洞之跨站点请求伪造(CSRF)

    公司前段时间使用了Fortify扫描项目代码,在修复完这些Fortify漏洞后,最近又启用了Appscan对项目代码进行漏洞扫描,同样也是安排了本人对这些漏洞进行修复.现在,针对修复过的Appscan ...

  9. 跨站点请求伪造 - SpringBoot配置CSRF过滤器

    1. 跨站点请求伪造   风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务.   原因:应用程序使用的认证方法不充分. ...

随机推荐

  1. JxBrowser: 6.6.1 Crack

    JxBrowser: 6.6.1. 1. RELEASE NOTES Download:HomePage JxBrowser is a cross-platform library that prov ...

  2. Android vs iOS vs Web

    Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...

  3. HTTPS All In One

    HTTPS All In One HTTPS & web security HTTPS Hypertext Transfer Protocol Secure HTTPS is an exten ...

  4. react-parent-child-lifecycle-order

    react-parent-child-lifecycle-order react parent child lifecycle order live demo https://33qrr.csb.ap ...

  5. javascript algorithm visualization

    javascript algorithm visualization javascript算法可视化 https://algorithm-visualizer.org https://github.c ...

  6. calendar merge date

    calendar merge date componentDidMount () { const { monthDays, // monthDates, } = this.props; const d ...

  7. PAUL ADAMS ARCHITECT:澳大利亚楼市保持涨势

    澳大利亚最新房价变化显示,住宅价格指数连续第10周上涨,包括五个主要首府城市的上涨了0.29%. 12月截至24日,布里斯班以1.03%涨幅领跑,五个首府城市平均涨幅0.78%. 在过去3个月里,悉尼 ...

  8. [转]ROS学习笔记十一:ROS中数据的记录与重放

    本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录数据(创建一个bag文件) 首先运行小海龟例程 ...

  9. 关于Python 编码的一点认识

    在计算机中,所有数据的存储.运算以及传输都必须是二进制数字,因为计算机只认识0和1. 当一个人把一份数据传给另一个人时,计算机传递的是其实是二进制数字,但这些数字需要被还原为原始信息. 这个工作当然是 ...

  10. spring boot插件开发实战和原理

    本文转载自spring boot插件开发实战和原理 实战:编写spring boot插件 为什么要编写boot插件 因为我们在开发的时候需要提供一些共同的功能,所以我们编写个共同的jar包.开发人员在 ...