《第三方JavaScript编程》——7.3 跨站请求伪造

7.3 跨站请求伪造

在第4章中,我们谈到了同源策略。该策略被所有浏览器支持,并防止不同来源的Web页面互相访问对方的方法和属性。你已经学到了一些技巧,使用这些技巧可以向你的服务器跨域发送消息。在本节中,我们将介绍利用该特性是如何转而对你进行攻击的。

跨站请求伪造(CSRF或者XSRF)是针对用户的另一种类型的漏洞。与XSS不同,XSS是将伪造的内容展现给用户,而XSRF利用的是Web应用程序与用户浏览器之间的信任。在本质上,易受XSRF攻击的Web应用都允许攻击者通过自己的网站诱导用户执行某些操作。

在本节中,我们首先来看一些典型的XSRF攻击的例子,然后介绍这一漏洞的变种:JSON劫持。最后,我们讨论防御XSRF攻击的策略。

7.3.1 XSRF攻击
设想如下场景:你为发布者提供了一个添加内容版主的Web接口,内容版主可以编辑、删除通过他们网站中的微件提交的评论。该接口需要身份认证。在将其添加到现有版主列表之前,需要检查调用接口的用户是否通过身份验证并有操作的权限。对于这个例子而言,假设需要添加一个新的版主,用户需要提交(POST方式)一个含有用户名的表单。

服务端处理该表单请求的代码,如下所示。

从各方面来看,该服务端接口看起来似乎很安全。毕竟它对请求用户的会话和权限级别都做了验证,而且对POST参数中的用户名也做了验证。但很可惜,尽管我们做了这么多努力,这个接口还是很容易受到XSRF的攻击。要理解其中的原因,只需要看程序清单7.4,这是攻击者提供的恶意表单,会利用访问者的身份向moderators/add接口发送POST请求。

程序清单7.4 攻击者利用XSRF漏洞提交自己的用户名作为内容版主

尽管这看起来像一个普通的Web页面,但网页上的脚本会自动生成并提交一个指向moderators/add接口的表单。换言之,只要用户访问这个页面,就会将攻击者的用户名作为参数向moderators/add提交一个POST请求。在浏览器看来,这就是向camerastork.com服务器发起的一个正常请求,因此会在请求中传输存储在camerastork.com域下的cookies,包括用户的会话cookie。服务端接收到包含cookie的请求后会检查会话并验证提供的用户名。一切看起来都很正常,因此服务端会将攻击者作为内容版主添加到你的账户中。攻击就这样悄无声息的成功完成了。

7.3.2 JSON劫持
刚刚你已经了解了XSRF漏洞的经典例子,但不幸的是,XSRF攻击有多种不同形式的变种。其中之一就是所谓的JSON劫持,常用来窃取用户的受保护信息。如果你还记得第4章中我们提到的JSONP,就应该还记得< script >标签并不受同源策略的限制,而且你曾利用这一点在微件中发送跨域HTTP请求。JSON劫持正是利用了SOP的这种例外情况,通过标准的< script >标签加载该接口,从而窃取JSON数据。

假如说Camera Stork微件允许用户对过去的购买记录进行评论,这种信息就被认为是隐私,用户并不希望将他们的购买历史公开给其他用户。微件中为了获取这部分数据,需要在服务端实现一个接口,通过JSON格式返回当前会话用户的购买历史。你就需要在一个Camera Stork域名下的iframe页面中使用XMIHttpRequest调用该接口获取数据。下面是接口响应的示例。

假设攻击者想要使用XSRF漏洞来获取这些数据。正如你所知道的,如果攻击者可以利用用户(访问恶意Web页面的用户)的身份发送该接口请求,服务端便会读取该用户的会话并返回相应的购买记录。攻击者只需要能够访问响应的正文就大获全胜了。但是具体怎么做呢?同源策略会阻止使用XMLHttpRequest的方式进行请求,因为接口与攻击者的页面隶属不同的域。只剩下使用< script >标签的方式来请求接口了,但攻击者会遇到另外一个问题:他们无法捕获响应数据的正文,因为JSON输出并没有赋值给某个变量或者持久化。因此,看起来购买历史接口的安全性似乎是有充分保障的。

事实上并不一定。对于一些旧的浏览器,可以通过自定义Object原型的setter方法来捕获传递给它的任何值。也就使得捕获接口的JSON输出成为可能,比如捕获购买历史接口返回的输出结果,见程序清单7.5。

