1.介绍
Ajax由于其良好的交互性,在去年很引人注目。Google Suggest 和 Google Maps [ref 1]就是一些Ajax早期的著名应用。现在,企业正在考虑他们如何也能利用Ajax,web开发者在学习它,安全专家在想如何使它变得安全,黑客们在思考如何入侵。所有能提高服务器吞吐量,能产生更多的动态页面传输,而且能为最终用户提供更加丰富的web应用的技术都必然在这个领域出现。
Ajax的下一步计划称为”Web 2.0”。这篇文章的目的是介绍一些关于现代Ajax web技术的安全建议。尽管Ajax的应用难于测试,安全专家已经拥有大多数所需要的有关方法和工具。作者将讨论如今的趋势是否需要告别完全的网络更新,使用Ajax也意味着我们将面临一些新的安全问题。我们将从Ajax技术简要介绍开始,接着讨论使用Ajax技术应用带来的安全冲击。
2.初识Ajax
正常的web应用程序在同步模式下工作,一个web请求之后,一个响应在表示层引起一些动作。例如,点击链接或者提交按钮向web服务器产生一个带有相应参数的请求。传统的” click and wait”方式限制了应用程序的交互性。Ajax(Asychronous Javascript and XML)技术的使用缓解了这个问题。文中,我们将Ajax定义为向web服务器产生异步调用而不引起网页完全更新的方法。这种交互性的通过三种不同的组件实现:客户端脚本语言,XmlHttpRequest (XHR)对象和XML。
让我简短地分别介绍一下这些组件。在请求响应中,客户端脚本语言被用来初始化服务器调用和程序的存取,以及更新客户浏览器的DOM。客户端普遍使用JavaScript,由于它被知名浏览器普遍的采用。第二个组件是XHR对象,它是最重要的部分。JavaScript这类语言使用XHR对象在场景后面向web服务器发送请求,使用HTTP作为传输中介。接着是第三个组件,它的使用是必要的:XML是被交换信息的数据格式。
很多站点使用JSON(JavaScript Object Notation)代替XML,因为其更加容易解析不需要那么多管理的费用。使用JavaScript解析JSON,只需要简单的把它传给eval()函数。另一方面,有人可能使用XPath解析返回的XML。同样的,外面还有很多”Ajax 站点”既不使用XML,也不使用JSON,而是仅仅发送无格式的动态插入到网页的旧HTML碎片。
因此,Ajax不是一个新的技术商标,而是现存技术的联合应用,推动了web应用程序高度交互性的发展。实际上,所有这些组件已经出现好些年了,随Internet Explorer 5.0的发布而显著起来。开发者创建了Ajax许多的应用,诸如”提示”文本框(象Google Suggest)和自动更新数据列表。所有的XHR请求仍然是由典型的服务器端框架执行,例如标准的选择象J2EE,.NET和PHP。下面的Figure 1. 是Ajax应用程序的异步特性图例:
3. Ajax安全应用
现在我们已经回顾了Ajax的基础,让我们讨论一下它的安全含义。在web应用领域,Ajax本身并没有引入新的安全弱点。这些应用程序面临和经典web应用程序同样的问题。不幸的是,Ajax共通的最佳实现还没有发展起来,这就留下了很多的犯错误的余地。其包括安全验证,授权,存取控制和输入检查。[ref 2]。涉及Ajax使用的一些潜在领域包括:
·客户端安全控制
有人认为,客户端程序的依赖性可能引出来一些已经众所周知的问题。[ref 2]。一种可能性是开发者通过客户端控制破坏安全。如前所述,Ajax的使用需要相当多的脚本语言。如今,Web开发者同时写服务器端和客户端的代码,这也许会吸引面向客户端安全控制执行的开发者。这种方式是非常不可靠的,因为攻击者在测试应用程序弱点时,可以修改运行在他们客户端电脑上的任何代码。安全控制应该完全在服务器上执行或者经常在服务器上升级。
·不断增加的攻击面
第二个挑战是保护不断增加的攻击面。Ajax不可避免的增加了系统的整体复杂性。在采用Ajax的过程中,开发者也许要编写大量的服务器端页面,每一个页面执行一些整个程序中的小功能(象为了自动完成一个用户的城市和州域,查寻邮政区号)。这些小页面将各自成为黑客的一个附加攻击目标,而为了保证不引入新的安全弱点一个附加的点需要保护起来。这个可以比喻成著名的多重点的安全观点好像进入一个房子:保护只有一扇门的房子难度和保护有十扇门的房子相比。
·连接用户和服务器之间的间隙
Ajax是开发者通过其缩短最终用户和由面向服务构架接口的距离的一种方法。[ref 3]增加宽松联系的基于服务的构架在企业环境中有许多优点,是一种很有希望的方法。随着更多的基于服务端点的发展,随着Ajax引入向最终用户提供更多的灵活的处理的可能,远离三层标准模型的可能性增加了。
一般来说,企业内部的许多web服务(与Internet上的全部服务相对)被设计成B2B,因此,设计者和开发者常常没有考虑实际用户的交互性。这个缺乏远见的做法导致了一些坏的设计过程中安全假设。例如,最初的设计者可能假设安全认证,授权和输入检查将由其它中层系统执行。一旦有人允许”外部人士”通过Ajax的使用直接调用这些服务,就引入了一个考虑之外的代理。这类使用的一个实际例子是Microsoft的Atlas[ref 4]和web服务同时使用的一致性程度检查。开发者现在可以编写JavaScript来生成XML输入以及从客户端浏览器中正确调用web服务。在过去这个由代理和服务器完成。
·跨站脚本(XSS)的新希望
另外一个不幸的事实是攻击者通过利用跨站脚本(XSS)的弱点,能够更有创造性(换句话说,更危险)。[ref 5]黑客过去一般在”单线程”环境下使用XSS漏洞,攻击执行的时候用户的浏览器处于等待状态。这个等待状态提供了一个可能错误执行程序用户的线索。通过Ajax的引入,一个攻击者可以以更加隐秘的方式利用跨站脚本弱点。当你用一个允许Ajax的程序检查你的邮件的时候,恶意代码可能给你所有的朋友发送Email而你的浏览器不会留下任何可见的痕迹。
为了解决这方面的问题,在把程序放到产品中之前,必须执行足够多的有针对性的安全测试。即使Ajax程序是web应用程序,由于这些应用程序高度交互性的特点,一个组织好的现存的安全测试方法可能是不够的。
4.Ajax如何
测试一个正常web应用程序的时候,一个入侵测试者从footprint应用程序开始。Footprint阶段的目的是捕获请求和响应,这样测试者就知道应用程序如何和服务器通信以及它所接收到的响应。这个信息通过本地代理诸如Burp[ref 6]或者Paros[ref 7]记入日志。footprint阶段,必须尽可能做到全面,因此测试者日志向应用程序使用的所有页面发出请求。
之后,测试者将开始系统的错误注入过程,手动或者使用自动工具来测试从web服务器上传入传出的参数。
·“状态”问题
在一般的web应用程序世界里,应用程序的状态被明确的定义。存在于一个页面的DOM中的每一个事物都可以被认为是页面的当前状态。如果状态需要改变,一个请求就被发送到服务器,而响应详细说明了状态如何改变。
·通过定时器事件初始化请求
这涉及到通过基于定时器的事件而不需要任何用户交互的更新用户界面。应用程序可能定时的发送请求到服务器来更新web页面上的信息。例如,一个金融应用程序可能使用XHR对象更新显示当前股票市场信息的网页部分内容。测试者可能不会注意到后台的进程,如果他们没有在正确的时间捕获到请求,因为这里可能没有可见的链接或者按钮来提醒测试者后台有请求产生了。
·动态DOM更新
Ajax响应可以包含JaveScript片断,它能被web应用程序评价而且可以在用户接口中出现。这可能包括新的链接,服务器上新的文档的存储,等等。实现这个的一种方式是通过使用eval()声明。[ref 2,ref 8]eval()声明接受一个单变量,一个字符串,而且执行这个字符串,就像它是程序的一部分一样。
Google Suggest是一个很好的例子,其中应用程序接收到一个JavaScript片断,这个片断得到评价而且作为完成输入询问的可能建议。这个行为对于手动测试者和使用自动工具的测试者都有问题的。两者将不得不了解JavaScript在web应用程序的上下文中是如何使用的。当一个输入参数在客户端计算后被送回来的时候就需要格外小心。这个听起来象典型的XSS而且它就是,但是它已经变得非常容易被利用。使用黑名单确认的应用程序更加容易受到影响,因为攻击者不需要注入许多标记。一些方法可以被用来使用XSS而不需象过去那样的脚本标签。
·XML Fuzzing
Ajax能被用来以XML的格式发送请求接收响应。简单的自动工具确实理解GET和POST方法但是可能不知道如何处理使用XML格式封装的信息。
测试者必须保证开发者没有偏离一个安全的构架。在一个安全系统中,安全控制在一个最终用户控制之外的环境中实行。执行reviews的时候,你必须彻底审查客户端代码以确定是否能在提交变量(cookies, FORM参数, GET参数)给服务器之前修改它们的状态。一旦发生了这个,就需要分析JavaScript来确定原因。
就如一般的web应用程序一样,所有的Ajax请求需要为授权问题进行测试。开发者相信因为页面在一个客户端脚本引擎后面调用就不需要授权,那他就可能成为受害者。实际上并非如此。
5.结论
Ajax应用程序通过它高度交互性的特性提供了新的可能性。开发者可能对这些性能引入的新的不安全因素感到厌倦。安全测试者必须增加他们的测试方法和工具集来应付Ajax应用程序。
这篇文章中,作者介绍了一些Ajax技术中的安全应用。入侵测试者正看到他们已经拥有知识和工具来评价Ajax应用程序,但是它们还是有点难于测试。后面的文章将关注这个问题的更多方面,象可以在Ajax安全测试中使用的有帮助的工具。
6.参考
[ref 1] Google Suggest and Google Maps, two early Ajax applications.
[ref 2] Stewart Twynham, "AJAX Security", Feb. 16th, 2006.
[ref 3] Andrew van der Stock, "AJAX Security", OWASP Presentation given on February 7, 2006. A direct descendent of this presentation is also available from Andrew van der Stock at http://www.greebo.net/owasp/ajax_security.pdf.
[ref 4] Microsoft's Altas framework tries to integrate as a middle-tier.
[ref 5] Post by "Samy," on a "Technical explanation of the MySpace worm".
[ref 6] Burp web application proxy for penetration testing.
[ref 7] Paros web application proxy for penetration testing.
[ref 8] post by Rogan Dawes, author of WebScarab, on the WebAppSec mailing list.
7.进一步的阅读材料
·Jesse James Garrett, "Ajax: A New Approach to Web Applications", Feb. 18, 2005.
·Ryan Asleson and Nathaniel T. Schutta, "Foundations of Ajax", APress Publications, Oct 2005.
·Nicholas C. Zakas, Jeremy McPeakandJoe Fawcett, "Wrox Professional Ajax", Feb 2006.
·Eric Pascarello, "Eric Pascarello dissects Ajax security vulnerabilities", Feb. 07, 2006.
·Andrew van der Stock, "Ajax and Other 'Rich' Interface Technologies".
8. 关于作者
Jaswinder S. Hayre, CISSP, 和Jayasankar Kelath, CISSP,都是纽约Ernst & Young's Advanced Security Center的高级安全工程师。
(t116)
================================
原文链接:http://www.iis-resources.com/modules/AMS/article.php?storyid=576
原文作者:Jaswinder S. Hayre, CISSP, and Jayasankar Kelath, CISSP