为了完整覆盖,DAST 分析器必须对被测试的应用进行认证。这需要在 DAST CI/CD 任务中配置认证凭据和认证方法。

DAST 需要进行认证以:

  • 模拟现实世界中的攻击,并识别可能被攻击者利用的漏洞。
  • 测试用户特定功能和定制行为,这些功能和行为可能只有在认证之后才可见。

DAST 任务通过在浏览器中填写和提交登录表单来进行认证。提交表单后,DAST 任务确认认证是否成功。如果认证成功,DAST 任务继续并保存凭据以便在爬取目标应用时重复使用。如果不成功,DAST 任务停止。

DAST 支持的认证方法包括:

  • 单步骤登录表单
  • 多步骤登录表单
  • 对配置的目标 URL 之外的 URL 进行认证

选择认证凭据时:

  • 不要使用有效的生产系统、生产服务器凭据,或用于访问生产数据的凭据。
  • 不要对生产服务器运行认证扫描。认证扫描可能执行认证用户可以执行的任何功能,包括修改或删除数据、提交表单和跟随链接。只能在非生产系统或服务器上运行认证扫描。
  • 提供允许 DAST 测试整个应用的凭据。
  • 注意凭据的到期日期(如果有),以便将来参考。例如,使用密码管理工具如 1Password。

下图说明了在认证的不同阶段使用认证变量:

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: Authentication variables accDescr: A sequence diagram showing authentication variables at different stages of authentication. participant DAST participant Browser participant Target Note over DAST,Target: Initialization DAST->>Browser: Initialize browser with proxy DAST->>Browser: Navigate to DAST_AUTH_URL Browser->>Target: Load initial page Target-->>Browser: Return page content (may not contain login form) Note over DAST,Target: Process before-login actions DAST->>Browser: Click elements specified in DAST_AUTH_BEFORE_LOGIN_ACTIONS Browser->>Target: Send click actions Target-->>Browser: Render login form (modal/page) Note over DAST,Target: Authentication DAST->>Browser: Fill DAST_AUTH_USERNAME & DAST_AUTH_PASSWORD DAST->>Browser: Click "submit" Browser->>Target: Submit form Target-->>Browser: Process authentication Target-->>Browser: Set auth tokens Note over DAST,Target: Process after-login actions (if specified) DAST->>Browser: Execute DAST_AUTH_AFTER_LOGIN_ACTIONS Browser->>Target: Actions after login but before login verification Note over DAST,Target: Verification DAST->>Browser: Check URL matches DAST_AUTH_SUCCESS_IF_AT_URL (if configured) DAST->>Browser: Check element exists DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND (if configured) DAST->>Browser: Check login form absent DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM (default is true)

入门

{{< alert type=”note” >}}

您应该定期确认分析器的认证仍在工作,因为这往往会因应用的变化而中断。

{{< /alert >}}

要运行 DAST 认证扫描:

前提条件

  • 您拥有扫描期间希望认证的用户的用户名和密码。
  • 您已检查已知问题,确保 DAST 可以认证您的应用。
  • 如果您使用表单认证,您已满足前提条件。
  • 您已考虑如何验证认证是否成功。

表单认证

  • 您知道应用的登录表单的 URL。或者,您知道如何从认证 URL 转到登录表单(请参见点击转到登录表单)。
  • 您知道 DAST 用于输入相应值的用户名和密码 HTML 字段的选择器
  • 您知道选择登录表单时提交表单的元素的选择器

可用的 CI/CD 变量

有关 DAST 认证 CI/CD 变量的列表,请参见认证变量

DAST CI/CD 变量表由 Rake 任务 bundle exec rake gitlab:dast_variables:compile_docs 生成。它使用在 lib/gitlab/security/dast_variables.rb 中定义的变量元数据。

更新目标网站

目标网站使用 CI/CD 变量 DAST_TARGET_URL 定义,是 DAST 用于开始爬取您的应用的 URL。

