Web应用程序安全与风险

Web应用程序安全无疑是当务之急,也是值得关注的话题。对相关各方而言,这一问题都至关重要。这里的相关各方包括因特网业务收入日益增长的公司、向Web应用程序托付敏感信息的用户,以及通过窃取支付信息或入侵银行账户偷窃巨额资金的犯罪分子。可靠的信誉也非常重要,没人愿意与不安全的Web站点进行交易,也没有组织愿意披露有关其安全方面的漏洞或违规行为的详细情况。因此,获取当前Web应用程序安全状况的可靠信息不可小视。

本章简要介绍Web应用程序的发展历程及它们提供的诸多优点,并且列举我们亲身体验过的在目前Web应用程序中存在的漏洞,这些漏洞表明绝大多数应用程序还远远不够安全。本章还将描述Web应用程序面临的核心安全问题(即用户可提交任意输入的问题),以及造成安全问题的各种因素。最后讨论Web应用程序安全方面的最新发展趋势,并预测其未来的发展方向。

Web应用程序的发展历程

在因特网发展的早期阶段,万维网(World WideWeb)仅由Web站点构成,这些站点基本上是包含静态文档的信息库。随后人们发明了Web浏览器,通过它来检索和显示那些文档,如图1-1所示。这种相关信息流仅由服务器向浏览器单向传送。多数站点并不验证用户的合法性,因为根本没有必要这样做;所有用户同等对待,提供同样的信息。创建一个Web站点所带来的安全威胁主要与Web服务器软件的(诸多)漏洞有关。攻击者入侵Web站点并不能获取任何敏感信息,因为服务器上保存的信息可以公开查看。所以攻击者往往会修改服务器上的文件,以歪曲Web站点的内容,或者利用服务器的存储容量和带宽传播“非法软件”。

图1-1 包含静态信息的传统Web站点

如今的万维网与早期的万维网已经完全不同,Web上的大多数站点实际上是应用程序(见图1-2)。它们功能强大,在服务器和浏览器之间进行双向信息传送。它们支持注册与登录、金融交易、搜索以及用户创作的内容。用户获取的内容以动态形式生成,并且往往能够满足每个用户的特殊需求。它们处理的许多信息属于私密和高度敏感的信息。因此,安全问题至关重要:如果人们认为Web应用程序会将他们的信息泄露给未授权的访问者,他们就会拒绝使用这个Web应用程序。

图1-2 典型的Web应用程序

Web应用程序带来了新的重大安全威胁。应用程序各不相同,所包含的漏洞也各不相同。许多应用程序是由开发人员独立开发的,还有许多应用程序的开发人员对他们所编写的代码可能引起的安全问题只是略知一二。为了实现核心功能,Web应用程序通常需要与内部计算机系统建立连接。这些系统中保存着高度敏感的数据,并能够执行强大的业务功能。15年前,如果需要转账必须去银行,让银行职员帮助你完成交易。而今天,你可以访问银行的Web应用程序,自己完成转账交易。进入Web应用程序的攻击者能够窃取个人信息,进行金融欺诈或执行针对其他用户的恶意行为。

Web应用程序的常见功能

创建Web应用程序的目的是执行可以在线完成的任何有用功能。近些年出现的一些Web应用程序的主要功能有:

购物(Amazon);

社交网络(Facebook);

银行服务(Citibank);

Web搜索(Google);

拍卖(eBay);

博彩与投机(Betfair);

博客(Blogger);

Web邮件(Gmail);

交互信息(Wikipedia)。

如今,使用计算机浏览器访问的应用程序的功能越来越多地与使用智能手机或平板电脑访问的移动应用程序的功能重叠。大多数移动应用程序都通过浏览器或定制客户端与服务器进行通信,这些浏览器或客户端大多使用基于HTTP的API。应用程序功能和数据通常在应用程序用于不同用户平台的各种接口之间共享。

除公共因特网外,组织内部已广泛采用Web应用程序来支持关键业务功能。许多这类应用程序可以访问各种高度敏感的数据和功能。

用户可以使用HR应用程序访问工资信息、提供并接收绩效反馈,以及管理人员招聘和纪律处分程序。