程序清单7.5 JSON劫持一个看起来安全的HTTP接口

有了页面上的这段代码,攻击者只需要将不知情的访问者引诱到他们的网站,并使用< script >标签加载有漏洞的JSON接口。攻击者便可以将捕获到的变量内容发送到他们的服务器。这并不是一个假设的情况,这种方式曾经被用来提取一个访问者的Twitter追随者。

好消息是,在如今的一系列现代浏览器中该漏洞已经不复存在。然而,它并非浏览器JSON劫持的唯一切入点,可能也不是最后一个。

7.3.3 保护应用免受XSRF攻击
保护应用免受XSRF攻击的标准方式称之为XSRF令牌。一个XSRF令牌是一个不可预知的值,通常是一个同当前用户会话相关,但无法重用的随机生成的字符串。执行受保护操作的每个页面都包含这样的令牌。当用户提交一个操作时,表单或者JavaScript代码会将XSRF令牌作为请求的一部分一并提交,同时服务端会校验令牌的合法性。如果令牌丢失或者无效,整个请求会被拒绝。XSRF令牌应当与单个会话相关联,否则攻击者就可以使用通过他们自己会话生成的令牌。

图7.2展示了XSRF令牌发起和校验的过程。

从本质上讲,当发出一个XSRF令牌时,就相当于为用户提供了一个对应操作的一次性唯一许可,而该操作通过独立的HTTP请求是禁止访问的。并且用户只有在访问包含对应操作的页面时才能获得该许可。因为攻击者无法访问该令牌,他们也就不能诱导用户发起这些需要令牌的资源请求。

XSRF令牌的有效性只取决于服务端同浏览器用户之间的交换。如果在发布者的页面代码中生成一个XSRF令牌,恶意页面就可以获取该令牌并像之前一样进行攻击。解决方案是:只在外部iframe(通过camerastork.com访问)的页面中提供XSRF令牌,这样父文档便无法访问到。这也就意味着,如果要使用该令牌,向你的服务器发起的任何请求都需要在iframe内进行(使用window.postMessage或者easyXDM)。

在JSON劫持的情况下,除了标准的XSRF保护方式之外,还可以在JSON响应的第一行添加一些有问题的JavaScript代码,这样攻击者就不可能通过< script >标签成功访问。例如,你可以在服务器JSON响应的第一行添加一个简单的无限循环,如下。

如果攻击者通过< script >标签加载数据就无法绕过第一行,因为浏览器在执行该循环时会暂停响应。另一方面,你的微件可以通过XMLHttpRequest以纯文本的方式获取这些数据,然后丢弃掉第一行,再将响应转换为一个JavaScript对象即可。

大多数的Web开发框架(如Ruby on Rails和Python的Django)都有针对XSS和XSRF的内置策略。如果你正在使用某个Web框架,一定要先了解它的文档并熟悉这些工具。

本节介绍了一个可恶的漏洞:跨站请求伪造,作为一个第三方JavaScript开发者,这是一个要时刻考虑的问题。虽然我们所描述的防御机制并不复杂,但应该足以防御大多数XSRF漏洞。XSS和XSRF漏洞是Web应用中成功攻击的主要方式,对于第三方JavaScript应用更是如此,所以我们才花费时间来讨论它们。

时间: 2024-12-26 18:40:25

《第三方JavaScript编程》——7.3 跨站请求伪造的相关文章

安全漏洞问题4:跨站请求伪造

安全漏洞问题4:跨站请求伪造 1.1. 漏洞描述 跨站请求伪造(CSRF)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天软件发送的链接,攻击者就能迫使一个Web应用程序的用户去执行攻击者选择的操作. 在跨站请求伪造攻击中,攻击者构造恶意URL请求,然后诱骗合法用户访问此URL链接,以达到在Web应用中以此用户权限执行特定操作的目的.和反射型XSS的主要区别是:反射型XSS的目的是在客户端执行脚本:CSRF的

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

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

让我们一起来消灭CSRF跨站请求伪造(上)

