问题 Rails默认的CSRF保护是不安全的吗?


默认情况下,Rails中的表单后期CSRF保护会为用户创建一个仅在用户会话更改时更改的真实性令牌。我们的一位客户对我们的网站进行了安全审核,并将其标记为问题。

审计员的声明是,如果我们还有一个XSS漏洞,攻击者可以抓取另一个用户的真实性令牌并利用它进行CSRF攻击,直到用户会话到期为止。

但在我看来,如果我们有一个像这样的XSS漏洞,攻击者可以轻松地抓住另一个用户的会话cookie并直接登录该用户。或者甚至只是在用户受到攻击时从脚本调用我们的REST Api。在这种情况下,能够进行CSRF攻击似乎并不会更糟......问题在于XSS漏洞。

我错过了什么吗? Rails中的默认CSRF保护是否存在实际问题?


2647
2018-03-31 22:30


起源

请注意,在Rails 3.0.3版及更低版本中发现了CSRF for Rails中的漏洞。看到 weblog.rubyonrails.org/2011/2/8/...。升级到3.0.4以确保解决此问题。 - Matthew O'Riordan
作为旁注,会话cookie应设置为 HttpOnly 所以他们不能被XSS偷走。 - George Powell


答案:


你是完全正确的。基于令牌的CSRF保护是最常见的,只要您测试XSS应用程序就应该没问题。

有些情况下,无论XSS如何,CSRF仍然可以停止。例如,对于您的密码更改论坛,要求他们知道当前的密码。黑客将无法伪造此请求,除非他知道当前的密码,这是一个有争议的问题。

另一种方法是要求Captcha为该请求求解。我建议使用reCapthca。


11
2018-03-31 22:42



从技术上讲,如果您的表单需要用户输入的密码以及其他数据,那么您无法保护CSRF或XSS,但会话被盗。 CSRF攻击是关于能够使用当前浏览器会话的凭据在另一个站点上执行命令。 - Mikko Rantalainen
请注意,如果您有XSS漏洞和需要用户输入非OTP密码的表单,则攻击者只能获得用户密码! - Mikko Rantalainen
@Mikko Rantalainen将是网络钓鱼,而不是CSRF。您可以使用xss将页面正文重写为接受密码的论坛。但是如果在某个其他页面上有要求输入密码的表单,则XSS不能用于读取该密码,因为它无法通过XHR读取。 - rook
你是对的,需要用户密码的页面上的XSS漏洞才能获得没有网络钓鱼的密码。此外,如果您在网站的每个页面上都嵌入了登录表单(通常如今),任何XSS漏洞都可能导致公开的用户密码(使用XSS以静默方式使用XHR在其他地方提交被盗登录名/密码)。 - Mikko Rantalainen
@Mikko Rantalainen重写了onsubmit处理程序,将用户名/密码传输给攻击者的服务器。 - rook