连接关键体系架构(如Web和邮件服务器)的管理接口、用户工作站及虚拟机管理。

用于共享文档、管理工作流程和项目、跟踪问题的协作软件。这些功能通常涉及重要的安全和监管问题,而且组织结构大多完全依赖于它们的Web应用程序内置的控件来实现这些功能。

企业资源规划(ERP)软件等业务应用程序,这类应用程序以前使用专用厚客户端应用程序访问,现在则可以通过Web浏览器进行访问。

电子邮件之类的软件服务,这类服务最初需要独立的电子邮件客户端,现在可以通过Web接口(如Outlook Web Access)访问。

传统的桌面办公应用程序(如文字处理程序和电子表格)已通过Google Apps和Microsoft Office Live等服务转换为Web应用程序。

为降低成本,组织逐渐将各种任务外包给外部服务提供商来完成,因此,在上述所有示例中,我们所认为的“内部”应用程序正日益由外部机构托管。在这些所谓的“云”解决方案中,业务关键功能和数据向数目更庞大的潜在攻击者开放,而组织却越来越多地依赖于不受其控制的安全防御。

大多数计算机用户所需要的客户端软件仅仅是一个Web应用程序,这样的时代即将来临。到那时,用户使用一组共享的协议和技术即可执行各种功能,但随之也会出现各种常见的安全漏洞。

Web应用程序的优点

Web应用程序越来越流行的原因显而易见。若干技术因素已经与主要的商业动机相结合,从而引发了因特网使用方式上的重大变革。

HTTP是用于访问万维网的核心通信协议,它是轻量级的,无须连接。这一点提供了对通信错误的容错性。应用HTTP,许多传统客户端-服务器应用程序中的服务器无须再向每一个用户开放网络连接。HTTP还可通过代理和其他协议传输,允许在任何网络配置下进行安全通信。

每个Web用户都在其计算机和其他移动设备上安装了浏览器。Web应用程序为浏览器动态部署用户界面,不必像以前的Web应用程序那样需要分配并管理独立的客户端软件。界面变化只需在服务器上执行一次,就可立即生效。

如今的浏览器功能非常强大,可构建内容丰富并且令人满意的用户界面。Web界面使用标准导航和输入控件,可保证用户即时熟悉这些功能,而不需要学习如何使用各种应用程序。应用程序可通过客户端脚本功能将部分处理交由客户端完成,必要时,可使用厚客户端组件任意扩展浏览器的功能。

用于开发Web应用程序的核心技术和语言相对简单。即使是初学者,也可使用现有的各种平台和开发工具,开发出强大的应用程序,还有大量开源代码和其他资源可供整合到定制的应用程序中。

Web应用程序安全

与任何新兴技术一样,Web应用程序也会带来一系列新的安全方面的漏洞。这些常见的缺陷也在“与时俱进”,一些开发人员在开发现有应用程序时未曾考虑到的攻击方式都相继出现了。由于安全意识的加强,一些问题已经得到解决。新技术的开发也会引入新的漏洞。Web浏览器软件的改进基本上消除了某些缺陷。

针对Web应用程序的最严重攻击,是那些能够披露敏感数据或获取对运行应用程序的后端系统的无限访问权限的攻击。这类倍受瞩目的攻击经常发生,但对许多组织而言,任何导致系统中断的攻击都属于重大事件。通过实施应用程序级拒绝服务攻击,可以达到与针对基础架构的传统资源耗竭攻击相同的目的。但是,实施这些攻击通常需要更精细的操作,并主要针对特定的目标。例如,可以利用这些攻击破坏特定用户或服务,从而在金融贸易、赌博、在线招投标和订票等领域赢得竞争优势。

在整个发展过程中,不时有报道知名Web应用程序被攻破的消息。情况似乎并未好转,也没有迹象表明这些安全问题已经得到解决。可以说,如今的Web应用程序安全领域是攻击者与计算机资源和数据防御者之间最重要的战场,在可预见的将来,这种情况可能仍将持续。

本站点是安全的

人们普遍认识到,对Web应用程序而言,安全确实是个“问题”。查询一个典型的应用程序的FAQ页面,其中的内容会向你保证该应用程序确实是安全的。

大多数Web应用程序都声称其安全可靠,因为它们使用SSL,例如:

