在不使用 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
流量都应该通过 ZAP 作为代理,对吗?另外:npm
仅用于运行 Node.js 的 Javascript 规范,但操作系统进程是 node
命令。以上是关于在不使用 OpenAPI 或 Swagger 规范的情况下,使用 OWASP ZAP 对 API 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
使用 Kong Enterprise 导入 OpenAPI/Swagger 规范
Java - 如何直接从 openapi 3.0 规范生成 Swagger UI
如何从 protobuf (.proto) 文件中生成 (.json/.yaml) 中的 swagger3 (OpenAPI3) 规范?