对于认证扫描的最佳爬取结果,目标网站应是用户认证后才能访问的 URL。通常,这是用户登录后的页面的 URL。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com/dashboard/welcome"
    DAST_AUTH_URL: "https://example.com/login"

配置 HTTP 认证

要使用 HTTP 认证方案,例如基本认证,您可以将 DAST_AUTH_TYPE 值设置为 basic-digest。其他方案如 Negotiate 或 NTLM 可能有效,但由于当前缺乏自动化测试覆盖率,没有正式支持。

配置要求为 DAST 任务定义 CI/CD 变量 DAST_AUTH_TYPEDAST_AUTH_URLDAST_AUTH_USERNAMEDAST_AUTH_PASSWORD。如果您没有唯一的登录 URL,请将 DAST_AUTH_URL 设置为与 DAST_TARGET_URL 相同的 URL。

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_TYPE: "basic-digest"
    DAST_AUTH_URL: "https://example.com"

不要在 YAML 任务定义文件中定义 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD,因为这可能会带来安全风险。相反,使用极狐GitLab UI 将它们创建为掩码 CI/CD 变量。有关更多信息,请参见自定义 CI/CD 变量

配置单步骤登录表单

单步骤登录表单在单个页面上具有所有登录表单元素。 配置要求为 DAST 任务定义 CI/CD 变量 DAST_AUTH_URLDAST_AUTH_USERNAMEDAST_AUTH_USERNAME_FIELDDAST_AUTH_PASSWORDDAST_AUTH_PASSWORD_FIELDDAST_AUTH_SUBMIT_FIELD

您应该在任务定义 YAML 中设置字段的 URL 和选择器,例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_USERNAME_FIELD: "css:[name=username]"
    DAST_AUTH_PASSWORD_FIELD: "css:[name=password]"
    DAST_AUTH_SUBMIT_FIELD: "css:button[type=submit]"

不要在 YAML 任务定义文件中定义 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD,因为这可能会带来安全风险。相反,使用极狐GitLab UI 将它们创建为掩码 CI/CD 变量。有关更多信息,请参见自定义 CI/CD 变量

配置多步骤登录表单

多步骤登录表单有两个页面。第一页有一个包含用户名和下一个提交按钮的表单。 如果用户名有效,下一页的第二个表单将包含密码和表单提交按钮。

配置要求为 DAST 任务定义 CI/CD 变量:

  • DAST_AUTH_URL
  • DAST_AUTH_USERNAME
  • DAST_AUTH_USERNAME_FIELD
  • DAST_AUTH_FIRST_SUBMIT_FIELD
  • DAST_AUTH_PASSWORD
  • DAST_AUTH_PASSWORD_FIELD
  • DAST_AUTH_SUBMIT_FIELD

您应该在任务定义 YAML 中设置字段的 URL 和选择器,例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_USERNAME_FIELD: "css:[name=username]"
    DAST_AUTH_FIRST_SUBMIT_FIELD: "css:button[name=next]"
    DAST_AUTH_PASSWORD_FIELD: "css:[name=password]"
    DAST_AUTH_SUBMIT_FIELD: "css:button[type=submit]"

不要在 YAML 任务定义文件中定义 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD,因为这可能会带来安全风险。相反,使用极狐GitLab UI 将它们创建为掩码 CI/CD 变量。有关更多信息,请参见自定义 CI/CD 变量

配置单点登录 (SSO)

如果用户可以登录应用程序,那么在大多数情况下,DAST 也可以登录。 即使应用程序使用单点登录。使用 SSO 解决方案的应用程序应使用单步骤多步骤登录表单配置指南来配置 DAST 认证。

DAST 支持用户被重定向到外部身份提供者网站进行登录的认证过程。 检查 DAST 认证的已知问题,以确定您的 SSO 认证过程是否受支持。

配置 Windows 集成认证(Kerberos)

Windows 集成认证(Kerberos)是托管在 Windows 域内的业务线 (LOB) 应用程序的常见认证机制。它使用用户的计算机登录提供无提示认证。