本站点绝对安全。它使用128位安全套接层(Secure Socket Layer, SSL)技术设计,可防止未授权用户查看您的任何信息。您可以放心使用本站点,我们绝对保障您的数据安全。

Web应用程序常常要求用户核实站点证书,并想方设法让用户相信其所采用的先进加密协议无懈可击,从而说服用户放心地向其提供个人信息。

此外,各种组织还声称他们遵循支付卡行业(PCI)标准,以消除用户对安全问题的担忧。

例如:

我们极其注重安全,每天扫描Web站点,以确保始终遵循PCI标准,并免受黑客攻击。下面的标志上显示了最近扫描日期,请放心访问该Web站点。

实际上,大多数Web应用程序并不安全,虽然SSL已得到广泛使用,且会定期进行PCI扫描。最近几年,我们测试过数百个Web应用程序。图1-3说明了在2007年和2011年间测试的应用程序受一些常见类型的漏洞影响的比例。下面简要说明这些漏洞。

图1-3 我们最近测试的应用程序中出现的一些常见Web应用程序漏洞(基于100多个样本)

不完善的身份验证措施(62%)。这类漏洞包括应用程序登录机制中的各种缺陷,可能会使攻击者破解保密性不强的密码、发动蛮力攻击或完全避开登录。

不完善的访问控制措施(71%)。这一问题涉及的情况包括:应用程序无法为数据和功能提供全面保护,攻击者可以查看其他用户保存在服务器中的敏感信息,或者执行特权操作。

SQL注入(32%)。攻击者可通过这一漏洞提交专门设计的输入,干扰应用程序与后端数据库的交互活动。攻击者能够从应用程序中提取任何数据、破坏其逻辑结构,或者在数据库服务器上执行命令。

跨站点脚本(94%)。攻击者可利用该漏洞攻击应用程序的其他用户、访问其信息、代表他们执行未授权操作,或者向其发动其他攻击。

信息泄露(78%)。这一问题包括应用程序泄露敏感信息,攻击者利用这些敏感信息通过有缺陷的错误处理或其他行为攻击应用程序。

跨站点请求伪造(92%)。利用这种漏洞,攻击者可以诱使用户在无意中使用自己的用户权限对应用程序执行操作。恶意Web站点可以利用该漏洞,通过受害用户与应用程序进行交互,执行用户并不打算执行的操作。

SSL是一种出色的技术,可为用户浏览器和Web服务器间传输的数据提供机密性与完整性保护功能。它有助于防止信息泄露,并可保证用户处理的Web服务器的安全性。但SSL并不能抵御直接针对某个应用程序的服务器或客户端组件的攻击,而许多成功的攻击都恰恰属于这种类型。特别需要指出的是,SSL并不能阻止上述任何漏洞或许多其他使应用程序受到威胁的漏洞。无论是否使用SSL,大多数Web应用程序仍然存在安全漏洞。

核心安全问题:用户可提交任意输入

与多数分布式应用程序一样,为确保安全,Web应用程序必须解决一个根本的问题。由于应用程序无法控制客户端,用户几乎可向服务器端应用程序提交任意输入。应用程序必须假设所有输入的信息都是恶意的输入,并必须采取措施确保攻击者无法使用专门设计的输入破坏应用程序干扰其逻辑结构与行为,并最终达到非法访问其数据和功能的目的。

这个核心问题表现在许多方面。

用户可干预客户端与服务器间传送的所有数据,包括请求参数、cookie和HTTP信息头。可轻易避开客户端执行的任何安全控件,如输入确认验证。

用户可按任何顺序发送请求,并可在应用程序要求之外的不同阶段不止一次提交或根本不提交参数。用户的操作可能与开发人员对用户和应用程序交互方式做出的任何假设完全不同。

用户并不限于仅使用一种Web浏览器访问应用程序。大量各种各样的工具可以协助攻击Web应用程序,这些工具既可整合在浏览器中,也可独立于浏览器运作。这些工具能够提出普通浏览器无法提交的请求,并能够迅速生成大量的请求,查找和利用安全问题达到自己的目的。

绝大多数针对Web应用程序的攻击都涉及向服务器提交输入,旨在引起一些应用程序设计者无法预料或不希望出现的事件。以下举例说明为实现这种目的而提交的专门设计的输入。

