CSRF攻击与防御

一、概念:

        CSRF:也叫XSRF(英文Cross-site request forgery),中文名是跨站请求伪造,也被称为One Click Attack或者Session Riding。CSRF通过伪装成受信任用户的请求来请求网站,用户自己察觉不到这种操作,但操作请求是以用户的身份发出去的。网站大部分是通过Cookie来识别用户的,比如当用户在A网站进行身份验证成功之后浏览器就会得到一个标识其身份的Cookie,只要不关闭浏览器不退出登录,以后访问这个A网站就会带上这个Cookie。如果这期间用户访问了某个不受信任的第三方站点B,而该站点包含了对A站点某个接口进行请求的代码,那么这个请求就会以用户的身份发出去,而用户自己并不知情。

二、攻击条件:

        1、能够从另一个页面请求指定的网站;

        2、指定的网站中登录需要的身份令牌可以通过某种方式得到;

三、攻击示例:

        如果用户POST请求输入$userName和$passWord登录银行的安全网站:http://localhost:8000/bank.php,代码如下:

        当用户$userName输入:abcd,$passWord输入:123456登录成功时,会在浏览器中设置Cookie:auth=abcd%2C123456。

        当用户在未关闭浏览器且未退出帐号时,又登录了一个不可信任、不安全的网站: http://localhost:8001/danger.html,代码如下:



  
    
    Dangerous Page
  
  
    
    
查看美图

        可以看到最终会出现登录成功的弹框,表示已经不用输密码自动登录,而且也不需要知道auth的加密规则。登录之后就可以做一些用户操作比如转帐等操作,而用户自己却根本不知道程序发生了什么。

四、防御措施:

        1、使用POST请求而非GET请求;

        2、使用Referer请求头判别请求来源,但Referer并不一定会有,而且是可以伪造的,所以不一定有用,但可以增加攻击成本;

        3、将Cookie设置为HttpOnly,这样通过程序(如JavaScript脚本、Applet等)就无法读取到Cookie信息,避免了攻击者伪造Cookie的情况出现;

        4、请求参数,尤其是像auth这样的参数,不要存在可以被攻击者取到的地方,比如Cookie中,而要用Header或Post方式请求;

        5、使用身份令牌token,这个token是一个随机数。每次请求都需要通过POST表单提交这个token,请求到服务端之后服务端要校验这个token值对不对,这样就避免了攻击示例中伪造用户身份。因为使用token,起到如下作用:

                1>这个token是放在页面中的,如果像攻击示例那样没有页面,只是通过Ajax自动发送请求,请求时没有token自然就被服务端拦截了;

                2>因为token是放在页面中的POST表单,并不是放在Cookie中,而且是每次请求都随机变化,所以这个token不容易被别人拿到和伪造;

       token目前主流的应用是:

  • 数字/字母/汉字图片验证码:目前大部分网站都可感知的使用了该技术。每一次请求或验证错误都会生成新验证码,发到服务端由服务端校验验证码是否正确。因为每次获取验证码也是一个请求,如果恶意攻击者也是使用这个请求生成的验证码,那么无疑这种方式也不能彻底解决CSRF攻击,只能加大CSRF的攻击成本。一般这种验证码都是base64图片,随着大数据分析的发展,更高级的攻击者如果使用一些图像识别的技术自动识别验证码的内容然后发起自动攻击,也不是没有可能。所以这种文字验证码技术目前正在逐渐被物品分类验证码(12306火车票),滑块验证(通过分析滑动的行为判断是否是人为操作)所取代;
  • 用POST方式传入ak(可以当成是公钥)和特征值,在服务端使用sk(可以当成是私钥)等信息经过一系列算法计算,对特征值进行解密。如果能解出数据说明验证通过,否则验证不通过,当然ak和sk之前是有一定的联系的,有多种加密算法及实现。

 

       漏洞的攻击和防御就像是两个对决者你来我去的较量,谁都没有必胜的把握一定能打败对方,但是双方都会在一次次的较量中总结经验,研究更新更厉害的招数。防御,并不是说一定就能阻挡恶意的攻击,只是说能提高攻击者的成本,降低被攻破的可能性,但是我们不能因为不能完全阻挡恶意攻击就不去做漏洞的防御。

你可能感兴趣的:(安全)