写在前面的话 现在已经是2017年了,想必大家一定知道什么是CSRF(跨站请求伪造)了,因为之前关于这个话题的讨论已经有很多了.这种漏洞已经存在了很多年,社区中也有非常详细的文档以及对应的解决方案,目前很多热门的网站开发框架基本上或多或少都实现了相应的缓解方案. 那我们在本系列文章中要讨论什么呢?请大家先思考以下几个因素: 遗留应用缺少CSRF保护; 某些框架的内置CSRF防护机制存在缺陷; 应用程序没有使用已证明安全的框架保护机制; 新的应用程序没有使用提供了CSRF保护功能的现代框架; 因此

[译] 跨站请求伪造已死!

本文讲的是[译] 跨站请求伪造已死!, 原文链接:Cross-Site Request Forgery is dead! 原文作者:Scott 译文出自:掘金翻译计划 译者:XatMassacrE 校对者:newbieYoung,DeadLion 跨站请求伪造已死! 在连续不断的被跨站请求伪造折磨了这么多年后,我们现在终于有了一个合理的解决方案.一个对网站拥有者没有技术负担.实施起来没有难度.部署又非常简单的方案,它就是 Same-Site Cookies. 和互联网历史一样悠久的跨站请求伪造

跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险

跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估.在"开放式Web应用程序安全项目"(OWASP)的榜单中,CSRF(又称XSRF)就位于前10的位置.简而言之,就是恶意软件强制浏览器在用户已认证的上下文环境中,执行原本并不需要的指令. 浏览器厂家深知这一危害,从而推出了某些类型的CSRF防护技术. 尽管如此,攻击者们的手段也在日益翻新,甚至结合多种类型的Web攻击以放大危害(比如XSS和S

让我们一起来消灭CSRF跨站请求伪造(下)

写在前面的话 在本系列文章的上集中,我们跟大家介绍了关于CSRF的一些基本概念,并对常见的几种CSRF漏洞类型进行了讲解.那么接下来,我们就要跟大家讨论一下如何才能消灭CSRF. 现代保护机制 实际上,通过修改应用程序源代码来实现CSRF保护在很多情况下是不现实的,要么就是源代码无法获取,要么就是修改应用程序的风险太高了.但我们所设计的解决方案可以轻松地部署到RASP.WAF.反向代理或均衡负载器中,并且可以同时保护一个或多个配置相同的应用程序. 首先我们要知道,正确地使用安全或不安全的HTTP

《第三方JavaScript编程》——导读

**前言**第三方JavaScript是从一个远程Web服务的地址获得服务,并在发布者页面上独立运行的客户端代码.第三方JavaScript用于创造高度分布式的Web应用程序,例如从社交微件到数据跟踪分析,到功能齐全的嵌入式应用程序. 本书介绍了第三方JavaScript应用程序的开发,不仅告诉读者如何开发运行在第三方环境的JavaScript代码,也介绍了第三方Web开发的相关技术,包括HTML.CSS和HTTP等.本书适用于有第三方代码开发经验的开发者(例如在自己的网站上运行),也适用于希望

《第三方JavaScript编程》——7.2 跨站脚本

7.2 跨站脚本 或许Web应用开发者都会遇到的一个尴尬问题,就是跨站脚本(俗称XSS).许多不同的成功攻击案例都是利用了这个安全漏洞,小到将Facebook装扮成MySpace风格的恶作剧[2],大到像金融诈骗这样的严重后果.攻击者利用跨站脚本漏洞可以将自己的代码注入到用户浏览的Web页面中.迄今为止,这是包括第三方JavaScript应用在内的现代Web应用最常见的攻击形式.根据赛门铁克(Symantec)2007年的互联网安全威胁报告[3],在其中所描述所有安全漏洞中,XSS占到了80%的

《第三方JavaScript编程》——7.4 发布者漏洞

7.4 发布者漏洞 虽然大多数时间你都在处理由于跨站脚本和跨站请求伪造引起的安全漏洞,但还有一些其他漏洞.攻击者利用这些漏洞可以直接入侵你的Web应用.我们也希望能够覆盖到这些方面,它们应该归纳在Web应用安全的主题内容中单独介绍. 本章的剩余部分,我们将把重点放在涉及发布者的漏洞上.与传统的Web应用不同,第三方应用涉及多方,其中之一的发布者也并不能完全信任.因为你的应用代码(至少一部分)是在他们的页面上执行的,他们可以有意或者无意地对你的应用进行攻击.在本节中,将简要介绍最常见的几种漏洞:发