CSRF(跨站请求伪造)漏洞介绍

一、CSRF漏洞简介

    Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。

二、CSRF攻击原理及实例

        当我们打开网站或者登陆某个网站后,就会产生一个会话(这里指用户登陆后),这个会话可能是SESSION,Cookie控制,但是这是无关紧要的。唯一的重点是浏览器与服务器之间是在会话之中,在这个会话没有结束时候,你可以利用你的权限对网站进行操作,如进行发表文章,发邮件,删除文章等操作。当这个会话结束后,你在进行某些操作时候Web应用程序通常会来提醒你,您的会话已过期,或者是请重新登陆等提示。

        这非常好理解,就像我们登陆网上银行后,Web浏览器已经跟可信的站点建立了一个经认证的会话。之后,只要是通过该Web浏览器这个认证的会话所发送的请求,都被视为可信的动作,例如转账,汇款等操作。当我们在一段时间内不进行操作后,在来重新做转账,或者汇款操作,那么这个站点可能会提示你:您的身份已过期,请重新登陆或者会话结束等消息。

        而CSRF攻击则是建立会话之上的攻击。比如当你登陆了网上银行,正在进行转账业务,这时你的某个QQ好友(攻击者)发来一条消息(URL),这条消息是攻击者精心构造的转账业务代码。而且与你所登录的网站是同一个银行,你可能认为这个网站是安全的,并不是什么钓鱼网站之类的,然后打开了这条URL,那么你的账户的钱可能就在你的这一次小小点击上全部丢失。

        怎么可能这么神奇呢?其实这并不神奇。主要是因为你的浏览器正处于与此网站的会话之中,那么一些操作都是合法的,而入侵者构造的这段代码只不过是正常的转账操作代码而已。比如说你想给用户spisec转账1000元,那么点击提交按钮之后,可能会发送以下请求:

                http://www.taobao.com/pay.jsp?user=spisec&money=1000

        而攻击者仅仅是改变一下user参数与money参数即可完成一次“合法”的攻击,如:

                http://www.taobao.com/pay.jsp?user=hack&money=10000

        当你访问了这条URL之后,就会自动向hack这个账户里面转入10000元。而这是你亲手造成的,并没因为有人去破解你的密码或者是Web服务器被入侵所导致的你的金钱丢失。下面以CSRF攻击原理图给大家形象总结:

        1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

        2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

        3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

        4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

        5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

通过以上的攻击原理描述个人总结CSRF两个侧重点:

        1、CSRF的攻击建立在浏览器与Web服务器的会话之中。

        2、欺骗用户访问URL

三、CSRF攻击分类

    CSRF漏洞一般分为站外和站内两种类型。

    CSRF站外类型的漏洞本质上就是传统意义上的外部提交数据问题。通常程序员会考虑给一些留言或者评论的表单加上水印以防止SPAM问题(这里,SPAM可以简单的理解为垃圾留言、垃圾评论,或者是带有站外链接的恶意回复),但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现GET、POST请求,当用户在会话状态下点击链接访问站外Web页面,客户端就被强迫发起请求。

    CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的。在一些敏感的操作中(如修改密码、添加用户等),本来要求用户从表单提交发起POST请求传递参数给程序,但是由于使用了$_REQUEST等变量,程序除支持接收POST请求传递的参数外也支持接收GET请求传递的参数,这样就会为攻击者使用CSRF攻击创造条件。一般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起这些请求。

四、CSRF 漏洞检测

    检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

        随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

五、CSRF漏洞防御

     CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御。

​​​​​​​        一、服务端的防御

    目前业界服务器端防御CSRF攻击主要有5种策略:验证HTTP Referer字段,在请求地址中添加token并验证,在HTTP头中自定义属性并验证等。下面分别对5种策略进行简要介绍。

​​​​​​​​​​​​​​        ​​​​​​​        (一)验证HTTP Referer字段

    根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某银行的转账是通过用户访问http://bank.test/test?page=10&userID=101&money=10000页面完成,用户必须先登录bank. test,然后通过点击页面上的按钮来触发转账事件。当用户提交请求时,该转账请求的Referer值就会是转账按钮所在页面的URL(本例中,通常是以bank. test域名开头的地址)。而如果攻击者要对银行网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank. test开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。

​​​​​​​​​​​​​​        ​​​​​​​        (二)在请求地址中添加token并验证

    CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

​​​​​​​​​​​​​​        ​​​​​​​        (三)在HTTP头中自定义属性并验证

        自定义属性的方法也是使用token并进行验证,和前一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心token会通过Referer泄露到其他网站。

​​​​​​​​​​​​​​        ​​​​​​​        ​​​​​​​        (一)在服务端区严格区分好POST与GET的数据请求

     如在asp中不要使用Request来直接获取数据。同时建议不要用GET请求来执行持久性操作,如: http://www.yeeyan.com/space/deleteEvent/16824。

​​​​​​​​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​(二)使用验证码或者密码确认方式进行

    这种方法很有效,但是用户体验就差了些。

​​​​​​​        二、用户端的防御

    对于普通用户来说,都学习并具备网络安全知识以防御网络攻击是不现实的。但若用户养成良好的上网习惯,则能够很大程度上减少CSRF攻击的危害。例如,用户上网时,不要轻易点击网络论坛、聊天室、即时通讯工具或电子邮件中出现的链接或者图片;及时退出长时间不使用的已登录账户,尤其是系统管理员,应尽量在登出系统的情况下点击未知链接和图片。除此之外,用户还需要在连接互联网的计算机上安装合适的安全防护软件,并及时更新软件厂商发布的特征库,以保持安全软件对最新攻击的实时跟踪。

​​​​​​​        (一)安全设备的防御

            由于从漏洞的发现到补丁的发布需要一定的时间,而且相当比例的厂商对漏洞反应不积极,再加之部分系统管理员对系统补丁的不够重视,这些都给了攻击者可乘之机。鉴于上述各种情况,用户可以借助第三方的专业安全设备加强对CSRF漏洞的防御。

            CSRF攻击的本质是攻击者伪造了合法的身份,对系统进行访问。如果能够识别出访问者的伪造身份,也就能识别CSRF攻击。研究发现,有些厂商的安全产品能基于硬件层面对HTTP头部的Referer字段内容进行检查来快速准确的识别CSRF攻击。图11展示了这种防御方式的简图。目前H3C公司的IPS产品采用了特殊技术,支持对部分常用系统的CSRF漏洞攻击进行检测和阻断。、

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值