【问题标题】:Authenticate to an API with OWASP ZAP without using OpenAPI or Swagger specs在不使用 OpenAPI 或 Swagger 规范的情况下,使用 OWASP ZAP 对 API 进行身份验证
【发布时间】: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 上下文)并单击“主动扫描”。

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

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

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

编辑 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\/.*(与我的主机,而不是“示例”)添加到:

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

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

【问题讨论】:

    标签: authentication jwt owasp zap


    【解决方案1】:

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

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

    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 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2021-01-28
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多