在网络的世界里,由于虚拟、匿名等特性,被各种攻击是必然存在的。网络攻防-
据《中国互联网发展报告2018》显示,中国网民的数量已达到7.72亿。越来越多的人接入互联网,同时其他灰色产业也在蒸蒸日上,比如黑客、网络诈骗等等。网络是个好东西,现在几乎全社会都浸淫在互联网中,衣食住行,这是极好的,能够使得老幼妇孺都能享受到这种便利,但是另一方面,网络是虚拟不熟悉的,由于对技术的不了解,对于潜伏在网络中的危险毫无还手之力。
仅仅关于“点击链接”的,就有各种相关新闻,不胜枚举。其中最耸人听闻的是:由于点击了钓鱼链接,导致银行账户直接被洗劫一空。不懂技术的就十分好奇,骗子真有这么厉害吗?他们是如何做的一点就把钱转走的,毕竟我们自己转账的时候还要输入这验证码,那密码……等一系列复杂手续。
其实,有时候是很多无良媒体夸大事实,故意引导公众情绪;另一方面,在网络世界中,由于技术、开发不成熟的因素,确实存在着许多漏洞。
由于才疏学浅,只能从最基本的讲起。下面我们就先来聊一下CSRF。网络攻防-
什么是CSRF——网络攻防
CSRF(Cross Site Request Forgery, 跨站域请求伪造)虽然是一种很基本的攻击方式,但它覆盖面极广,而且常常容易被忽视。
记得以前,QQ空间常常会出现一些陌生人的留言:“这是那天我们聚会的照片,我发在这里了,链接:XXX”或是“有人把你的照片贴在这里了,这是你吗?链接:XXX”……
后来,在每年开学的时候都会收到发件人为“教务处”的邮件,内容为:“这是上学期的成绩单”或者“这是这学期的课程安排”等,再配以一条链接或一张二维码。
到现在,QQ上还是会收到陌生人发来的消息:“这是近期工作安排”再接上一条链接。网络攻防-
这种最基本的攻击方式已经过了这么多年,依然还是有人会中招。就是因为依然有源源不断的人中招,骗子有利可图,所以到现在还流行着。网络攻防-
下面我们来谈一谈CSRF的基本工作原理,以及如何防范。这有利于大家日常多留个心眼,谨防上当;其次,假如你是一名刚入门的开发人员,想要往网络安全方向发展,面试也可能会提及这个问题。
什么是Cookie——网络攻防
假如你已经在终端上的浏览器上登陆过A网站,那么A网站就会在浏览器端生成你的Cookie。Cookie常常会在本地保存一些你的身份鉴别数据,由于它安全级别不是很高,所以一般的网站,是不会将你的密码等一些私密信息保存在Cookie中的。http是无状态的,Cookie会保存你的身份鉴别信息,让服务器与你保持连接,以继续此次会话(session)。
此时你已经在A网站通过认证登陆了,Cookie保存在了你的浏览器中,骗子想要从你的浏览器中拿到Cookie是很难的,但是他可以在你不知道的情况下,进行一些他想要的操作。
跨站请求伪造——网络攻防
假设有A和B两个站点,A是你经常浏览的正派合法网站,B是攻击者自己搭建的服务器。那么攻击者是通过何种操作,来控制你行为的呢?网络攻防-
曾看到过很多人的QQ空间,或者在QQ群里,群发了一些不可描述的内容或者广告,他们很可能是中了CSRF。比如攻击者在他引导点击的链接页面中,写了如下一段js代码(示例):
然后设备上就会携带本地cookie和这个表单去请求服务器,服务器获取cookie中与身份有关的信息,并通过了验证认为是合法的用户,于是将你表单里的内容发布了出去。
到此为止,一次攻击就完成了。
如何防范这种攻击——网络攻防
浏览器有最基本的跨域检查,即检查请求的发起域与资源的请求域是否一致。但是在H5中,有些标签是可以直接跨域的。最好还是在服务端去抵御这种攻击。
首先我们可以考虑一下,造成这种结果的原因是什么。网络攻防-
原因大致有两个方面:
没有验证请求的发起服务器。
无法确定表单是用户主动提交还是被动提交的。
假如让你来设计,你会如何应对?
Refer
第一种方式,既然没有验证请求的发起服务器,那么我们能不能在通信协议中规定一个属性,即请求者的来源?网络攻防-
答案是肯定的,在HTTP header中,有一个Refer属性,即记录了请求者的地址,服务器后端只要验证这个Refer属性的值是否在白名单中即可。
这种方式简单方便,而且它可以与已有的系统解耦,不需要改动其他模块。我以为这样就可以了,但是现实世界往往是复杂的,还有很多其他的因素需要考量。
Refer方式不被常用的原因在于:「Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。」
而且,现在Refer值好像也可以篡改了。
Token
第二种方式,从上面的流程可以得知,攻击者无法拿到用户的cookie,也无法拿到服务器返回的数据(同源策略),他能做的只是伪造用户请求。而上文原因之二在于,服务端难以确定表单是用户主动提交,还是在不自知的时候被动提交的。那么,我们可以在请求中加入攻击者难以伪造的元素。
此时可以使用token,token在用户通过验证登入时,由服务器生成返回。token作为该用户网站进行浏览请求的验证信息。token可以放在form或者header中,这个数据是攻击者在自己的服务器无法伪造的,在使用中,我们往往在中间层部署一个NoSQL类型的数据库,比如redis来进行存储和验证用户的token。
但是需要注意的是,对于用户可以随意发布信息的网站,例如论坛,还需要在前端做额外的判断。因为假如攻击者论坛上发布了自己网站诱导用户去点击,此时前端不能携带token去访问,否则合法用户与他的token将被攻击者获取,并在自己的服务器建立一张映射表,以此来发起新的CSRF。
以上为今天的全部分享内容,谢谢大家!网络攻防-