关于密码学:密码学系列之csrf跨站点请求伪造

44次阅读

共计 3652 个字符,预计需要花费 10 分钟才能阅读完成。

简介

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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

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

正文完
 0