更改以隐藏的HTML表单字段提交的产品价格,以更低廉的价格欺诈性地购买该产品。

修改在HTTP cookie中传送的会话令牌,劫持另一个验证用户的会话。

利用应用程序处理过程中的逻辑错误删除某些正常提交的参数。

改变由后端数据库处理的某个输入,从而注入一个恶意数据库查询以访问敏感数据。

勿庸置疑,SSL无法阻止攻击者向服务器提交专门设计的输入。应用程序使用SSL仅仅表示网络上的其他用户无法查看或修改攻击者传送的数据。因为攻击者控制着SSL通道的终端,能够通过这条通道向服务器传送任何内容。如果前面提到的任何攻击成功实现,那么不论其在FAQ中声称其如何安全,该应用程序都很容易受到攻击。

关键问题因素

任何情况下,如果一个应用程序必须接受并处理可能为恶意的未经验证的数据,就会产生Web应用程序面临的核心安全问题。但是,对Web应用程序而言,几种因素的结合使问题更加严重,这也解释了当今因特网上许多Web应用程序无法很好地解决这一问题的原因。

不成熟的安全意识

近年来,人们对Web应用程序安全问题的意识有所增强,但与网络和操作系统这些发展更加完善的领域相比,人们对Web应用程序安全问题的意识还远不够成熟。虽然大多数IT安全人员掌握了相当多的网络安全与主机强化基础知识,但他们对与Web应用程序安全有关的许多核心概念仍然不甚了解,甚至存有误解。当前,在其工作中,Web应用程序开发人员往往需要整合数十、甚至数百个第三方数据包,导致他们无法集中精力研究基础技术。即使是经验丰富的Web应用程序开发人员,也经常会对所用的编程框架的安全性做出错误假设,或遇到一些对他们而言完全陌生的基本缺陷类型。

独立开发

大多数Web应用程序都由企业自己的员工或合作公司独立开发。即使应用程序采用第三方组件,通常也是使用新代码将第三方组件进行自定义或拼凑在一起。在这种情况下,每个应用程序都各不相同,并且可能包含其独有的缺陷。这种情形与组织购买业内一流产品并按照行业标准指南安装的典型基础架构部署形成鲜明对照。

欺骗性的简化

使用今天的Web应用程序和开发工具,一个程序员新手也可能在短期内从头开始创建一个强大的应用程序。但是,在编写功能性代码与编写安全代码之间存在巨大的差异。许多Web应用程序由善意的个人创建,他们只是缺乏发现安全问题的知识与经验。

近年来出现了一种显著趋势,即使用提供现成代码组件的应用程序框架来处理各种常见的功能,这些功能包括身份验证、页面模板、公告牌以及与常用后端基础架构组件的集成,等等。Liferay和Appfuse就属于这种类型的框架。使用这些产品可以快速方便地创建可运行的应用程序,而无须了解这些应用程序的运行机制或它们包含的潜在风险。这也意味着许多公司会使用相同的框架。因此,即使仅仅出现一个漏洞,该漏洞也将会影响许多无关的应用程序。

迅速发展的威胁形势

Web应用程序攻击与防御研究发展相对不成熟,是一个正蓬勃发展的领域,其中新概念与威胁出现的速度比传统的技术要快得多。在客户端方面尤其如此,针对特定攻击的公认防御机制往往会在一些研究中失去作用,这些研究最终成就了新的攻击技巧。在项目开始之初就完全了解了当前威胁的开发团队,很可能到应用程序开发完成并部署后会面临许多未知的威胁。

资源与时间限制

由于独立、一次性开发的影响,许多Web应用程序开发项目会受到严格的时间与资源限制。通常,设计或开发团队不可能雇用专职的安全专家,而且由于项目进程的拖延,往往要等到项目周期的最后阶段才由专家进行安全测试。为了兼顾各种要素,按期开发出稳定而实用的应用程序的要求往往使开发团队忽视不明显的安全问题。小型组织一般不愿多花时日评估一个新的应用程序。快速渗透测试通常只能发现明显的安全漏洞,而往往会遗漏比较细微、需要时间和耐心来发现的漏洞。

