互连和异构Web服务器基础架构的复杂性可包括数百个Web应用程序,并使配置管理和审查成为测试和部署每个应用程序的基本步骤。实际上,只需要一个漏洞就可以破坏整个基础架构的安全性,即使是一些看似不重要的小问题也可能会演变成同一台服务器上另一个应用程序的严重风险。
要解决这些问题,最重要的是对配置和已知安全问题进行深入审查。在进行深入审查之前,有必要映射网络和应用程序架构。需要确定构成基础架构的不同元素,以了解它们如何与Web应用程序交互以及它们如何影响安全性。
如何测试
映射应用程序架构
需要通过一些测试来映射应用程序体系结构,以确定用于构建Web应用程序的不同组件。在小型设置中,例如简单的基于CGI的应用程序,可能使用单个服务器来运行执行C,Perl或Shell CGI应用程序的Web服务器,也可能使用身份验证机制。
在更复杂的设置上,例如在线银行系统,可能涉及多个服务器。这些可能包括反向代理,前端Web服务器,应用程序服务器和数据库服务器或LDAP服务器。这些服务器中的每一个都将用于不同的目的,甚至可能分为不同的网络,它们之间有防火墙。这将创建不同的DMZ,以便对Web服务器的访问不会授予远程用户对身份验证机制的访问权限,从而可以隔离对体系结构的不同元素的妥协,以便它们不会危及整个体系结构。
如果应用程序开发人员以文档形式或访谈方式向测试团队提供此类信息,则可以轻松获取应用程序体系结构的知识,但如果进行盲目渗透测试,也可能会非常困难。
在后一种情况下,测试人员首先假设存在简单的设置(单个服务器)。然后,他们将从其他测试中检索信息并导出不同的元素,质疑这个假设并扩展架构图。测试人员将首先提出简单的问题,例如:“是否存在保护Web服务器的防火墙系统?”。将根据针对Web服务器的网络扫描结果以及是否在网络边缘过滤Web服务器的网络端口(未收到应答或ICMP不可访问)或服务器是否为直接连接到Internet(即返回所有非侦听端口的RST数据包)。可以增强此分析以确定基于网络数据包测试使用的防火墙类型。它是状态防火墙还是路由器上的访问列表过滤器?它是如何配置的?可以绕过吗?
在Web服务器前检测反向代理需要通过分析Web服务器标题来完成,这可能直接披露反向代理的存在(例如,如果返回'WebSEAL'[1])。它还可以通过获取Web服务器给出的请求并将它们与预期答案进行比较来确定。例如,一些反向代理通过阻止针对Web服务器的已知攻击来充当“入侵防御系统”(或网络屏蔽)。如果已知Web服务器使用404消息回答针对不可用页面的请求,并针对某些常见Web攻击(如CGI扫描程序所执行的那些)返回不同的错误消息,它可能表示反向代理(或应用程序级防火墙)正在过滤请求并返回与预期不同的错误页面。另一个例子:如果Web服务器返回一组可用的HTTP方法(包括TRACE),但预期的方法返回错误,那么阻塞它们之间可能存在一些问题。
在某些情况下,甚至保护系统都会让自己离开:
GET /web-console/ServerInfo.jsp%00 HTTP / 1.0
HTTP / 1.0 200
Pragma:没有缓存
缓存控制:无缓存
内容类型:text / html
内容长度:83
<TITLE>错误</ TITLE>
<BODY>
<H1>错误</ H1>
XXXXXX的FW-1:拒绝访问。</ BODY>
Check Point Firewall-1 NG AI的安全服务器示例“保护”Web服务器
反向代理也可以作为代理缓存引入,以加速后端应用程序服务器的性能。可以基于服务器头来完成检测这些代理。它们也可以通过服务器应该缓存的计时请求来检测,并将服务第一个请求所花费的时间与后续请求进行比较。
可以检测的另一个元素是网络负载平衡器。通常,这些系统将基于不同的算法(循环,Web服务器负载,请求数量等)将给定的TCP / IP端口平衡到多个服务器。因此,需要通过检查多个请求并比较结果以确定请求是否转到相同或不同的Web服务器来完成对该体系结构元素的检测。例如,如果服务器时钟未同步,则基于Date标头。在某些情况下,网络负载平衡过程可能会在标题中注入新信息,使其与众不同,例如Nortel的Alteon WebSystems负载均衡器引入的AlteonP cookie。
应用程序Web服务器通常很容易检测到。对多个资源的请求由应用程序服务器本身(而不是Web服务器)处理,响应头将显着变化(包括答案头中的不同或附加值)。另一种检测方法是查看Web服务器是否尝试设置指示正在使用的应用程序Web服务器的cookie(例如某些J2EE服务器提供的JSESSIONID),或者自动重写URL以进行会话跟踪。
然而,身份验证后端(例如LDAP目录,关系数据库或RADIUS服务器)不容易从外部角度以直接方式检测,因为它们将被应用程序本身隐藏。
可以通过导航应用程序简单地确定后端数据库的使用。如果“动态”生成高度动态的内容,则可能是应用程序本身从某种数据库中提取的。有时,请求信息的方式可能会让人了解数据库后端的存在。例如,在浏览商店中的不同文章时使用数字标识符('id')的在线购物应用程序。但是,在进行盲应用程序测试时,通常只有在应用程序中出现漏洞时才能获得底层数据库的知识,例如糟糕的异常处理或对SQL注入的敏感性。