在不使用 OpenAPI 或 Swagger 规范的情况下,使用 OWASP ZAP 对 API 进行身份验证

Posted

技术标签:

【中文标题】在不使用 OpenAPI 或 Swagger 规范的情况下,使用 OWASP ZAP 对 API 进行身份验证【英文标题】:Authenticate to an API with OWASP ZAP without using OpenAPI or Swagger specs 【发布时间】:2021-06-07 12:31:16 【问题描述】:

我正在尝试对我的 API 进行身份验证,以使用 OWASP ZAP 执行一些被动/主动扫描。

我没有任何 Swagger 或 OpenAPI 规范,但我有一些 HTTP 测试 (javascript) 可能会有所帮助。但是,我无法确定使用 ZAP 对我的 API 进行身份验证。

理想情况下,我希望在给定一些规范(ZAP 可以理解的任何格式,但不是 OpenAPI Swagger 等自动工具)、URL 入口点和用户名/密码的情况下自动执行扫描,但我坚持使用更基本的步骤,例如身份验证。

我一直在关注本指南:https://www.zaproxy.org/docs/desktop/ui/dialogs/session/context-auth/

我在 Session > Contexts > Default Context > Users 中添加了一个用户名/密码对:

然后我在 Sessio > Context > Default Context > Authentication 中提供了有关身份验证 API 端点的详细信息:

我确保按下“强制用户模式启用”按钮(请参阅上一个屏幕截图中“用户详细信息”中的红色圆圈。

然后我右键单击我的“默认上下文”(我用这个名称创建了这个,与 ZAP 术语无关,它只是一个 ZAP 上下文)并单击“主动扫描”。

然后我点击右键后弹出窗口中的“开始扫描”按钮。

然后什么都没有发生。我没有看到任何移动、记录或闪烁的东西。

    如何使用 OWASP ZAP 对我的 API 进行身份验证? 如何重用 JWT 令牌以在其他 HTTP 请求中用作标头? 有没有一种方法可以模仿我在 HTTP 集成测试中所做的工作,让 ZAP 发现 HTTP 路径、HTTP 查询参数等问题? 如何将上述内容导出到可以从命令行调用的脚本中?

编辑 1

这不是一个带有 html 或 web 应用程序的网站。这只是一个通过 HTTPS 的 REST API,带有请求/响应、路径、查询参数和标头。

“包含上下文”不包含任何 URL。但是我只是再次尝试添加我在“身份验证”菜单中指定的 URL,然后再次尝试使用“主动扫描”并没有任何反应。

“身份验证”中的登录/注销正则表达式不包含任何内容,因为没有这样的“注销” - JWT 令牌刚刚过期,对任何 API 端点的请求不再有效。 无论如何,我将“登录”URL 的 HTTP 路径(不是协议或域/主机,只是没有任何 / 的路径)添加到 ZAP 表单中的两个正则表达式字段。然后再次尝试“主动扫描”,没有任何反应。

这个“主动扫描”应该做什么?我必须提供所有有效路径吗?查询参数呢? 如何从“登录”API 端点(它不是网页)获取 JWT 令牌,并在扫描期间将其用作 HTTP 标头? 如何被动扫描任何端点,例如“登录”API 端点(同样 - 不是网页,只是 REST 端点)。

编辑 2

我在 Linux 上通过snap 使用 ZAP 2.9.0,没有其他版本可用:

$ snap find zaproxy
Name     Version  Publisher  Notes    Summary
zaproxy  2.9.0    psiinon    classic  OWASP ZAP, a tool for finding vulnerabilities in web applications
$ snap install zaproxy --classic
zaproxy 2.9.0 from Simon Bennetts (psiinon) installed

编辑 3

我将此正则表达式 https?:\/\/example.org\/.*(与我的主机,而不是“示例”)添加到:

“包含在上下文中”菜单项 “登录”和“注销”正则表达式模式中的“身份验证”菜单项。

然后再次尝试“主动扫描”:没有任何反应 - 窗口下部的选项卡中没有输出,没有日志,没有闪烁的信号量。

【问题讨论】:

【参考方案1】:

所以您似乎遗漏了两个关键细节。

    您没有提到上下文中包含的内容,或者您​​配置了包含在上下文中的模式。

    还要查看您尚未识别登录或注销标识符的屏幕截图,因此 zap 永远无法知道它处于什么状态。

如何从“登录”API 端点(它不是网页)获取 JWT 令牌,并在扫描期间将其用作 HTTP 标头?

在 Zap 2.10 中,您还可以将身份验证轮询设置为验证策略。

如果您有非标准的身份验证机制,则有多种选择,例如使用 Replacer 插件或 HttpSender 脚本来设置/更新标头/令牌值。从 2.10.0 开始,这也可以通过 env vars 完成: https://www.zaproxy.org/docs/desktop/start/features/authentication/

这个“主动扫描”应该做什么?我必须提供所有有效路径吗?查询参数呢?

这就是为什么导入 OpenAPI 等很有价值。其他选项是代理功能测试。 Zap 必须了解内容/功能才能对其进行有效测试。

我如何被动扫描任何端点,例如“登录”API 端点(同样——不是网页,只是一个 REST 端点)。

被动扫描发生在代理或蜘蛛流量上。

“包含上下文”不包含任何 URL。但是我只是再次尝试添加我在“身份验证”菜单中指定的 URL,然后再次尝试使用“主动扫描”并没有任何反应。

包含在上下文中应该是一个匹配您的端点的正则表达式模式,除非您实际上只测试一个特定的 URL。例如:https?:\/\/example.org/.*.* 是正则表达式通配符并匹配 example.org/ 上的任何内容)

【讨论】:

我在上面的编辑中添加了更多细节。只是为了确保:这是一个 REST API,没有要抓取的网站或登录网页或注销按钮之类的东西。谢谢 好的,所以我在浏览器中看到了关于代理的事情。但是我如何从 ZAP 中定位一些我在命令行上使用npm run test 运行的 Node.js 规范?这些规范包含所有这些 URL 和 HTTP 查询参数以及 HTTP 标头。我不能使用浏览器,因为这是一个 REST API——虽然我可以使用 Postman——但它不完全是浏览器。语言不是问题,我也可以使用 Python 或curl 可以为 postman、selenium、curl 等设置代理。在 *nix 平台上,您还可以通过 env vars 设置代理。 你也可以使用 npm: $ npm config set proxy http://:@: $ npm config set https-proxy http ://:@: 参考:forum.freecodecamp.org/t/… 好的,谢谢,但是 ZAP 的代理详细信息是什么?我的意思是:据我了解,所有npm 流量都应该通过 ZAP 作为代理,对吗?另外:npm 仅用于运行 Node.js 的 Javascript 规范,但操作系统进程是 node 命令。

以上是关于在不使用 OpenAPI 或 Swagger 规范的情况下,使用 OWASP ZAP 对 API 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

OpenAPI-Swagger3-介绍使用

使用 Kong Enterprise 导入 OpenAPI/Swagger 规范

如何从 OpenAPI 3.0 生成 PDF 或标记?

Java - 如何直接从 openapi 3.0 规范生成 Swagger UI

如何从 protobuf (.proto) 文件中生成 (.json/.yaml) 中的 swagger3 (OpenAPI3) 规范?

从 OpenAPI 规范生成 JSDoc