跨站请求伪造攻击的基本原理与防范

摘要:文章介绍了跨站请求伪造攻击的基本情况,并以两种常见的场景作为讲解的范例,分析了该类攻击的主要原理与产生条件。针对跨站请求伪造攻击的主要 目标和所利用的漏洞,重点介绍了5种不同的防范方法,并简单的说明5种方法各自的优劣之处。为Web应用系统的安全防范和设计提供参考。
  1 跨站请求伪造简介
  跨站请求伪造(Cross Site Request Forgery,简称CSRF),也被称为“one click attack”或“session riding”。跨站请求伪造与目前非常流行的安全漏洞“跨站脚本攻击(Cross Site Scripting)”名字上有点相似,但它与XSS的攻击方法完全不一样。XSS利用漏洞影响站点内的用户,攻击目标是同一站点内的用户者,而CSRF 通过伪装成受害用户发送恶意请求来影响Web系统中受害用户的利益。
  CSRF的形成是因为攻击者较容易猜测某些Web应用一个特定敏感操作的所有细节(若是开源项目,则更直接找到关键操作的漏洞细节)。利用浏 览器能保存会话cookie等凭证,并会自动发送的特点,攻击者可以创建一个恶意web页面生成伪造请求,再利用社会工程学的手段蛊惑受害者进行操作,从 而在被攻击Web应用上伪装成受害者进行的特定敏感操作,如修改密码、通信方式甚至转账等。
  CSRF不像XSS那么广为人知,但在OWASP 2013公布的10大Web应用安全威胁中,跨站请求伪造依然位居第8位,依然是一个不可忽略的严重安全漏洞。又因为CSRF比XSS更难以防范,且更具危险性,所以CSRF也被称为“沉睡的巨人”。
  2 跨站请求伪造的场景
  跨站请求伪造攻击可以在以受害者名义伪造请求并发送给受攻击的站点,这样就能以受害者的身份和权限执行一些特殊敏感的操作,但这一切受害者是毫不知情的。例如:
  Tom登录了一个银行网站affectedBank.com,并没有退出。
  黑客Jerry知道affectedBank.com的转账功能有CSRF漏洞。于是Jerry在大型社交网站sns.com中发表一张帖子,在帖子中Jerry插入一行类似的html代码


  Tom在浏览器的另外一个标签页中查看Jerry的这条消息
  Tom的浏览器将Jerry伪造的转账请求发送给affectedBank,从而转出1000元到Jerry的账户。
  流程如图1所示。
  上述例子当中的转账操作是通过GET请求方式执行,在实际中可能会更多使用POST的方式。受攻击站点只接纳使用POST方式请求,表面上已 经不能直接将伪造请求包装在其他网站中,但黑客仍然可以使用重定向的方式将社交网站中GET的请求指向一个封装POST的页面,从而实现POST请求组合 与提交。
  在上述例子中进行一些扩展:
  A. Jerry在自己控制的站点evil.com中构造一个页面Redirector.php。将使得外部通过GET请求Redirector.php而来的 参数在页面中重新组合出表单的内容,再通过页面内的JavaScript提交到www. affectedBank.com/Transfer.php中。
  B. 在sns.com的帖子中包装一个不可见的GET请求,申请访问Redirector.php。类似于

  C. Tom在访问帖子时,实际将执行两次请求,第一次是GET请求跳转到Redirector页面,第二次是POST请求将数据提交到affectedBank.com/Transfer.php。
  流程如图2所示: 
  图2 重定向实现POST请求的CSRF
  直接利用GET请求Redirector.php页面容易暴露黑客的攻击意图,Jerry可以在Evil.com的Web服务器中设置一个 Rewrite功能,将请求而来的face.png重写为http://www.evil.com/Redirector.php?csrf= http://www.affectedBank.com/Transfer.php?toAccount=Jerry&money=1000, 这样在sns.com发帖时的引用部分就可以直接写成“http://www.evil.com/face.png”,使得攻击更加隐蔽。
  3 跨站请求伪造的基本原理
  从上述的跨站请求伪造攻击的场景中,有三个引发攻击形成的必要条件。
  1) 浏览器会自动发送用户标识的会话信息,并且用户毫不知情也无法干预。换而言之,用户不知道浏览器发送的内容中,已经包含身份标识信息。身份标识信息(例如 cookie)主要是站点用于识别受认证用户的一个标志。如果站点收到带有受害者认证信息的请求,那么这个请求就会被看作是已登录的受害者发送而来的正确 操作请求。
  2) 攻击者清楚在被攻击网站的特殊敏感操作的URL结构,并能分析其中所支持的参数和允许值。一般而言,通过访问被攻击Web应用程序,查看潜入在HTML或 JavaScript中的URL、分析提交的表单结构就可以了解到相应的信息。如果是一个开源项目,攻击者直接就可以从源代码中进行分析提取可以攻击的特 殊敏感操作。
  3) 被攻击网站完全依赖于会话信息识别用户。因为会话信息其实对浏览器而言是透明的,浏览器只负责存放和在发送请求时附加相关的会话信息,通过浏览器并不能解 析出会话信息的内容。为了提高Web应用的便利性,降低开发的成本,部分Web应用就会完全依赖这类信息来标识一个用户会话。从而导致Web应用程序不会 判断一个请求是否真是由合法用户发送的。
  一般来说,要发生跨站请求伪造攻击,需要有以下几个特点:
  1) 在受攻击站点已经登录,且没有正常退出。
  2) 受攻击站点的会话失效时间比较长。而且失效时间越长受攻击机率越高。
  3) 受攻击站点的特殊敏感操作没有严谨的用户身份标识验证。
  4) 受害者主动访问含有伪造请求的页面。电子邮件、论坛、博客等常见的互联网应用都是攻击者可利用的社会工程学的范围。
  4 跨站请求伪造防范的主要方法
  要做好攻击的防范,首先需要明确攻击的目标。跨站请求伪造攻击的对象,就是要保护的对象。从上文的分析可知,跨站请求伪造攻击是黑客利用受害 者浏览器中包含的用户身份认证信息骗取服务器的信任,但是黑客其实并不能拿到身份认证的具体凭证,也看不到身份认证的内容。另外,由于浏览器同源策略的限 制,黑客也无法进行解析查看从受攻击服务器响应回来的内容。因此,黑客无法从服务器响应中得到任何东西。他所能做的仅仅是给服务器发送请求,以执行请求中 所包含的特殊敏感操作,从而达到在服务器端直接更改数据,并非窃取服务器的敏感信息或受害者的个人资料。
  因此,针对跨站请求伪造攻击要保护的对象是那些可以直接影响数据改变的操作或服务,其他仅仅读取信息的操作或服务,则不需要进行跨站请求伪造 攻击的防范。例如上文中的银行系统,查询余额是仅仅返回读取到的金额数,跨站请求伪造攻击无法拦截服务器返回的结果,不需要防范。而转账的操作会涉及改变 账户的金额,有遭受跨站请求伪造攻击的威胁,需要保护。
  一般的攻击防范,都可以从服务端和客户端两方面入手,因为跨站请求伪造主要是针对服务端的欺骗,所以这里攻击的防范主要在服务端进行。防范的核心思想则是在服务器端不唯一依靠浏览器所直接提交的身份认证信息,而需要添加额外的校验信息。主要的实现方式有以下几种。
  1) 验证 HTTP Referer。在 HTTP 协议的请求头部含有一个字段叫 Referer,它记录了本次请求的来源地址。只需校验Referer是否以本域作为来源,则可以判断这个请求的真伪。
  这种方式的优点在于简单易用,开发人员只需用在敏感操作前增加一个拦截器检查Referer的值即可。对于已有的系统,不需要改动内部的逻 辑,比较方便。但这种方法并不是百分百有效。每个浏览器对HTTP协议的实现有一些差别,目前已经发现,IE6的浏览器Referer的值是可以被篡改。 对于新版浏览器,虽然无法纂改Referer值,但部分用户基于隐式权的需要,可以设置浏览器发送的请求不包含Referer信息。这些用户在访问时会被 误认为伪造的请求,从而拒绝了合法用户的访问。
  2) 加密cookie信息。在敏感操作的提交内容中,添加一个对cookie进行Hash后的值,服务器端对Hash值进行校验,若通过则是合法的用户请求。 因为在直接的跨站请求伪造攻击中,黑客其实是无法获取cookie的具体内容,因此也无法构造一个Hash后的cookie值,从而基本杜绝了跨站请求攻 击的实施。但是这种方法还有一种可能的泄露情况。如果黑客先通过XSS攻击盗取了用户的cookie,然后再利用盗取的cookie生成Hash值而制作 伪造请求。这种情况的攻击实现比较繁琐复杂,涉及到XSS和CSRF两种攻击的结合使用。
  4) 使用令牌。添加一个隐藏表单域记录随机的令牌,在求的参数中包含该令牌。服务器端执行操作前验证这个令牌,如果请求中没有令牌或者内容不正确,则认为可能 是伪造请求攻击而拒绝该请求。这种方法也可以完全解决请求伪造的问题。但在一个网站中,需要防范的地方非常多,要求每一个请求都加上令牌会增加了开发人员 的工作量,而且还很容易遗漏。
  5) 在 HTTP 头中自定义属性。为了解决上一个方法设置Token比较麻烦的问题,可以将令牌放到 HTTP 头中自定义的属性里。利用XMLHttpRequest这个对象,一次性为所有敏感操作在请求头增加一个新的属性,该属性的值则是一个令牌。这种添加令牌 的方式比上一种方法简单。而且,通过 XMLHttpRequest请求的地址不会被记录到浏览器的访问历史,不用担心令牌会透过Referer被窃取。这种其实是使用Ajax方法在页面局部 的异步刷新的操作,令牌在前进,后退,收藏等行为中将失效,而且如果是遗留系统,添加Ajax请求的方法等同重新设计整个系统,代价过高。
  此外,还有一些措施加固防范。如:在每次敏感操作都弹出对话框需要用户进行二次确认。服务器端将用户会话的失效时间设置得较短一些。用户自己养成习惯,在一个站点操作完成后,马上退出登录以撤销认证会话。
  5 总结
  跨站伪造请求攻击的威胁虽然比较大,但是其原理与机制相对集中。只要把握其无法伪造的一些信息,就可以有效的防范该类攻击。在防范伪造请求攻 击的方法选用时,注意选择最有效而且代价最少的方案,不能盲目追求技术的先进或复杂,而且在先满足系统的安全需要的前提下,尽量做到用户的易用性和系统的 安全性的平衡。Web应用的安全威胁层出不穷,在系统设计的时候需要注意做好安全漏洞的测试,以防止用户和企业不必要的损失。