技术上强其所难

Web应用程序使用的许多核心技术出现于万维网早期阶段,那时的状况与目前十分不同。从那以后,其功能已远远超越最初的设想,例如,在许多基于AJAX的应用程序中使用JavaScript进行数据传输。随着对Web应用程序功能要求的变化,用于实现这种功能的技术已远远落后于其发展要求,而开发人员还是沿用原有的技术来满足新的需求。因此,这种做法造成的安全漏洞与无法预料的负面影响也就不足为奇了。

对功能的需求不断增强

在设计应用程序时,开发人员主要考虑是的功能和可用性。曾经静态的用户资源现在包含社交网络功能,允许用户上传照片,对页面进行“维基”风格的编辑。以前,应用程序设计人员可以仅仅通过用户名和密码来创建登录功能,而现今的站点则包含密码恢复、用户名恢复、密码提示,以及在将来访问时记住用户名和密码的选项。无疑,这类站点声称其能够提供各种安全功能,但实际上,这些功能不过是增大了该站点的受攻击面而已。

新的安全边界

在Web应用程序出现之前,主要在网络边界上抵御外部攻击。保护这个边界需要对其提供的服务进行强化、打补丁,并在用户访问之间设置防火墙。

Web应用程序改变了这一切。用户要访问应用程序,边界防火墙必须允许其通过HTTP/HTTPS连接内部服务器;应用程序要实现其功能,必须允许其连接服务器以支持后端系统,如数据库、大型主机以及金融与后勤系统。这些系统通常处于组织运营的核心部分,并由几层网络级防御保护。

如果Web应用程序存在漏洞,那么公共因特网上的攻击者只需从Web浏览器提交专门设计的数据就可攻破组织的核心后端系统。这些数据会像传送至Web应用程序的正常、良性数据流一样,穿透组织的所有网络防御。

Web应用程序的广泛应用使得典型组织的安全边界发生了变化。部分安全边界仍旧关注防火墙与防御主机,但大部分安全边界更加关注组织所使用的Web应用程序。Web应用程序接收用户输入的方式多种多样,将这些数据传送至敏感后端系统的方式也多种多样,这些都是一系列攻击的潜在关口,因此必须在应用程序内部执行防御措施,以阻挡这些攻击。即使某个Web应用程序中的某一行代码存在缺陷,也会使组织的内部系统易于遭受攻击。此外,随着“聚合”应用程序、第三方小部件及其他跨域集成技术的出现,服务器端安全边界常常会跨越组织本身的边界。而且,各种组织还盲目地信任外部应用程序和服务。前述有关该新的安全边界内漏洞发生几率的统计数据值得每一个组织思考。

 注解 对一个针对组织的攻击者而言,获得网络访问权或在服务器上执行任意命令可能并不是他们真正想要实现的目标。大多数或者基本上所有攻击者的真实意图是执行一些应用程序级行为,如偷窃个人信息、转账或购买价格低廉的产品。而应用程序层面上存在的安全问题对实现这些目标有很大帮助。

例如,一名攻击者希望“闯入”银行系统,从用户的账户中窃取资金。在银行使用Web应用程序之前,攻击者可能需要发现公共服务中存在的漏洞,并利用其进入银行的DMZ,穿透限制访问其内部系统的防火墙,在网络上搜索确定大型计算机,破译用于访问它的秘密协议,然后推测某些证书以进行登录。但是,如果银行使用易受攻击的Web应用程序,那么攻击者可能只需修改隐藏的HTML表单字段中的一个账号,就可以达到这一目的。

Web应用程序安全边界发生变化的另一原因,在于用户本身在访问一个易受攻击的应用程序时面临的威胁。恶意攻击者可能会利用一个良性但易受攻击的Web应用程序攻击任何访问它的用户。如果用户位于企业内部网络,攻击者可能会控制用户的浏览器,并从用户的可信位置向本地网络发动攻击。如果攻击者心存恶意,他不需要用户的任何合作,就可以代表用户执行任何行为。随着浏览器扩展技术的兴起,各种插件不断增多,客户端受攻击面的范围也明显变大。

