目录
简介:
1、评估某个应用程序的安全状态时,Web应用程序架构经信被忽略,但实际上它是一个重要的安全领域。在常用的分层架构中,如果无法隔离不同的层次, 攻击者就可以利用某个层次中的一个漏洞完全攻破其他层次,进而控制整个应用程序
2、如果多个应用程序在相同的基础架构上运行,或者共享一个用途更广泛的支配型应用程序的公共组件,这些环境也会造成其他不同类型的安全威胁。在这些情况下,攻击者有时可能利用应用程序中的漏洞或恶意代码攻破整个环境以及其他属于不同客户的应用程序。最近流行的"云计算"增加了许多组织遭受此类攻击的可能性。
1.1、简介:
许多Web应用程序使用多层架构,在这个架构中,应用程序用户界面、业务逻辑与数据存储分别位于不同的层次中,这些层次可能采用各种技术,并在不同的计算机上运行。一个常用的三层架构可分为以下层次
A、展现层,执行应用程序的界面
B、应用程序层,执行核心应用程序逻辑
C、数据库层,存储并处理应用程序数据
实际上,许多复杂的企业应用程序对不同层次进行更详细的划分。如一个基于Java的应用程序可能采用以下层次与技术:
A、应用程序服务器层(如Tomcat)
B、展现层(如WebWork)
C、授权与验证层(如JAAS或ACEGI)
D、核心应用程序框架(如Struts或Spring)
E、业务逻辑层(如Enterprise Java Beans)
F、数据库对象关系映射(如Hibemate)
G、数据库JDBC调用
H、数据库服务器
与单层设计相比,多层架构具有诸多优点,与大多数软件设计方法一祥,将高度复杂的处理任务分解成简单、模块化的功能组件,能够显著改善应用程序开发管理并降低漏洞的发生率。拥有明确定义界面的独立组件可在不同的应用程序内及应用程序之间重复使用,不同的开发者可以并行开发不同的组件,而不必深入了解其他组件的执行细节,如果有必要替换一个层次使用的技术,替换过程也不会给其他层次造成严重影响。如果运用合理,多层架构可显茗改善整个应用程序的安全状态
1.2、攻击分层架构
简述:
分析结果表明,如果一个多层架构的执行过程存在缺陷,这些缺陷可能会引入安全漏洞。了解多层栈型可帮助渗透测试员确定实施各种安全防御(如访问控制与输入确认)的位置,以及如何穿越层次边界来破坏这些防御,从而对Web应用程序实施有效攻击,设计不佳的分层架构可能受到以下3种类型的攻击:
A、可以利用不同层之间的信任关系扩大攻击范围,从一个层侵入到另一个层。
B、如果不同层之间没有完全隔离,就可以利用某一层存在的缺陷直接破坏另一层实施的安全保护
C、局部攻破一个层后,就可以直接攻击其他层的基础架构,从而将攻击扩大到其他层。
利用层之间的信任关系
应用程序的不同层之间彼此信任,并以特殊的方式运转。如果应用程序运行正常,这些假设就有效。但在反常情况下或者应用程序正受到攻击时,上述假设就会被打破。这时就可以利用这些信任关系将攻击范围由一个层扩大到另一个层, 增加安全违反的严项程度。
许多企业应用程序中存在一种十分常见的信任关系,即某个应用程序层专门负责管理用户访问。这个层实施验证与会话管理,并执行各种逻辑,决定是否准予某个特殊的请求,如果该应用程序层决定准予一个请求,它就向其他层发出相关命令,以执行被请求的操作,其他层相信准予请求的应用程序层,认为它已经实施了严格的访问控制检查,因而执行它们从该应用程序层收到的全部命令
这种类型的信任关系会加速恶化许多常见的Web漏洞。如果应用程序中存在SQL注入漏洞,攻击者就可以利用它访问应用程序中的所有数据,即使应用程序并不以数据库管理员的身份访问数据库,它通常也会使用一个能够读取并更新所有应用程序数据的独立账户。因此数据库层完全信任对它的数据实施访问控制的应用程序层
应用程序组件通常使用较高权限的操作系统账户运行,这些账户能够执行敏感操作并访问关键文件。在这种配置下,操作系统层完全信任相关应用程序层,认为它不会执行有害操作。如果攻击者发现一个命令注入漏洞,在利用它攻破应用程序层后,还可以进一步完全攻破,为应用程序层提供支持的基础操作系统
层之间的信任关系还可能导致其他问题,如果一个应用程序层存在编程错误,那么这些错误可能会导致其他层出现反常行为。如竞态条件导致后端数据库提供属于错误用户的账户信息。但如果管理员正在调查一起意外事件或安全违反行为,只通过查阅信任层中的审计日志通常并不足以帮助他们完全了解印件的整个发生过程,因为他们只能确定可信层是引发事件的媒介。如发生SQL注入攻击后,数据库日志可能会记录攻击者注入的每一个查询,但要确定哪一名用户是攻击者,还必须将这些事件与应用程序层中的日志记录进行交叉参考,因为通过日志记录无法确定攻击者
破坏其他层
如果应用程序的不同层之间没有完全隔离,那么攻破一个层的攻击者就可以直接破坏另一个层实施的安全保护,从而执行这个层负责控制的操作或访问其中的数据。
如果几个层在相同的计算机上执行,那么这时往往会出现漏洞,为节省成本, 许多应用程序常常采用这种架构配置
1、访问解密算法
通常为满足PCI等管理或法规要求,许多应用程序都会对敏感的用户数据进行加密,以最大限度地降低应用程序被攻破造成的影响,虽然可以对密码进行"加salt散列"处理,以确保即使数据存储被攻破,攻击者仍然无法确定密码,但对于应用程序需要将其恢复为明文值的数据,则需要采用不同的处理方法。关于这类数据,最常见的示例包括用户的安全问题(可以通过与服务台进行交互来确认)和支付卡信息(在付款时需要这些信息)。为此需要采用某种双向加密算法,使用加密时出现的典型漏洞是加密密钥与加密数据之间未进行逻辑隔离,在现有环境中使用加密时,一种简单但存在缺陷的隔离方法,是将算法和相关密钥置于数据层,以避免影响到其他代码。但如果数据层也被攻破(如通过SQL注入攻击),攻击者将可以轻松确定并执行解密功能
2、使用文件读取访问权限提取MySQL数据
许多小型应用程序使用一个LAMP服务器(运行Linux、Apache、MySQL和PHP等开游软件的独立计算机)。在这种架构中,如果Web应用程序层中的一个文件泄露漏洞,其本身并不会造成严重的缺陷,但却可以导致攻击者无限制地访问应用程序的所有数据,因为MySQL数据保存在可读的文件中,且Web应用程序进程通常有权读取这些文件,即使数据库对它的数据实施了严格的访问控制,而且应用程序使用一系列低权限的账户连接数据库,但如果攻击者能够直接访问保存在数据库层中的数据,仍然可以完全避开这些保护
应用程序允许用户选择一种皮肤自定义的使用体验,要求用户选择一个层叠样式表文件,并且应用程序会将这个文件呈现给用户审查
如果这个功能包含一个路径遍历漏洞,那么攻击者就可以利用这个漏洞直接访问保存在MySQL数据库中的任意数据,从而破坏在数据库层实施的访问控制
如果攻击者具有文件写入访问权限,就可以尝试对应用程序的配置或托管的虚拟目录执行写入操作, 以执行相关命令
3、使用本地文件包含执行命令
许多语言都包含用于在当前脚本中包含本地文件的函数,如果攻击者能够指定文件系统上的任何文件,这无疑是一个严重的问题,此类文件可能为/etc/passwd文件或包含密码的配置文件,很明显,这些情况会导致信息披露,但攻击者不一定能够扩大攻击范围,以进一步攻破整个系统,不过攻击者仍然可以利用其他应用程序或平台功能,通过包含一个内容部分受其控制的文件来执行命令
过程:
1、对于在应用程序中已确定的任何漏洞,发挥想象考虑如何利用这个漏洞实现渗透测试目标,无数针对Web应用程序实施的成功攻击,最初都是从利用一个内部影响有限的漏洞开始的,通过利用信任关系并破坏应用程序其他地方实施的控制,就有可能利用一个看似细微的缺陷,实施严重的攻击
2、如果能在任何应用程序组件上执行任意命令,并能够与其他主机建立网络连接,应考虑向网络与操作系统层面中的应用程序其他基础架构发动直接攻击,以扩大攻击范围
1.3、保障分层架构的安全
简述:
如果以严谨的方式执行多层架构,该架构就可以显著提高应用程序的安全,因为它能够将一次成功攻击的影响控制在局部,在基本LAMP配控中,所有组件都在一台计算机上运行,攻破其中一个层就可能导致整个应用程序被完全攻破,在更安全的架构中,攻击者攻破一个层,只能部分控制应用程序的数据与处理操作,因而其造成的影响有限,可能仅局限于被攻破的层中
尽量减少信任关系
每个层应尽可能实施自己的控制,防止未授权操作;并不得信任其他应用程序组件,以阻止该层可能有助于防御的安全违反
这个原则应用于不同应用程序层的实例:
1、应用程序服务器层应对特殊的资源与URL路径实施基于角色的访问控制。如应用程序服务器应核实所有访问/admin路径的请求均由管理用户提出,也可以对各种资源(如特殊类型的脚本与静态资源)实施访问控制,这样做可以减轻Web应用程序层存在的某些访问控制缺陷造成的影响,因为如果用户无权访问某些功能,那么他们提出的请求在到达这个层之前就已经被阻止。
2、数据库服务器层可以为应用程序的不同用户和操作提供各种权限的账户。如可以给未通过验证的用户分配一个只读访问权限的低权限账户,且该账户只能访问一部分数据。至于已通过验证的不同类型的用户,可以向他们分配各种数据库账户,并根据用户的角色,允许其读取和写入不同的应用程序数据,这样做可以减轻许多SQL注入漏洞遭成的影响,因为即使攻击取得成功,攻击者也只能访问用户合法使用应用程序时所能获得的数据
3、所有应用程序组件可以使用拥有正常操作所需的最低权限的操作系统账户运行。这样做可以减轻这些组件中存在的任何命令注入或文件访问漏洞造成的影响,在设计合理并得到充分强化的架构中,攻击者就无法利用这种漏洞访问敏感数据或执行未授权橾作。
隔离不同的组件
应尽可能地将每个层隔离开来,避免它们在无意间彼此交互,有时可能衔要在不同的主机上运行不同的组件。
应用这个原则的实例:
1、一个层不得读取或写入其他层使用的文件。如应用程序层不得访问任何用于保存数据库数据的物理文件,它只能通过一个适当权限的用户账户,以指定的方式使用数据库查询访问这些数据
2、对不同基础架构组件之间的网络级访问进行过滤,仅允许需要与不同应用程序层彼此通信的服务。如执行应用程序主要逻辑的服务器只能通过用于进行SQL查询的端口与数据库服务器交互。这种防范并不能阻止利用这种服务针对数据库层的攻击,但它能够阻止以数据库服务器为对象的基础架构攻击,并且能够防止攻破操作系统的攻击者到达组织的内部网络
应用深层防御
根据架构所使用的技术,可以在架构的不同组件内实施各种保护措施,以达到将某个成功攻击的影响限制在局部的目的
实施这些控制的实例:
1、应根据配置与漏洞补丁,把每台主机上的技术栈的各个层面进行安全强化,如果服务器的操作系统存在缺陷,那么拥有低权限账户的攻击者就可以利用一个命令注入漏洞提升自己的权限,从而完全控制整个服务器,如果其他主机没有得到强化,这种攻击就可能会在整个网络中扩散。另一方面,如果基础服务器安全可靠,攻击造成的影响会被完全局限在一个或几个应用程序层中
2、应对保存在任何应用程序层中的数据进行加密,以防止攻破该层的攻击者轻松获得这些数据。用户证书和其他敏感信息(如信用卡号),应以加密形式保存在数据库中。尽可能使用内置保护机制保护保存在Web应用程序层中的数据库证书。如在ASP.NET2.0中,加密的数据库连接字符串可保存在web.config文件中