ID |
---|
WSTG-INFO-10 |
为了有效地测试应用程序,并能够就如何解决所识别的任何问题提供有意义的建议,了解实际测试的内容非常重要。此外,确定是否应将特定组件视为超出测试范围可能会有所帮助。
现代 Web 应用程序的复杂性差异很大,从在单个服务器上运行的简单脚本到分布在数十个不同系统、语言和组件的高度复杂的应用程序。还可能还有其他网络级组件,例如防火墙或入侵防护系统,这些组件可能会对测试产生重大影响。
如何测试
从黑盒角度进行测试时,重要的是要尝试清楚地了解应用程序的工作原理以及哪些技术和组件已到位。在某些情况下,可以测试特定组件(如 Web 应用程序防火墙),而其他组件可以通过检查应用程序的行为来识别。
以下各节提供了常见体系结构组件的高级概述,以及如何识别它们的详细信息。
简单的应用程序可以在单个服务器上运行,可以使用指南的部分 Web服务器指纹识别中讨论的步骤进行识别。
在平台即服务 (PaaS) 模型中,Web 服务器和底层基础结构由服务提供商管理,客户仅对部署在其上的应用程序负责。从测试的角度来看,有两个主要区别:
在某些情况下,可以识别 PaaS 的使用情况,因为应用程序可能使用特定的域名(例如,部署在 Azure 应用服务上的应用程序将具有*.azurewebsites.net
域 - 尽管它们也可能使用自定义域)。在其他情况下,很难确定 PaaS 是否正在使用中。
在无服务器模型中,开发人员提供的代码直接作为单个函数在托管平台上运行,而不是运行部署在 webroot 中的传统大型 Web 应用程序。这使得它非常适合基于微服务的架构。与 PaaS 环境一样,基础结构测试可能超出范围。
在某些情况下,无服务器代码的使用可能由特定 HTTP 标头的存在来指示。例如,AWS Lambda 函数通常会返回以下标头:
X-Amz-Invocation-Type
X-Amz-Log-Type
X-Amz-Client-Context
Azure Functions 不太明显。它们通常返回 Server: Kestrel
标头 - 但这本身不足以确定它是一个 Azure 应用函数,因为它可能是在 Kestrel 上运行的其他一些代码。
在基于微服务的体系结构中,应用程序 API 由多个离散服务组成,而不是作为整体应用程序运行。服务本身通常在容器内运行(通常使用 Kubernetes),并且可以使用各种不同的操作系统和语言。尽管它们通常位于单个 API 网关和域后面,但使用多种语言(通常在详细的错误消息中指示)可能表明正在使用微服务。
许多应用程序将静态内容存储在专用存储平台上,而不是直接将其托管在主 Web 服务器上。两个最常见的平台是Amazon的S3存储桶和Azure的存储帐户,可以通过域名轻松识别:
BUCKET.s3.amazonaws.com
或 s3.REGION.amazonaws.com/BUCKET
适用于亚马逊 S3 存储桶ACCOUNT.blob.core.windows.net
对于 Azure 存储帐户这些存储帐户通常会公开敏感文件,如测试云存储指南部分所述。
数据库
大多数重要的 Web 应用程序使用某种数据库来存储动态内容。在某些情况下,可以确定数据库。这通常可以通过以下方式完成:
当无法最终确定数据库时,测试人员通常可以根据应用程序的其他方面做出有根据的猜测:
这些不是硬性规定,但如果没有更好的选择,当然可以给你一个合适的参考。
大多数应用程序都具有用户身份验证。可以使用多个身份验证后端,例如:
.htaccess
文件)或在脚本中硬编码密码.htaccess
WWW-Authenticate: Basic
HTTP 标头指示WWW-Authenticate: NTLM
HTTP 标头指示应用程序可以为用户提供多个身份验证选项(例如注册本地帐户或使用其现有的 Facebook 帐户),并且可以对普通用户和管理员使用不同的机制。
第三方服务和 API
几乎所有 Web 应用程序都包含加载或客户端与之交互的第三方资源。这些可能包括:
这些资源由用户的浏览器直接请求,使其更容易使用开发人员工具或拦截代理进行识别。虽然识别它们很重要(因为它们会影响应用程序的安全性),但请记住,它们通常超出了测试范围,因为它们属于第三方。
反向代理位于一个或多个后端服务器的前面,并将请求重定向到相应的目标。它们可用于实现各种功能,例如:
并非总是能够检测到反向代理(特别是如果其背后只有一个应用程序),但有时您可以通过以下方式识别它:
Server: nginx
标头)Server
标头)负载均衡器位于多个后端服务器的前面,并在它们之间分配请求,以便为应用程序提供更大的冗余和处理能力。
负载均衡器可能很难检测,但有时可以通过发出多个请求并检查响应的差异来识别,例如:
它们也可能通过特定 Cookie 的存在来指示(例如,F5 BIG-IP 负载均衡器将创建一个名为 BIGipServer
.
内容分发网络 (CDN) 是一组地理位置分散的缓存代理服务器,旨在提高站点性能。
它通常是通过将面向公众的域指向 CDN 的服务器,然后将 CDN 配置为连接到正确的后端服务器(有时称为“源”)来配置的。
检测 CDN 的最简单方法是对域解析到的 IP 地址执行 WHOIS 查找。如果它们属于CDN公司(例如Akamai,Cloudflare或Fastly - 有关更完整的列表,请参阅维基百科Wikipedia for a more complete list)),则很可能正在使用CDN。
在测试 CDN 后面的站点时,应牢记以下几点:
如果站点位于 CDN 后面,则识别后端服务器可能很有用。如果未实施适当的访问控制,测试人员可能能够通过直接访问后端服务器来绕过 CDN(及其提供的任何保护)。有各种不同的方法可以允许人们识别后端系统:
大多数 Web 服务器将受到数据包过滤或状态检查防火墙的保护,该防火墙会阻止任何不需要的网络流量。要检测此问题,请对服务器执行端口扫描并检查结果。
如果大多数端口显示为“关闭”(即,它们返回 RST
数据包以响应初始SYN
数据包),则表明服务器可能不受防火墙保护。如果端口显示为“已过滤”(即,将SYN
数据包发送到未使用的端口时未收到响应),则防火墙很可能已到位。
此外,如果不适当的服务暴露在全世界(如 SMTP、IMAP、MySQL 等),这表明没有防火墙,或者防火墙配置不当。
网络入侵检测系统 (IDS) 旨在检测可疑或恶意的网络级活动(如端口或漏洞扫描)并发出警报。入侵防御系统 (IPS) 的功能类似,但也采取措施来防止活动,通常通过阻止源 IP 地址。
通常可以通过对目标运行自动扫描工具(如端口扫描程序)并查看源 IP 是否被阻止来检测 IPS。但是,IPS 可能无法检测到许多应用程序级工具(尤其是在它不解密 TLS 的情况下)。
Web 应用程序防火墙 (WAF) 检查 HTTP 请求的内容,并阻止那些看似可疑或恶意的请求。它们还可用于动态应用其他控件,例如 CAPTCHA 或速率限制。它们通常利用一组已知的错误签名和正则表达式(例如 OWASP 核心规则集)来识别恶意流量。WAF 可以有效地防范某些类型的攻击(如 SQL 注入或跨站点脚本),但对其他类型的攻击(如访问控制或业务逻辑相关问题)的效果较差。
WAF 可以部署在多个位置,包括:
由于WAF拦截恶意请求,因此可以通过向参数添加常见攻击字符串并观察它们是否被拦截来检测恶意请求。例如,尝试添加使用 ' UNION SELECT 1
或 >
等值调用 foo
的参数。如果这些请求被阻止,则可能存在 WAF。此外,块页面的内容可能会提供有关正在使用的特定技术的信息。最后,某些 WAF 可能会将 Cookie 或 HTTP 标头添加到可以显示其存在的响应中。
如果正在使用基于云的 WAF,则可以使用内容交付网络部分中讨论的相同方法,通过直接访问后端服务器来绕过它。