了解 CSRF

Posted

技术标签:

【中文标题】了解 CSRF【英文标题】:Understanding CSRF 【发布时间】:2011-02-04 14:33:17 【问题描述】:

我不明白使用“挑战令牌”如何增加任何形式的预防:应该将什么价值与什么进行比较?

来自OWASP:

一般来说,开发者只需要 为 当前会话。初始后 此令牌的生成,其值为 存储在会话中并被使用 对于每个后续请求,直到 会话到期。

如果我正确理解了这个过程,就会发生这种情况。

我在http://example.com 登录并创建了一个包含此随机令牌的会话/cookie。然后,每个表单都包含一个隐藏的输入,其中还包含来自会话的随机值,该值在表单提交时与会话/cookie 进行比较。

但是这样做有什么作用呢?您不只是获取会话数据,将其放入页面,然后将其与完全相同的会话数据进行比较吗?似乎是循环推理。这些文章一直在谈论遵循“同源策略”,但这是没有意义的,因为所有 CSRF 攻击都与用户同源,只是诱使用户执行他/她不打算的操作。

除了将令牌作为查询字符串附加到每个 URL 之外,还有其他选择吗?看起来非常丑陋和不切实际,并且使用户更难添加书签。

【问题讨论】:

【参考方案1】:

攻击者无法获得令牌。因此请求不会生效。

我推荐 Gnucitizen 的这篇文章。它有一个相当不错的 CSRF 解释:http://www.gnucitizen.org/blog/csrf-demystified/

【讨论】:

现在我们有了新的防御方法“SameSite” Cookie 属性,但并非所有浏览器都支持caniuse.com/#feat=same-site-cookie-attribute。此外,所有可能的保护方法都可以在这里找到web-security.guru/en/attacks/csrf/prevention【参考方案2】:

您需要继续为自己研究这个主题,但我想这就是您发布到 SO 的原因 :)。 CSRF 是一种非常严重且普遍存在的漏洞类型,所有 Web 应用程序开发人员都应该注意。

首先,same origin policy 不止一个。但最重要的部分是http://whatever.com 托管的脚本无法从http://victom.com 读取数据,但它可以通过 POST 和 GET 发送数据。如果请求仅包含攻击者已知的信息,则攻击者可以在受害者的浏览器上伪造请求并将其发送到任何地方。这里有 3 个XSRF exploits 正在构建不包含随机令牌的请求。

如果站点包含随机令牌,那么您必须使用 XSS 绕过同源策略提供的保护。使用 XSS,您可以强制 javascript 从另一个域“起源”,然后它可以使用 XmlHttpRequest 读取令牌并伪造请求。这是我写的exploit,就是这样做的。

【讨论】:

【参考方案3】:

除了 将令牌附加到每个 URL 作为查询字符串?看起来很丑 并且不切实际,并且使书签 对用户来说更难。

没有理由将令牌附加到您网站上的每个 URL,只要您确保您网站上的所有 GET 请求都是只读的。如果您使用 GET 请求修改服务器上的数据,则必须使用 CSRF 令牌保护它。

CSRF 的有趣之处在于,虽然攻击者可以向您的站点发出任何 http 请求,但他无法读回响应。

如果您有没有随机令牌的 GET url,攻击者将能够发出请求,但他将无法读回响应。如果该 url 改变了服务器上的某些状态,攻击者的工作就完成了。但是如果只是生成一些 html,攻击者一无所获,你一无所获。

【讨论】:

【参考方案4】:

CSRF 类比解释 - 示例:

想象一下,您正在使用一把钥匙——您的钥匙打开您的前门。没有人有你的钥匙。你打开门——但在你进去之前,你的邻居从马路对面叫你过来,你们俩就天气或特朗普总统最近凌晨 3.45 的推文等进行了非常友好的交谈。你,别人在外面看到你,决定冒充你,穿着和你一样的衣服和发型,决定假装自己进入自己的房子!

您家中没有人注意到任何不同 - 您的妻子会说,“哦,杂种*,他在家”。

冒名顶替者帮自己赚了你所有的钱,也许在出去的时候玩一些 Xbox,没有人比这更聪明。

CSRF 基本上依赖于这样一个事实,即你打开了你家的门,然后让它敞开着,让其他人简单地走进来假装是你。

解决这个问题的方法是什么?

当你第一次打开你家的门时,你的门卫会给你一张纸,上面写着一个很长且非常随机的数字:

“ASDFLJWERLI2343234”

现在,如果你想进入自己的房子,你必须把那张纸交给门卫才能进去。

所以现在当模仿者试图进入你的房子时,门卫问:

“纸上写的随机数是多少?”

如果冒充者没有正确的数字,那么他将无法进入。要么这样,要么他必须正确猜测随机数 - 这是一项非常困难的任务。更糟糕的是,随机数的有效期仅为 20 分钟(例如)。所以要知道冒充者必须猜对,不仅如此,他只有 20 分钟才能得到正确答案。这也太费劲了!所以他放弃了。

当然,这个比喻有点牵强,但我希望它对你有所帮助。

**crud =(创建、读取、更新删除)

【讨论】:

以上是关于了解 CSRF的主要内容,如果未能解决你的问题,请参考以下文章

了解CSRF漏洞

了解 CSRF

了解一下前端安全知识:XSS和CSRF

csrf_token的了解

csrf_token的了解

你了解可怕的CSRF攻击吗?