要配置这种形式的认证,请执行以下步骤:

  1. 在 IT/运营团队的协助下收集必要信息。
  2. 在您的 .gitlab-ci.yml 文件中创建或更新 dast 任务定义。
  3. 使用收集的信息填充示例 krb5.conf 文件。
  4. 设置必要的任务变量。
  5. 使用项目设置页面设置必要的密钥变量。
  6. 测试并验证认证是否正常。

在 IT/运营部门的协助下收集以下信息:

  • Windows 域或 Kerberos 领域的名称(名称中必须有一个句点,如 EXAMPLE.COM
  • Windows/Kerberos 域控制器的主机名
  • 对于 Kerberos,认证服务器名称。对于 Windows 域,这是域控制器。

创建 krb5.conf 文件:

[libdefaults]
  # Realm 是域名的另一种称呼
  default_realm = EXAMPLE.COM
  # 这些设置对于 Windows 域是不需要的
  # 它们支持其他 Kerberos 实现
  kdc_timesync = 1
  ccache_type = 4
  forwardable = true
  proxiable = true
  rdns = false
  fcc-mit-ticketflags = true
[realms]
  EXAMPLE.COM = {
    # 域控制器或 KDC
    kdc = kdc.example.com
    # 域控制器或管理服务器
    admin_server = kdc.example.com
  }
[domain_realm]
  # 将 DNS 域映射到领域/Windows 域
  # 由 DAST_AUTH_NEGOTIATE_DELEGATION 提供的 DNS 域
  # 也应该在这里表示(但没有通配符)
  .example.com = EXAMPLE.COM
  example.com = EXAMPLE.COM

此配置使用 DAST_AUTH_NEGOTIATE_DELEGATION 变量。该变量设置以下 Chromium 策略,以允许集成认证:

  • AuthServerAllowlist
  • AuthNegotiateDelegateAllowlist

该变量的设置为与您的 Windows 域或 Kerberos 领域相关联的 DNS 域。 您应该提供:

  • 同时以小写和大写形式。
  • 使用通配符模式和域名。

对于我们的示例,Windows 域是 EXAMPLE.COM,DNS 域是 example.com。 这为 DAST_AUTH_NEGOTIATE_DELEGATION 提供了 *.example.com,example.com,*.EXAMPLE.COM,EXAMPLE.COM 的值。

将其全部汇集到任务定义中:

# 此任务将扩展 DAST 模板中定义的 dast 任务,该模板也必须包含。
dast:
  image:
    name: "$SECURE_ANALYZERS_PREFIX/dast:$DAST_VERSION$DAST_IMAGE_SUFFIX"
    docker:
      user: root
  variables:
    DAST_TARGET_URL: https://target.example.com
    DAST_AUTH_URL: https://target.example.com
    DAST_AUTH_TYPE: basic-digest
    DAST_AUTH_NEGOTIATE_DELEGATION: '*.example.com,example.com,*.EXAMPLE.COM,EXAMPLE.COM'
    # 未显示 -- DAST_AUTH_USERNAME、DAST_AUTH_PASSWORD 通过设置 -> CI -> 变量设置
  before_script:
    - KRB5_CONF='
[libdefaults]
  default_realm = EXAMPLE.COM
  kdc_timesync = 1
  ccache_type = 4
  forwardable = true
  proxiable = true
  rdns = false
  fcc-mit-ticketflags = true
[realms]
  EXAMPLE.COM = {
    kdc = ad1.example.com
    admin_server = ad1.example.com
  }
[domain_realm]
  .example.com = EXAMPLE.COM
  example.com = EXAMPLE.COM
'
    - cat "$KRB5_CONF" > /etc/krb5.conf
    - echo '$DAST_AUTH_PASSWORD' | kinit $DAST_AUTH_USERNAME
    - klist

预期输出:

任务控制台输出包含 before 脚本的输出。如果认证成功,它将类似于以下内容。如果认证不成功,任务应失败而不运行扫描。

Password for mike@EXAMPLE.COM:
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: mike@EXAMPLE.COM

Valid starting       Expires              Service principal
11/11/2024 21:50:50  11/12/2024 07:50:50  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        renew until 11/12/2024 21:50:50

DAST 扫描器还将输出以下内容,表明成功:

2024-11-08T17:03:09.226 INF AUTH  attempting to authenticate find_auth_fields="basic-digest"
2024-11-08T17:03:09.226 INF AUTH  loading login page LoginURL="https://target.example.com"
2024-11-08T17:03:10.619 INF AUTH  verifying if login attempt was successful true_when="HTTP status code < 400 and has authentication token and no login form found (auto-detected)"
2024-11-08T17:03:10.619 INF AUTH  requirement is satisfied, HTTP login request returned status code 200 want="HTTP status code < 400" url="https://target.example.com/"
2024-11-08T17:03:10.623 INF AUTH  requirement is satisfied, did not detect a login form want="no login form found (auto-detected)"
2024-11-08T17:03:10.623 INF AUTH  authentication token cookies names=""
2024-11-08T17:03:10.623 INF AUTH  authentication token storage events keys=""
2024-11-08T17:03:10.623 INF AUTH  requirement is satisfied, basic authentication detected want="has authentication token"
2024-11-08T17:03:11.230 INF AUTH  login attempt succeeded

点击转到登录表单

定义 DAST_AUTH_BEFORE_LOGIN_ACTIONS,提供从 DAST_AUTH_URL 开始点击元素的路径,以便 DAST 可以访问登录表单。此方法适用于在弹出窗口(模态窗口)中显示登录表单的应用程序或登录表单没有唯一 URL 时。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_BEFORE_LOGIN_ACTIONS: "css:.navigation-menu,css:.login-menu-item"

排除注销 URL

如果 DAST 在运行认证扫描时爬取了注销 URL,用户将被注销,导致扫描的剩余部分未认证。因此建议使用 CI/CD 变量 DAST_SCOPE_EXCLUDE_URLS 排除注销 URL。DAST 不会访问任何排除的 URL,确保用户保持登录状态。

提供的 URL 可以是绝对 URL,也可以是相对于 DAST_TARGET_URL 的基路径的 URL 路径的正则表达式。例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com/welcome/home"
    DAST_SCOPE_EXCLUDE_URLS: "https://example.com/logout,/user/.*/logout"

找到元素的选择器

选择器由 CI/CD 变量使用,用于指定在浏览器页面上显示的元素的位置。 选择器的格式为 type:search string。DAST 根据类型使用搜索字符串搜索选择器。

选择器类型 示例 描述
css css:.password-field 搜索具有提供的 CSS 选择器的 HTML 元素。选择器应该尽可能具体,以提高性能。
id id:element 搜索具有提供的元素 ID 的 HTML 元素。
name name:element 搜索具有提供的元素名称的 HTML 元素。
xpath xpath://input[@id="my-button"]/a 搜索具有提供的 XPath 的 HTML 元素。XPath 搜索预计比其他搜索性能较差。

选择正确的选择器

明智地选择选择器可以导致扫描在应用程序发生变化时具有弹性。

您应该按以下顺序选择选择器:

  • id 字段。这些字段通常在页面上是唯一的,并且很少更改。
  • name 字段。这些字段通常在页面上是唯一的,并且很少更改。
  • 特定于字段的 class 值,例如选择器 "css:.username" 用于用户名字段上的 username 类。
  • 字段特定数据属性的存在,例如选择器,"css:[data-username]"data-username 字段在用户名字段上具有任何值时。
  • 多个 class 层次结构值,例如选择器 "css:.login-form .username" 当有多个元素具有类 username 但只有一个嵌套在类 login-form 的元素内时。

使用选择器定位特定字段时,应避免搜索:

  • 任何动态生成的 idnameattributeclassvalue
  • 通用类名,如 column-10dark-grey
  • XPath 搜索,因为它们比其他选择器搜索性能较差。
  • 非限定搜索,例如以 css:*xpath://* 开头的搜索。

验证认证是否成功

DAST 提交登录表单后,进行验证过程 以确定认证是否成功。如果认证不成功,扫描将因错误而停止。

登录表单提交后,认证被认为不成功,当:

  • 登录提交 HTTP 响应具有 400500 系列状态代码。
  • 任何验证检查失败。
  • 在认证过程中没有设置具有足够随机值的认证令牌

验证检查

验证检查在认证完成后运行检查浏览器的状态 进一步确定认证是否成功。

如果未配置验证检查,DAST 会测试登录表单的缺失。

基于 URL 验证

定义 DAST_AUTH_SUCCESS_IF_AT_URL 作为登录表单成功提交后显示在浏览器标签中的 URL。

DAST 将验证 URL 与认证后的浏览器中的 URL 进行比较。 如果它们不相同,则认证不成功。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_AT_URL: "https://example.com/user/welcome"

基于元素存在验证

定义 DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 作为一个选择器,用于查找登录表单成功提交后显示的页面上的一个或多个元素。如果没有找到元素,则认证不成功。 在登录失败时显示的页面上搜索选择器应返回没有元素。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND: "css:.welcome-user"

基于登录表单缺失验证

定义 DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM"true",以指示 DAST 应在登录表单成功提交后显示的页面上搜索登录表单。如果登录后仍然存在登录表单,则认证不成功。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM: "true"

认证令牌

DAST 记录在认证过程中设置的认证令牌。认证令牌在 DAST 打开新浏览器时加载到新浏览器中,以便用户在整个扫描过程中保持登录状态。

为了记录令牌,DAST 在认证过程之前对应用设置的 cookies、本地存储和会话存储值进行快照。DAST 在认证后执行相同操作,并使用差异来确定哪些是由认证过程创建的。

DAST 将用足够“随机”值设置的 cookies、本地存储和会话存储值视为认证令牌。例如,sessionID=HVxzpS8GzMlPAc2e39uyIVzwACIuGe0H 将被视为认证令牌,而 ab_testing_group=A1 则不会。

CI/CD 变量 DAST_AUTH_COOKIE_NAMES 可用于指定认证 cookies 的名称,并绕过 DAST 使用的随机性检查。这不仅可以使认证过程更加稳健,还可以提高检查认证令牌的准确性。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_COOKIE_NAMES: "sessionID,refreshToken"

已知问题

  • 如果认证流程包括 CAPTCHA,DAST 无法绕过。请在被扫描的应用的测试环境中关闭这些功能。
  • DAST 无法处理使用 SMS、生物识别或认证应用进行的一次性密码 (OTP) 等多因素认证。请在被扫描的应用的测试环境中关闭这些功能。
  • DAST 无法认证在登录期间不设置认证令牌的应用。
  • DAST 无法认证需要填写超过两个输入的应用。必须提供两个输入,用户名和密码。

故障排除

日志提供了关于 DAST 在认证过程中正在做什么以及期望什么的见解。对于更详细的信息,请配置认证报告

有关特定错误消息或情况的更多信息,请参见已知问题

使用基于浏览器的分析器来认证用户。有关高级故障排除,请参见基于浏览器的故障排除

阅读日志

DAST CI/CD 任务的控制台输出使用 AUTH 日志模块显示有关认证过程的信息。 例如,以下日志显示了多步骤登录表单的认证失败。 认证失败是因为登录后应该显示主页。相反,登录表单仍然存在。

2022-11-16T13:43:02.000 INF AUTH  attempting to authenticate
2022-11-16T13:43:02.000 INF AUTH  loading login page LoginURL=https://example.com/login
2022-11-16T13:43:10.000 INF AUTH  multi-step authentication detected
2022-11-16T13:43:15.000 INF AUTH  verifying if user submit was successful true_when="HTTP status code < 400"
2022-11-16T13:43:15.000 INF AUTH  requirement is satisfied, no login HTTP message detected want="HTTP status code < 400"
2022-11-16T13:43:20.000 INF AUTH  verifying if login attempt was successful true_when="HTTP status code < 400 and has authentication token and no login form found (no element found when searching using selector css:[id=email] or css:[id=password] or css:[id=submit])"
2022-11-24T14:43:20.000 INF AUTH  requirement is satisfied, HTTP login request returned status code 200 url=https://example.com/user/login?error=invalid%20credentials want="HTTP status code < 400"
2022-11-16T13:43:21.000 INF AUTH  requirement is unsatisfied, login form was found want="no login form found (no element found when searching using selector css:[id=email] or css:[id=password] or css:[id=submit])"
2022-11-16T13:43:21.000 INF AUTH  login attempt failed error="authentication failed: failed to authenticate user"

配置认证报告

{{< alert type=”warning” >}}

认证报告可能包含敏感信息,例如用于登录的凭据。

{{< /alert >}}

认证报告可以保存为 CI/CD 任务产物,以帮助理解认证失败的原因。

该报告包含在登录过程中执行的步骤、HTTP 请求和响应、文档对象模型 (DOM) 和屏幕截图。

dast-auth-report

一个导出认证调试报告的示例配置可能如下所示:

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_REPORT: "true"

已知问题

未找到登录表单

DAST 在加载登录页面时未能找到登录表单,通常是因为无法加载认证 URL。 日志报告了一个致命错误,例如:

2022-12-07T12:44:02.838 INF AUTH  loading login page LoginURL=[authentication URL]
2022-12-07T12:44:11.119 FTL MAIN  authentication failed: login form not found

建议的操作:

  • 生成认证报告以检查 HTTP 响应。
  • 检查目标应用认证是否已部署并正在运行。
  • 检查 DAST_AUTH_URL 是否正确。
  • 检查极狐GitLab runner 是否可以访问 DAST_AUTH_URL
  • 如果使用,请检查 DAST_AUTH_BEFORE_LOGIN_ACTIONS 是否有效。

扫描未爬取认证页面

如果 DAST 在认证过程中捕获了错误的认证令牌,则扫描无法爬取认证页面。cookies 和存储认证令牌的名称将写入日志。例如:

2022-11-24T14:42:31.492 INF AUTH  authentication token cookies names=["sessionID"]
2022-11-24T14:42:31.492 INF AUTH  authentication token storage events keys=["token"]

建议的操作:

  • 生成认证报告,并查看 Login submit 的屏幕截图,以验证登录是否按预期工作。
  • 验证日志中的认证令牌是否是您的应用使用的令牌。
  • 如果使用 cookies 存储认证令牌,请使用 DAST_AUTH_COOKIE_NAMES 设置认证令牌 cookies 的名称。

无法找到具有选择器的元素

DAST 未能找到用户名、密码、第一次提交按钮或提交按钮元素。日志报告了一个致命错误,例如:

2022-12-07T13:14:11.545 FTL MAIN  authentication failed: unable to find elements with selector: css:#username

建议的操作:

  • 生成认证报告,使用 Login page 的屏幕截图以验证页面是否正确加载。
  • 在浏览器中加载登录页面,并验证 DAST_AUTH_USERNAME_FIELDDAST_AUTH_PASSWORD_FIELDDAST_AUTH_FIRST_SUBMIT_FIELDDAST_AUTH_SUBMIT_FIELD 中配置的选择器是否正确。

认证用户失败

DAST 由于登录验证检查失败而未能认证。日志报告了一个致命错误,例如:

2022-12-07T06:39:49.483 INF AUTH  verifying if login attempt was successful true_when="HTTP status code < 400 and has authentication token and no login form found (no element found when searching using selector css:[name=username] or css:[name=password] or css:button[type=\"submit\"])"
2022-12-07T06:39:49.484 INF AUTH  requirement is satisfied, HTTP login request returned status code 303 url=http://auth-manual:8090/login want="HTTP status code < 400"
2022-12-07T06:39:49.513 INF AUTH  requirement is unsatisfied, login form was found want="no login form found (no element found when searching using selector css:[name=username] or css:[name=password] or css:button[type=\"submit\"])"
2022-12-07T06:39:49.589 INF AUTH  login attempt failed error="authentication failed: failed to authenticate user"
2022-12-07T06:39:53.626 FTL MAIN  authentication failed: failed to authenticate user

建议的操作:

  • 查看日志中的 requirement is unsatisfied。响应适当的错误。

要求不满足,发现了登录表单

应用程序通常在用户登录时显示仪表板,并在用户名或密码错误时显示登录表单和错误消息。

当 DAST 在认证用户后显示的页面上检测到登录表单时,会发生此错误,表明登录尝试失败。

2022-12-07T06:39:49.513 INF AUTH  requirement is unsatisfied, login form was found want="no login form found (no element found when searching using selector css:[name=username] or css:[name=password] or css:button[type=\"submit\"])"

建议的操作:

  • 验证使用的用户名和密码/认证凭据是否正确。
  • 生成认证报告,并验证 Login submitRequest 是否正确。
  • 登录提交请求和响应可能为空。这发生在没有请求导致 页面完全重新加载时,例如提交 HTML 表单时的请求。这在使用 websockets 或 AJAX 提交登录表单时发生。
  • 如果在用户认证后显示的页面确实具有与登录表单选择器匹配的元素,请配置 DAST_AUTH_SUCCESS_IF_AT_URLDAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 以使用替代方法验证登录尝试。

要求不满足,选择器未返回结果

DAST 无法在用户登录后显示的页面上找到与 DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 中提供的选择器匹配的元素。

2022-12-07T06:39:33.239 INF AUTH  requirement is unsatisfied, searching DOM using selector returned no results want="has element css:[name=welcome]"

建议的操作:

  • 生成认证报告,并查看 Login submit 的屏幕截图,以验证显示的页面是否正确。
  • 确保 DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 选择器正确。

要求不满足,浏览器未在 URL

DAST 检测到用户登录后显示的页面的 URL 与 DAST_AUTH_SUCCESS_IF_AT_URL 预期的不同。

2022-12-07T11:28:00.241 INF AUTH  requirement is unsatisfied, browser is not at URL browser_url="https://example.com/home" want="is at url https://example.com/user/dashboard"

建议的操作:

  • 生成认证报告,并查看 Login submit 的屏幕截图,以验证显示的页面是否正确。
  • 确保 DAST_AUTH_SUCCESS_IF_AT_URL 正确。

要求不满足,HTTP 登录请求状态码

加载登录表单或提交表单时的 HTTP 响应具有 400(客户端错误)或 500(服务器错误)状态码。

2022-12-07T06:39:53.626 INF AUTH  requirement is unsatisfied, HTTP login request returned status code 502 url="https://example.com/user/login" want="HTTP status code < 400"
  • 验证使用的用户名和密码/认证凭据是否正确。
  • 生成认证报告,并验证 Login submitRequest 是否正确。
  • 验证目标应用是否按预期工作。

要求不满足,没有认证令牌

DAST 无法检测到在认证过程中创建的认证令牌

2022-12-07T11:25:29.010 INF AUTH  authentication token cookies names=[]
2022-12-07T11:25:29.010 INF AUTH  authentication token storage events keys=[]
2022-12-07T11:25:29.010 INF AUTH  requirement is unsatisfied, no basic authentication, cookie or storage event authentication token detected want="has authentication token"

建议的操作:

  • 生成认证报告,并查看 Login submit 的屏幕截图,以验证登录是否按预期工作。
  • 使用浏览器的开发者工具,调查登录时创建的 cookies 和本地/会话存储对象。确保有一个具有足够随机值的认证令牌。
  • 如果使用 cookies 存储认证令牌,请使用 DAST_AUTH_COOKIE_NAMES 设置认证令牌 cookies 的名称。