自定义分析器设置
管理扫描范围
范围控制 DAST 在爬取目标应用时遵循的 URL。合理管理范围可以最小化扫描运行时间,同时确保只检查目标应用是否存在漏洞。
范围类型
有三种范围类型:
- in scope(范围内)
- out of scope(范围外)
- excluded from scope(排除在范围外)
范围内
DAST 会遵循范围内的 URL,并在 DOM 中搜索要执行的后续操作以继续爬取。 记录的范围内 HTTP 消息会被被动检查漏洞,并在运行完整扫描时用于构建攻击。
范围外
DAST 会遵循范围外的 URL,但这些 URL 仅针对非文档内容类型,如图片、样式表、字体、脚本或 AJAX 请求。 身份验证 除外,DAST 不会在完整页面加载时遵循范围外的 URL,例如点击外部网站链接时。 除了搜索信息泄露的被动检查外,范围外 URL 的记录 HTTP 消息不会被检查漏洞。
排除在范围外
DAST 不会遵循排除在范围外的 URL。除了搜索信息泄露的被动检查外,排除在范围外的 URL 的记录 HTTP 消息不会被检查漏洞。
身份验证期间的范围行为不同
许多目标应用的身份验证过程依赖于外部网站,例如在使用身份访问管理提供商进行单点登录(SSO)时。 为确保 DAST 能够与这些提供商进行身份验证,DAST 在身份验证期间会遵循范围外的 URL 进行完整页面加载。DAST 不会遵循排除在范围外的 URL。
DAST 如何阻止 HTTP 请求
当因范围规则而阻止请求时,DAST 会指示浏览器像往常一样发出 HTTP 请求。随后该请求会被拦截并以 BlockedByClient 原因拒绝。
这种方法允许 DAST 记录 HTTP 请求,同时确保它永远不会到达目标服务器。诸如 200.1 之类的被动检查使用这些记录的请求来验证发送到外部主机的信息。
如何配置范围
默认情况下,与目标应用主机匹配的 URL 被视为范围内。所有其他主机被视为范围外。
范围使用以下变量进行配置:
- 使用
DAST_SCOPE_ALLOW_HOSTS添加范围内的主机。 - 使用
DAST_SCOPE_IGNORE_HOSTS添加到范围外的主机。 - 使用
DAST_SCOPE_EXCLUDE_HOSTS添加到排除在范围外的主机。 - 使用
DAST_SCOPE_EXCLUDE_URLS设置要排除在范围外的特定 URL。
规则:
- 排除主机优先于忽略主机,忽略主机优先于允许主机。
- 为主机配置范围不会为其子域配置范围。
- 为主机配置范围不会为其所有端口配置范围。
以下是一个典型配置示例:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_TARGET_URL: "https://my.site.com" # 默认情况下 my.site.com 的 URL 被视为范围内
DAST_SCOPE_ALLOW_HOSTS: "api.site.com:8443" # 将 API 作为扫描的一部分包含
DAST_SCOPE_IGNORE_HOSTS: "analytics.site.com" # 明确忽略分析数据的扫描
DAST_SCOPE_EXCLUDE_HOSTS: "ads.site.com" # 不访问广告子域的任何 URL
DAST_SCOPE_EXCLUDE_URLS: "https://my.site.com/user/logout" # 不访问此 URL漏洞检测
DAST 通过我们全面的基于浏览器的漏洞检查来检测漏洞。这些检查在扫描期间识别您 Web 应用中的安全问题。
爬虫在浏览器中运行目标网站,并将 DAST 配置为代理服务器。这确保了浏览器的所有请求和响应都被 DAST 被动扫描。当运行完整扫描时,DAST 执行的主动漏洞检查不使用浏览器。漏洞检查方式的这种差异可能导致问题,需要禁用目标网站的某些功能以确保扫描按预期工作。
例如,对于包含带有 Anti-CSRF 令牌表单的目标网站,被动扫描能按预期工作,因为浏览器会像用户查看页面一样显示页面和表单。但是,在完整扫描中运行的主动漏洞检查无法提交包含 Anti-CSRF 令牌的表单。在这种情况下,我们建议在运行完整扫描时禁用 Anti-CSRF 令牌。
管理扫描时间
与标准的 GitLab DAST 解决方案相比,运行基于浏览器的爬虫预计会为许多 Web 应用提供更好的覆盖率。 但这可能以增加扫描时间为代价。
您可以使用以下措施来管理覆盖率和扫描时间之间的权衡:
- 垂直扩展运行器,并使用 变量
DAST_CRAWL_WORKER_COUNT使用更多浏览器。默认值动态设置为可用逻辑 CPU 的数量。 - 使用 变量
DAST_CRAWL_MAX_ACTIONS限制浏览器执行的操作数量。默认值为10,000。 - 使用 变量
DAST_CRAWL_MAX_DEPTH限制基于浏览器的爬虫检查覆盖率的页面深度。爬虫使用广度优先搜索策略,因此深度较小的页面会先被爬取。默认值为10。 - 使用 变量
DAST_CRAWL_TIMEOUT限制爬取目标应用的时间。默认值为24h。当爬虫超时时,扫描会继续进行被动和主动检查。 - 使用 变量
DAST_CRAWL_GRAPH构建爬取图,以查看正在爬取的页面。 - 使用 变量
DAST_SCOPE_EXCLUDE_URLS防止页面被爬取。 - 使用 变量
DAST_SCOPE_EXCLUDE_ELEMENTS防止元素被选中。请谨慎使用,因为定义此变量会导致每个爬取的页面进行额外查找。 - 如果目标应用渲染速度极快或渲染时间很短,考虑减小 变量
DAST_PAGE_DOM_STABLE_WAIT的值。默认值为500ms。
超时设置
由于网络状况不佳或应用负载过重,默认的超时设置可能不适用于您的应用。
基于浏览器的扫描提供了调整各种超时的能力,以确保在从一个页面过渡到下一个页面时能顺利进行。这些值使用持续时间字符串进行配置,允许您使用前缀配置持续时间:m 表示分钟,s 表示秒,ms 表示毫秒。
导航(即加载新页面)通常需要最多时间,因为它们正在加载多个新资源,如 JavaScript 或 CSS 文件。根据这些资源的大小或返回速度,默认的 DAST_PAGE_READY_AFTER_NAVIGATION_TIMEOUT 可能不够用。
稳定性超时,如可通过 DAST_PAGE_DOM_READY_TIMEOUT 或 DAST_PAGE_READY_AFTER_ACTION_TIMEOUT 配置的超时,也可以进行配置。稳定性超时确定基于浏览器的扫描何时认为页面已完全加载。基于浏览器的扫描在以下情况下认为页面已加载:
-
DOMContentLoaded 事件已触发。
-
没有打开或重要的待处理请求,如 JavaScript 和 CSS。媒体文件通常被认为不重要。
-
根据浏览器是否执行了导航、强制转换或操作:
- 在
DAST_PAGE_DOM_READY_TIMEOUT或DAST_PAGE_READY_AFTER_ACTION_TIMEOUT持续时间后,没有新的文档对象模型(DOM)修改事件。
- 在
在这些事件发生后,基于浏览器的扫描认为页面已加载并准备就绪,尝试执行下一个操作。
如果您的应用出现延迟或返回许多导航失败,请考虑调整超时值,如下例所示:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_TARGET_URL: "https://my.site.com"
DAST_PAGE_READY_AFTER_NAVIGATION_TIMEOUT: "45s"
DAST_PAGE_READY_AFTER_ACTION_TIMEOUT: "15s"
DAST_PAGE_DOM_READY_TIMEOUT: "15s"调整这些值可能会影响扫描时间,因为它们调整了每个浏览器等待各种活动完成的时间。
页面就绪超时
页面就绪指的是页面已完全加载、DOM 已稳定且交互元素可用的状态。正确的页面就绪检测对于以下方面至关重要:
- 扫描准确性:在页面完全加载前进行分析可能会遗漏内容或产生假阴性结果。
- 爬取效率:等待时间过长会浪费扫描时间,而等待不足则可能错过动态内容。
- 现代 Web 应用支持:单页应用、AJAX 密集型站点和渐进式加载模式需要复杂的就绪检测。
通过使用一系列可选的可配置超时,DAST 扫描器可以检测页面的不同部分何时已完全加载。
超时变量
使用以下 CI/CD 变量来自定义 DAST 页面就绪超时。 完整列表请参见可用的 CI/CD 变量。
| 超时变量 | 默认值 | 描述 |
|---|---|---|
DAST_PAGE_READY_AFTER_NAVIGATION_TIMEOUT |
15s |
等待浏览器从一个页面导航到另一个页面的最长时间。在完整页面加载的文档加载阶段使用。 |
DAST_PAGE_READY_AFTER_ACTION_TIMEOUT |
7s |
等待浏览器认为页面已加载并准备好进行分析的最长时间。作为不触发完整页面加载的页面内操作的替代方案使用。 |
DAST_PAGE_DOM_STABLE_WAIT |
500ms |
定义在检查页面稳定之前等待 DOM 更新的时间。在客户端渲染阶段开始时使用。 |
DAST_PAGE_DOM_READY_TIMEOUT |
6s |
导航完成后,等待浏览器认为页面已加载并准备好进行分析的最长时间。控制后台数据获取和 DOM 渲染的等待时间。 |
DAST_PAGE_IS_LOADING_ELEMENT |
无 | 选择器,当在页面上不再可见时,向分析器指示页面已加载完成,扫描可以继续。标记客户端渲染过程的结束。 |
页面加载工作流
现代 Web 应用分多个阶段加载。DAST 扫描器为流程中的每个步骤设置了特定的超时:
-
文档加载:浏览器获取并处理基本页面结构。
- 从服务器获取 HTML 内容。
- 加载引用的 CSS 和 JavaScript 文件。
- 解析内容并渲染初始页面。
- 触发标准的"document ready"事件。
此阶段使用
DAST_PAGE_READY_AFTER_NAVIGATION_TIMEOUT(用于完整页面加载)或DAST_PAGE_READY_AFTER_ACTION_TIMEOUT(用于页面内操作),设置文档加载的最大等待时间。 -
客户端渲染:初始加载后,许多单页应用:
- 执行初始 JavaScript 执行(
DAST_PAGE_DOM_STABLE_WAIT)。 - 使用 AJAX 或其他 API 调用获取后台数据。
- 渲染 DOM 并根据获取的数据进行更新(
DAST_PAGE_DOM_READY_TIMEOUT)。 - 显示页面加载指示器(
DAST_PAGE_IS_LOADING_ELEMENT)。
扫描器监控这些活动以确定页面何时准备好进行交互。
- 执行初始 JavaScript 执行(
以下图表说明了爬取页面时使用的序列超时:
%%{init: {
"gantt": {
"leftPadding": 250,
"sectionFontSize": 15,
"topPadding": 40,
"fontFamily": "GitLab Sans"
}
}}%%
gantt
dateFormat YYYY-MM-DD
axisFormat
section 文档加载
DAST_PAGE_READY_AFTER_NAVIGATION_TIMEOUT :done, nav1, 2024-01-01, 6d
获取 HTML :active, nav1, 2024-01-01, 3d
获取 CSS&JS :active, nav1, 2024-01-04, 3d
文档就绪 :milestone, nav1, 2024-01-07, 0d
section 加载数据 / 客户端渲染
DAST_PAGE_DOM_STABLE_WAIT :done, dom1, 2024-01-07, 3d
初始 JS 执行 :active, dom1, 2024-01-07, 3d
DAST_PAGE_DOM_READY_TIMEOUT :done, ready1, 2024-01-10, 4d
获取数据 :active, dom1, 2024-01-10, 2d
渲染 DOM :active, dom1, 2024-01-10, 2d
DAST_PAGE_IS_LOADING_ELEMENT :milestone, load1, 2024-01-14, 0d