本文章来源于:http://www.qklw1.com/article-3847.html 转载请注明来路,谢谢合作!

原文地址:https://www.cnblogs.com/lan1x/p/8124814.html

时间: 2024-10-13 17:08:42

跨站请求伪造攻击的基本原理与防范的相关文章

安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御

安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御 本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受信任的网站,诱使用户使用攻击性网站,从而达到直接劫持用户会话的目的. 由于现在的主流浏览器比如火狐和谷歌,都倾向于使用单个进程来管理用户会话(比如我们在FF和Chrome中,当要访问一个新页面时,通常是通过新增浏览器页面来达到的,而不是新开一

CSRF(跨站请求伪造攻击)详解以及防护之道

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性.然而,该攻击方式并不为大家所熟知,很多网站都有 CSRF 的安全漏洞.本文首先介绍 CSRF 的基本原理与其危害性,然后就目前常用的几种防御方法进行分析,比较其优劣.最后,本文将以实例展示如何在网站中防御 CSRF 的攻击,并分享一些开发过程中的最佳实践. C

CSRF(跨站请求伪造攻击)漏洞详解

Cross-Site Request Forgery(CSRF),中文一般译作跨站点 请求伪造.经常入选owasp漏洞列表Top10,在当前web漏洞排行中,与XSS和SQL注入并列前三.与前两者相比,CSRF相对来说受到的关注要小很多,但是危害却非常大. 通常情况下,有三种方法被广泛用来防御CSRF攻击:验证token,验证HTTP请求的Referer,还有验证XMLHttpRequests里的自定义header.鉴于种种原因,这三种方法都不是那么完美,各有利弊. 二 CSRF的分类 在跨站请

CSRF(跨站请求伪造)攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 三.CSRF漏洞现状 CSRF这

深入解析跨站请求伪造漏洞:原理剖析

当存心不良的Web站点导致用户的浏览器在可信的站点上进行非意愿的活动时,我们就说发生了跨站请求伪造(CSRF)攻击.这些攻击被誉为基于Web的漏洞中的“沉睡的巨人”,因为互联网上的许多站点对此毫无防备,同时还因为这类攻击一直为web开发和安全社区所忽视. 一.概述 当存心不良的Web站点导致用户的浏览器在可信的站点上进行非意愿的活动时,我们就说发生了跨站请求伪造(CSRF)攻击.跨站请求伪造攻击亦称跨站引用伪造(XSRF),会话叠置和混淆代理人攻击.我们之所以使用术语CSRF,是因为它是描述这类

Web安全测试之跨站请求伪造(CSRF)篇

跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体方法和示例,最后提提了一些防范该攻击的建议,希望本文对读者的安全测试能够有所启发. 一.CSRF概述 我们首先来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天

跨站请求伪造漏洞

首先说明一下什么是CSRF(Cross Site Request Forgery)? 跨站请求伪造是指攻击者可以在第三方站点制造HTTP请求并以用户在目标站点的登录态发送到目标站点,而目标站点未校验请求来源使第三方成功伪造请求. 为什么会有CSRF? JS控制浏览器发送请求的时候,浏览器是根据目标站点,而不是来源站点,来发送cookie的,如果当前会话中有目标站点的cookie,就发送出去.核心问题是浏览器的会话机制,是跨站请求伪造漏洞的根源. CSRF(Cross-site request f

Django之cfrs跨站请求伪造和xfs攻击

跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请

关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)

我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子,当然这是传说,常见的方式是XSS跨站脚本攻击和csrf跨站请求伪造. 3.可用性,比如我们的网络服务是否可用,常用的攻击方式是dos和ddos,拒绝服务和分布式拒绝服务攻击. 本文主要讲述xss和csrf的攻击,配合实例讲述这2者攻击的危害性以及一些防范的措施,有讲的不对或者不完整的地方欢迎大大们