前言:好久没更新了,最近面试过程中,面试官问到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的方法,并没有在所有的浏览器支持,但越来越多的浏览器开始使用它。