CSRF攻击与防御

CSRF攻击

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。(摘自百度百科)

CSRF攻击原理

该攻击利用了http无状态的特性,http是无状态协议。下一次请求与之前无关,所以无法知道上一次的请求来源,同时浏览器会把所有属于当前域的cookie携带发送,使得用户访问更方便,比如用户在标签页1打开网站A,登录成功,然后打开标签页2再访问网站A,那么标签页2的网站A会显示用户已登录。这就是浏览器发送了Cookie的原因。

如果我们打开另一个浏览器,发送同样的请求,携带一样的cookie,那么网站依然会认为我是合法的请求。有了这个前提,我们可以设想:

用户登录网站,我们做一个假冒网站,诱导用户访问,网站中超链接指向用户已登录的网站,用户进入我们的假冒网站后点到超链接,那么浏览器也会携带对应域的cookie,同样,服务器会认为当前请求是合法的。

下面我们来模拟这个场景:

用户A登录了某网站,进行提现操作,提现请求发起地址是:

http://www.example.com/withdraw?num=1000&zfb=123@123.com

该请求是用户提现1000到账户123@123.com

我们搭建一个环境来看

这是用户的正常请求,然后我们来做一个假冒网页,诱导用户点击。然后实现提现到我们的账户hacker@hack.com

上面就是我们仿造的网站,点击图片就会访问

http://localhost:58659/api/withdraw/withdraw?num=1000&zfb=hacker@hack.com

下面我们模拟用户点击。

可以看到,诱导用户点击后提现操作仍然成功,因为浏览器发送了localhost:58659的cookie。服务器也认为这是用户自己的请求。这样就把钱提现走了。

当然,上面是一个理想环境下的CSRF攻击,现实不会这么简单,但是原理都一样。

CSRF的防范

  1. Referer请求头

Referer头是标识当前请求的来源。这个多用于图片的防盗链。该方法简单有效,但是弊端明显。因为Referer头是可以手动设置的,就是我们可以伪造Referer然后再进行攻击。

  1. Token验证

Token验证,服务端生成一个Token然后通过Set-Cookie返回给客户端,每次客户端请求都需要携带该token,如果没有,或者有误,均认为该请求可能是csrf攻击,然后拒绝执行,可有效防御CSRF攻击,使用该方法不应偷懒,将Token使用简单算法在客户端生成,防止被破解。

共有 0 条评论

Top