应用程序接口测试
应用程序接口(API)使软件系统和应用程序能够通信和共享数据。API 测试非常重要,因为 API 中的漏洞可能会破坏网站的保密性、完整性和可用性等核心方面。
所有动态网站都由 API 组成,因此像 SQL 注入这样的经典网络漏洞也可归类为 API 测试。在本文中会介绍:如何测试网站前端未完全使用的 API,重点是 RESTful 和 JSON API以及如何测试可能影响内部 API 的服务器端参数污染漏洞。
为了说明 API 测试与一般 Web 测试之间的重叠,我们创建了现有主题与 OWASP API Security Top 10 2023 之间的映射。
API 侦察
要开始 API 测试,首先需要尽可能多地了解有关 API 的信息,以发现其攻击面。
首先,应该确定 API 端点。这些端点是 API 接收有关其服务器上特定资源的请求的位置。例如,考虑以下 GET请求:
GET /api/books HTTP/1.1
Host: example.com
该请求的 API 端点是**/api/books
**。这将导致与 API 的交互,从图书馆检索图书列表。例如,另一个 API 端点可能是 /api/books/mystery
,它将检索一个神秘书籍列表。
一旦确定了端点,就需要确定如何与之交互。这样,您就可以构建有效的 HTTP 请求来测试 API。例如,你应该了解以下信息:
应用程序接口处理的输入数据,包括必选和可选参数。
API 接受的请求类型,包括支持的 HTTP 方法和媒体格式。
速率限制和验证机制。
API 文档
应用程序接口通常都有文档说明,以便开发人员知道如何使用和集成它们。
文档可以采用人工可读和机器可读两种形式。人工可读文档旨在让开发人员了解如何使用 API。它可能包括详细的解释、示例和使用场景。机器可读文档是为软件处理 API 集成和验证等自动化任务而设计的。它采用 JSON 或 XML 等结构化格式编写。
API 文档通常是公开的,尤其是当 API 是供外部开发人员使用时。如果是这种情况,请务必从查看文档开始您的侦察工作。
Discover API 文档
即使 API 文档不公开,您也可以通过浏览使用 API 的应用程序来访问它。
为此,可以使用 Burp Scanner 抓取 API。也可以使用 Burp 浏览器手动浏览应用程序。例如,查找可能引用 API 文档的端点:
/api
/swagger/index.html
/openapi.json
如果确定了资源的端点,请务必调查基本路径。例如,如果确定了资源端点 /api/swagger/v1/users/123
,则应调查以下路径:
/api/swagger/v1
/api/swagger
/api
还可以使用 Intruder 查找文件的常用路径列表。
利用文档开发应用程序接口端点-靶场
靶场地址:https://portswigger.net/web-security/api-testing/lab-exploiting-api-endpoint-using-documentation
使用机读型文件
可以使用一系列自动化工具来分析找到的任何机器可读 API 文档。
可以使用 Burp Scanner 抓取和审核 OpenAPI 文档或任何其他 JSON 或 YAML 格式的文档。您还可以使用 OpenAPI 解析器 BApp 解析 OpenAPI 文档。
还可以使用 Postman 或 SoapUI 等专用工具来测试记录的端点。
识别应用程序接口端点
还可以通过浏览使用 API 的应用程序来收集大量信息。即使您可以访问 API 文档,这通常也值得一做,因为有时文档可能不准确或过时。
你可以使用 Burp Scanner 抓取应用程序,然后使用 Burp 浏览器手动调查有趣的攻击面。
在浏览应用程序时,查找 URL 结构中暗示 API 端点的模式,如 /api/
。还要注意 JavaScript 文件。这些文件可能包含对 API 端点的引用,而这些 API 端点并不是通过网络浏览器直接触发的。Burp Scanner 会在抓取过程中自动提取一些端点,但要提取更多内容,请使用 JS Link Finder - PortSwigger。您还可以在 Burp 中手动审查 JavaScript 文件。
与应用程序接口端点互动
确定 API 端点后,使用 Burp Repeater 和 Burp Intruder 与之交互。这样,您就可以观察 API 的行为,发现更多攻击面。例如,可以研究 API 对更改 HTTP 方法和媒体类型的响应。
在与 API 端点交互时,仔细查看错误信息和其他响应。有时,这些信息可用于构建有效的 HTTP 请求。
识别支持的 HTTP 方法
HTTP 方法指定对资源执行的操作。例如
GET
- 从资源中读取数据。PATCH
- 对资源进行部分更改。OPTIONS
- 检索可用于资源的请求方法类型的信息。
API 端点可能支持不同的 HTTP 方法。因此,在调查 API 端点时,测试所有潜在方法非常重要。这可能会让你识别出更多的端点功能,从而打开更多的攻击面。
例如,端点 /api/tasks
可能支持以下方法:
GET /api/tasks
- 读取任务列表。POST /api/tasks
- 创建新任务。DELETE /api/tasks/1
- 删除任务。
您可以使用 Burp Intruder 内置的 HTTP verbs列表来自动循环使用一系列方法。
备注
测试不同 HTTP 方法时,应以低优先级对象为目标。这有助于确保避免意外后果,例如更改关键项目或创建过多记录。
识别支持的内容类型
API 端点通常期望以特定格式获取数据。因此,根据请求中提供的数据的内容类型,它们可能会有不同的行为。更改内容类型可以实现以下功能
触发错误,披露有用信息。
绕过有缺陷的防御。
利用处理逻辑的差异。例如,API 在处理 JSON 数据时可能是安全的,但在处理 XML 时却容易受到注入攻击。
要更改内容类型,请修改**Content-Type
**标头,然后相应地重新格式化请求正文。您可以使用Content type converterBApp 在 XML 和 JSON 之间自动转换请求中提交的数据。
查找和利用未使用的 API 端点-靶场
靶场地址:https://portswigger.net/web-security/api-testing/lab-exploiting-unused-api-endpoint
使用入侵者查找隐藏端点
一旦确定了一些初始 API 端点,就可以使用 Intruder 来发现隐藏的端点。例如,考虑这样一种情况,即已识别出以下用于更新用户