[译]啥是CSRF?

373 阅读4分钟

前言:好久没更新了,最近面试过程中,面试官问到CSRF,没答上来,比较尴尬,这么常见的问题,没回答好。所以就找了一篇CSRF的英文文章,翻译一下,也是做个学习吧。

英文文章网址:Waht is a CSRF?

接下来就开始吧:

跨站请求伪造(CSRF/XSRF),也被称为 sea surf 或 session riding,是一种针对使用Cookie进行校验的Web应用程序的攻击,攻击者能够欺骗受害者去发送一个他没想发送的请求。因此,攻击者就可以滥用,应用程序留在受害者的浏览器中信任(用户信息)。虽然CSRF攻击没有向攻击者提供从服务返回的响应信息,一个厉害的攻击者能造成巨大的损害。特别是配合社交工程陷阱攻击管理员。

CSRF是一种混淆代理攻击,它可以利用受害者的身份验证和授权信息,伪造一个请求,发送到服务器。一个CSRF漏洞可以影响像超级管理员的高权限用户,进而控制整个应用程序。在一次成功的CSRF攻击中,受害者的浏览器被一个恶意网站诱导去做一个有害的动作,即发送攻击者预期的http请求至服务器。正常来讲,像这种攻击包含在web应用提交表单去修改一些数据。

无论是发送合法或非合法的请求,受害者浏览器请求头内会包含Cookie。Cookie常用于存储用户的会话身份信息,所以用户不需要每次发送请求都输入他们的登陆信息,这听起来就是不切实际的。如果受害者会话中的cookie仍然有效(浏览器无需打开窗口或Tab),而且应用存在CSRF漏洞,攻击者可以利用CSRF发送任何恶意请求到服务器,而服务端没办法分辨这些是否是合法请求。

CSRF攻击,能够用在网上银行中,它能强行让受害者去做涉及他们银行账户的操作。CSRF也能让XSS攻击更容易。因此CSRF可以当作一种严重的网络安全问题,即使它目前没有在OWASP组织提出的Top10列表中。OWASP Top 10

在GET请求中的CSRF攻击

    <img src="http://example.com/changePassword.php/?newPassword=attackerPassword">

上面的CSRF攻击是用HTTP GET请求。如果受害者访问一个被攻击者控制附上上面请求的网站,浏览器会发送一个包含cookie的请求到攻击者伪造的url。

在POST请求中的CSRF攻击

Get请求,并不是攻击者能够利用的唯一Http方法。POST请求同样很容易能够达成CSRF请求,当然,攻击者需要使用Javascript去提交一个小小的POST请求。

下面是个简单的例子,CSRF通过iframe标签,去发送POST请求的。这些代码会加载在一个iframe中,而这些加载受害者是无感知的。

Iframe 定义

<iframe src="http://attacker.com/csrfAttack" style="width:0;height:0;border:0;border:none;"></iframe>

Iframe HTML内容

<body onload="document.getElementById('csrf').submit()">
  <form id="csrf" action="http://example.com/changePassword.php" method="POST">
    <input name="newPassword" value="attackerPassword" />
  </form>
</body>

CSRF预防

目前有两种主要方案预防CSRF攻击。使cookie同步带上已经提供给浏览器的Anti-CSRF Token,或者从一开始就阻止浏览器发送cookie到服务器。

Anti-CSRF Tokens

目前,针对CSRF攻击,推荐并且最广泛运用的预防方案是anti-CSRF token,有时,也被称为是同步器令牌,或只是简单的CSRF token。当用户提交需要带cookie的form表单提交或其他需要授权请求,一个随机token应带到请求中,服务器在处理请求前会先校验这个token是否存在并且是否正确,如果缺少token或者token是错的,就会拒绝请求。

十分推荐您使用存在的,测试过的可靠的anti-CSRF库。这取决于您语言以及框架的选择,有许多可以使用的高质量开源库。设计好的anti-CSRF系统特性包含以下属性

1:anti-CSRF token在每个用户会话中是唯一的
2:会话在合适的时间会自动释放
3:anti-CSRF应该是个有效长度的加密随机数
4:anti-CSRF应该是加密安全的,即由强伪随机数生成算法(PRNG)生成。
5:anti-CSRF token能被添加的表单的隐藏字段或者url中。(只有在get请求会导致状态改变,即Get请求是不幂等的)
6:服务器应该拒绝没有通过校验的请求

同一站点Cookie

同一站点cookie是一个新的特性,它可以指示浏览器禁用第三方对特定cookie的使用。同一站点特性是在服务端设置的,在那时设置cookie并且要求浏览器只有在第一方环境的请求中才带cookie。因此,请求必须是在同源下发送的(第三方站点制造的请求中,不包含同一站点cookie)。在不使用同步令牌的情况下,这能有效的消除CSRF攻击。不幸的是,这种预防CSRF的方法,并没有在所有的浏览器支持,但越来越多的浏览器开始使用它。

英文网站:www.acunetix.com/blog/articl…