(1)对于在应用程序中已确定的任何漏洞,应发挥想象,考虑如何利用这个漏洞实现渗透测试目标,这是贯穿全书的主题。无数针对Web应用程序实施的成功攻击,最初都是从利用一个内部影响有限的漏洞开始的。通过利用信任关系并破坏应用程序其他地方实施的控制,渗透测试员就有可能利用一个看似细微的缺陷,实施严重的攻击。
(2)如果能在任何应用程序组件上执行任意命令,并能够与其他主机建立网络连接,应考虑向网络与操作系统层面中的应用程序其他基础架构发动直接攻击,以扩大攻击范围。
如果以严谨的方式执行多层架构,该架构就可以显著提高应用程序的安全,因为它能够将一次成功攻击的影响控制在局部。在前面描述的基本LAMP配置中,所有组件都在一台计算机上运行,攻破其中一个层就可能导致整个应用程序被完全攻破。在更安全的架构中,攻击者攻破一个层,只能部分控制应用程序的数据与处理操作,因而其造成的影响有限,可能仅局限于被攻破的层中。
1.尽量减少信任关系
每个层应尽可能实施自己的控制,防止未授权操作;并不得信任其他应用程序组件,以阻止该层可能有助于防御的安全违反。以下是将这个原则应用于不同应用程序层的一些实例。
应用程序服务器层应对特殊的资源与 URL 路径实施基于角色的访问控制。例如,应用程序服务器应核实所有访问/admin路径的请求均由管理用户提出,也可以对各种资源(如特殊类型的脚本与静态资源)实施访问控制。这样做可以减轻Web应用程序层存在的某些访问控制缺陷造成的影响,因为如果用户无权访问某些功能,那么他们提出的请求在到达这个层之前就已经被阻止。
数据库服务器层可以为应用程序的不同用户和操作提供各种权限的账户。例如,可以给未通过验证的用户分配一个只读访问权限的低权限账户,且该账户只能访问一部分数据。
至于已通过验证的不同类型的用户,可以向他们分配各种数据库账户,并根据用户的角色,允许其读取和写入不同的应用程序数据。这样做可以减轻许多SQL注入漏洞造成的影响,因为即使攻击取得成功,攻击者也只能访问用户合法使用应用程序时所能获得的数据。
所有应用程序组件可以使用拥有正常操作所需的最低权限的操作系统账户运行。这样做可以减轻这些组件中存在的任何命令注入或文件访问漏洞造成的影响。在设计合理并得到充分强化的架构中,攻击者就无法利用这种漏洞访问敏感数据或执行未授权操作。
2.隔离不同的组件
应尽可能地将每个层隔离开来,避免它们在无意间彼此交互。为实现这个目标,有些时候可能需要在不同的主机上运行不同的组件。以下是应用这个原则的一些实例。
一个层不得读取或写入其他层使用的文件。例如,应用程序层不得访问任何用于保存数据库数据的物理文件,它只能通过一个适当权限的用户账户,以指定的方式使用数据库查询访问这些数据。
对不同基础架构组件之间的网络级访问进行过滤,仅允许需要与不同应用程序层彼此通信的服务。例如,执行应用程序主要逻辑的服务器只能通过用于进行 SQL 查询的端口与数据库服务器交互。这种防范并不能阻止利用这种服务针对数据库层的攻击,但它能够阻止以数据库服务器为对象的基础架构攻击,并且能够防止攻破操作系统的攻击者到达组织的内部网络。
3.应用深层防御
根据架构所使用的技术,我们可以在架构的不同组件内实施各种保护措施,以达到将某个成功攻击的影响限制在局部的目的。以下是实施这些控制的一些实例。
应根据配置与漏洞补丁,把每台主机上的技术栈的各个层面进行安全强化。如果服务器的操作系统存在缺陷,那么拥有低权限账户的攻击者就可以利用一个命令注入漏洞提升自己的权限,从而完全控制整个服务器。如果其他主机没有得到强化,这种攻击就可能会在整个网络中扩散。另一方面,如果基础服务器安全可靠,攻击造成的影响会被完全局限在一个或几个应用程序层中。
应对保存在任何应用程序层中的数据进行加密,以防止攻破该层的攻击者轻松获得这些数据。用户证书和其他敏感信息(如信用卡号),应以加密形式保存在数据库中。如有可能,应使用内置保护机制保护保存在Web应用程序层中的数据库证书。例如,在ASP.NET 2.0中,加密的数据库连接字符串可保存在web.config 文件中。