背地里搞你的攻击: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的这个贴子的时候,标签就会自动加载网站B的post地址。这个时候,就相当于这个用户在不知情的情况下,就访问了网站B的提交接口。如果是标签,则需要用户手动去点击一下这个链接。

如果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))放到提交表单中,用来隐藏。当用户提交请求过来的时候,如果没有这个sign_token,或者这个值和cookie里的token对不上,则直接拒绝;

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

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

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

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

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

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

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

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

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

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

 


    关注 SimpleMain


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册