csrf

跨站请求伪造 ,也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

简单理解:攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄露和财产损失。

原理

以微博为例子,当你访问新浪微博,你需要输入用户名密码,通过了认证,浏览器会保存认证相关cookie,你后续在新浪微博域名的所有请求都不需要再输入用户名和密码(浏览器会自动带上认证的cookie)。这时,你浏览黄色网站,点击了某个图片触发了黑客脚本,脚本操纵你的浏览器,请求新浪微博的发微博接口(由于你已经登陆过所以此时不需要认证),发表了一些消极言论。于是,你就会被查水表了。

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

例子

假如一家银行用以运行转账操作的URL地址如下:

1
https://bank.example.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那么,一个恶意攻击者可以在另一个网站上放置如下代码:

1
<img src="https://bank.example.com/withdraw?account=Alice&amount=1000&for=Badman" />

如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。


透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作

防御

令牌同步模式

  • 令牌同步模式(Synchronizer token pattern,简称STP)。原理是:服务器端应用将令牌嵌入HTML表格,并发送给客户端(后端渲染html)。客户端提交HTML表单的时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性。这样确保攻击者发送请求时候,由于没有该令牌(无法猜中)而无法通过验证。
1
2
3
<form method="post">
<input type="hidden" name="csrf_token" value="{{.csrfToken}}" />
</form>
  • 注:这种方式,给每一个客户端的表单注入token相当于给客户端的每一个表单做了认证,表明该表单是服务器认证过后的表单,是安全的。这样,跨域伪造的请求发送到服务器,由于没有token(或token无法被服务器验证),服务器认为该请求是非法的,已达到防御的目的。

  • STP能在HTML下运作顺利,但会导致服务端的复杂度升高,复杂度源于令牌的生成和验证。因为令牌是唯一且随机,如果每个表格都使用一个唯一的令牌,那么当页面过多时,服务器由于生产令牌而导致的负担也会增加。而使用session等级的令牌代替的话,服务器的负担将没有那么重。

检查Referer字段

  • HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于bank.example.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于bank.example.com之下,这时候服务器就能识别出恶意的访问。
  • 这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

csrf
http://mybestcheng.site/2021/01/12/http/csrf/
作者
mybestcheng
发布于
2021年1月12日
许可协议