背地里搞你的攻击:CSRF(跨站请求伪造) [网络安全]

今天聊的这个攻击也是大家耳熟能详的,叫做跨站请求伪造,英文名叫Cross-Site Request Forgery。这个攻击虽然大家都听说过,但是却是防不胜防。你即使今天防住了,说不定哪天上一个新功能,就又出现了。 

1、原理 

说这么多,我们还是先来看看这个攻击的原理,知道里原理,自然就知道怎么去防范他。所谓的跨站,自然要有至少两个网站;所谓请求伪造,自然要有另外的用户被利用。所以,这里的角色一共有四个。攻击者 + 被利用的用户 + 网站A + 网站B。 

A、第一步:埋下祸根

 

这里有一个网站A,他提供一个功能就是发贴,而且贴子里面能够带图片链接,或者点击链接。注意:这里一定是发链接,而不是本地上传图片。 

与此同时,网站B有一个提交的接口,但是却没有遵循标准HTTP的Get和Post要求,采用了Get方式来提交。比方说,这个接口叫做:B.com/post?content=xxx 

这时候,攻击者就伪造了一个网站B的提交链接,在网站A上发了个贴子,贴子里的图片(或者链接)的地址,就是网站B的提交链接。 

做完这一步,攻击者就播完种子了,等待鱼儿上钩。

B、第二步:不知不觉就被搞了

 

当普通用户访问A.com的这个贴子的时候,<img>标签就会自动加载网站B的post地址。这个时候,就相当于这个用户在不知情的情况下,就访问了网站B的提交接口。如果是<a>标签,则需要用户手动去点击一下这个链接。 

如果B网站不需要登录,或者用户恰好登录过B这个网站,已经有登录的token放到cookie里了。这个时候,悲剧就会发生…… 

a、如果网站B是一个类似银行这样的财务网站,而post又是一个类似转账这样的接口,那对于用户来讲,就…… 

b、如果网站B是一个论坛,而网站A又是一个流量超大的网站,那对于网站B来讲,就可能瞬间被挤垮…… 

c、如果网站B是一个投票活动网站,那这个投票就被人轻松的操纵了…… 


2、防范 

好了,刚刚我们讲了整个的一个原理,那接下来,我们就一步步的讲讲如何来防范这样的攻击。 

A、如果你是网站A:请不要给攻击者留下可乘之机 

虽说网站A本身没有恶意,但是他却充当了攻击助手的角色。所以,如果你是网站A的话,你需要做的是,堵住漏洞之源。 

a、最好不要允许贴链接,特别是图片链接。因为第三方图片链接地址,你是无法保证有效性的。最好的方式,就是提供上传功能,所有的东西都控制在你手里。而即使是上传的图片,也要做图片有效性的验证,避免被人植入代码,造成服务器被攻击; 

b、如果非要允许贴图片链接,也要验证图片的有效性,并拷贝到本地服务器。比如新浪微博就支持第三方app提交图片链接。但是,他一定会把第三方的图片拷贝到他的服务器上。以保证图片本身是OK的。不然,如果第三方把图片的内容一换,给个302跳转,我们又SB了; 

c、如果非要允许贴链接地址,请一定提醒用户,这个是跳到第三方的链接,可能产生异常(这只能算一个亡羊补牢的手段)。

B、如果你是网站B:请堵住所有的开口 

如果你是网站B,你需要对你所有的提交接口做好封堵工作,要把防御式编程的思想时时谨记。 

a、遵循HTTP协议的规定,Get请求只做资源获取,千万不要做提交。提交统一用Post,参数从post变量里面获取; 

b、有些网站A可能还有XSS漏洞(下次具体聊),所以Post也不绝对解决问题,所以还要做cookie和提交加密验证。 

比如:我对所有的登录用户提供一个token的cookie,同时,对于提交前的请求,把一个加密的token值(如: md5(token))放到提交表单中,用<input type="hidden" name="sign"value="sign_token">来隐藏。当用户提交请求过来的时候,如果没有这个sign_token,或者这个值和cookie里的token对不上,则直接拒绝; 

c、关键提交增加验证码。对于注册、转账这些关键提交,最好加上验证码。这样既能防止机器人,也能防止恶意的这种CSRF攻击; 

d、增加referer的判断和拦截。如果有大量请求都是从同一个referer地址过来的,服务器最好增加一个放攻击策略,防止恶意的这种CSRF攻击;

e、关键接口,需要增加用户登录超时。对于转账等重要操作的接口,需要增加登录超时设置。比如1小时无操作,就应该让用户的登录无效,避免用户被第三方利用。 

好了,用了以上手段,至少可以防止主99.9%的这些恶意攻击(还有0.1%就需要实时分析了)。

C、如果你是普通用户:请关闭你所有该关闭的门 

对于普通用户的我们,为了防止财产流失,我们应该有最基本的安全意识。 

a、对于重要网站,最好及时登出。对于像银行、保险这样涉及到钱的网站,最好操作完以后,及时点击那个“注销”或者“退出”按钮。千万不要就点击浏览器那个“X”(好多小白用户以为关闭了浏览器就退出了,这是及其不对的认识,因为好多cookie都不是会话级的); 

b、最好少访问那种不该访问的网站(码工们应该都懂~)。即使要访问,也最好使用不带cookie的模式,避免被人搞了; 

c、重要网站的密码,最好定期更换,避免一个被破,全部都被破了。 

好了,网络安全这个话题,说起来原理都不复杂,往往都是协议或者是实现者的bug造成的。所以,对于码工们来讲,不管你是作为用户,还是网站开发者,还是……,一定要注!意!安!全!


摘自:http://mp.weixin.qq.com/s/_NGMz6Olqp_0axpPO7CHxg