网络管理员清楚如何防止其用户访问恶意的Web站点,终端用户也逐渐意识到这种威胁。但是,鉴于Web应用程序漏洞的本质,与一个全然恶意的Web站点相比,易受攻击的应用程序至少给用户及其组织带来了一种威胁。因此,新的安全边界要求所有应用程序的所有者承担保护其用户的责任,使他们免受通过应用程序传送的攻击。

此外,人们普遍采用电子邮件作为一种补充验证机制,安全边界在一定程度上向客户端转移。当前,大量应用程序都包含“忘记密码”功能,攻击者可以利用该功能向任何注册地址发送账户恢复电子邮件,而无须任何其他用户特定的信息。因此,如果攻击者攻破了用户的Web邮件账户,就可以轻松扩大攻击范围,并攻破受害用户注册的大多数Web应用程序账户。

Web应用程序安全的未来

虽然经过约10年的广泛应用,但目前因特网上的Web应用程序仍然充满漏洞。在了解Web应用程序面临的安全威胁以及如何有效应对这些威胁方面,整个行业仍未形成成熟的意识。目前几乎没有迹象表明上述问题能够在不远的将来得到解决。

也就是说,Web应用程序的安全形势并非静止不变。尽管SQL注入等熟悉的传统漏洞还在不断出现,但已不是主要问题。而且,现有的漏洞也变得更难以发现和利用。几年前只需使用浏览器就能够轻易探测与利用的小漏洞,现在需要花费大量精力开发先进技术来发现。

Web应用程序安全的另一个突出趋势为:攻击目标已由传统的服务器端应用程序转向用户应用程序。后一类攻击仍然需要利用应用程序本身的缺陷,但这类攻击一般要求与其他用户进行某种形式的交互,以达到破坏用户与易受攻击的应用程序之间交易的目的。其他软件安全领域也同样存在这种趋势。随着安全威胁意识的增强,服务器端存在的缺陷首先应为人们所理解并得到解决,从而可以在进一步的研究过程中将注意力集中在客户端。本书描述的全部攻击类型中,那些针对其他用户的攻击是发展最快的攻击类型,也是当前许多研究的焦点所在。

技术领域的各种最新趋势在一定程度上改变了Web应用程序的安全状态。一些极具误导性的热门词汇使这些趋势深入人心,下面是一些最热门的词汇。

Web 2.0。这一术语指更大范围地采用实现用户生成内容和信息共享的功能,以及采用各种广泛支持这一功能的技术,包括异步HTTP请求和跨域集成。

云计算。这一术语指更多地通过外部服务提供商来实施技术栈的各个部分,包括应用程序软件、应用程序平台、Web服务器软件、数据库和硬件。它也指在托管环境中大量采用虚拟化技术。

和技术领域的大多数变革一样,这些趋势也催生了一些新型攻击,并导致现有攻击产生变体。虽然这些趋势受到人们的大肆追捧,但鉴于其导致的各种问题,它们并不像人们最初认为的那样会带来颠覆性的改变。我们将在本书的相应部分讨论与这些及其他最新趋势有关的安全问题。

尽管Web应用程序发生了所有这些改变,一些典型漏洞并未表现出任何减少的迹象。它们继续出现,方式与Web技术发展初期大致相同。这些漏洞包括业务逻辑缺陷、未能正确应用访问控制以及其他设计问题。即使在应用程序组件紧密集成及“一切皆服务”的时代,这些问题仍然会广泛存在。

小结

大约十几年的时间,万维网已由纯粹的静态信息仓库发展为功能强大的应用程序,能够处理敏感的数据并执行用于输出实际结果的高度功能化的应用程序。在这个发展过程中,多种因素造成了当前绝大多数Web应用程序所面临的安全保护不足的状况。

多数应用程序都面临一个核心安全问题,即用户可提交任意输入。用户与应用程序交互的每一个方面都可能是恶意的,而且在未能证明其并无恶意之前应该被认定为是恶意的。如果这个问题处理不当,应用程序就有可能受到各种形式的攻击。

当前Web应用程序安全状况的所有证据表明,这个问题尚未得到很好的解决,而且不管是对部署Web应用程序的组织还是对访问它们的用户而言,针对Web应用程序的攻击都是一个严重的威胁。

浙ICP备11005866号-12