3. 爬虫与探索策略

DAST 的扫描质量,首先取决于爬虫能否“看见”应用的真实攻击面。现代 Web 应用大量使用前后端分离、单页应用(SPA)、动态路由、Token 鉴权与异步 API,传统基于 <a href> 的静态爬虫往往只能抓到登录页和少量静态资源,导致后续漏洞检测覆盖率极低。因此,探索策略必须从“抓链接”升级为“理解应用状态与接口调用”。

一、认证爬取:先建立可复用的会话上下文

认证爬取的核心是让爬虫在已登录状态下遍历受保护页面。常见做法有三种:表单登录、Cookie/Token 注入、以及基于登录脚本的会话维持。以表单登录为例,需要明确登录 URL、用户名/密码字段名、提交方法、CSRF Token 字段以及登录成功判定条件。例如某系统登录接口为 POST /api/login,请求体为 {"username":"dast_user","password":"P@ssw0rd"},成功返回 {"code":0,"token":"eyJ..."},则爬虫需在后续请求头中自动附加 Authorization: Bearer <token>。

若应用使用 Cookie 会话,则需在登录后保存 Set-Cookie,并在后续请求中携带。对于多角色系统,建议为不同角色分别建立会话,因为普通用户与管理员可见的接口集合差异很大。认证爬取还要处理会话过期:当响应返回 401 或跳转到登录页时,应自动重新登录并继续遍历,否则扫描会在中途“掉线”。

二、JavaScript 渲染:让爬虫执行页面脚本

SPA 的页面内容由 JavaScript 动态生成,静态 HTML 中往往只有 <div id="app"></div>。此时需要引入无头浏览器(如 Chromium Headless)执行页面脚本,等待 DOM 稳定后再提取链接、表单和 XHR/Fetch 请求。关键参数包括:等待策略(networkidle 或固定延时)、超时时间、是否拦截图片/字体以加速、以及是否允许跨域请求。

实际配置中,可将爬虫的 render 模式设为 always,并设置 wait_until=networkidle0、timeout=15000ms。对于路由为 #/user/list 的 Hash 路由,无头浏览器能正常触发;但对于依赖点击才加载的懒加载模块,还需模拟点击“加载更多”或滚动到底部。渲染爬取会显著增加耗时,因此建议只对疑似 SPA 的路径启用,静态页面仍走快速 HTTP 抓取。

三、API 发现:从页面行为中提取接口

现代应用的攻击面大量集中在 API 上。API 发现有两种主要途径:一是从渲染后的页面中提取 XHR/Fetch 请求,记录 URL、方法、请求头、请求体和响应状态;二是通过代理录制真实用户操作流量,再从中归纳接口。前者适合自动化遍历,后者适合覆盖复杂业务流。

例如,在用户列表页点击“查询”时,浏览器发出 GET /api/v1/users?page=1&size=20&keyword=test,爬虫应将该请求登记为可测试接口,并保留参数结构。对于 POST /api/v1/users 这类写操作,需谨慎处理:默认只记录不重放,避免污染数据;若必须测试,应使用测试账号和可回滚数据。

四、OpenAPI/Swagger 导入:直接获得接口契约

如果应用暴露了 /swagger-ui.html、/v3/api-docs 或 /openapi.json,可直接导入规范文件,快速获得路径、方法、参数、请求体和响应定义。导入后,DAST 工具可据此生成请求模板,并针对每个参数进行注入测试。需要注意:规范文件可能滞后于实际实现,导入后仍应结合流量录制校验;同时要过滤掉 deprecated 接口和仅内部使用的路径。

五、流量录制回放与覆盖率评估

流量录制通过代理(如 MITM Proxy)捕获浏览器与服务器之间的完整请求响应,再回放给扫描器。回放时要处理动态参数:时间戳、随机数、CSRF Token、签名等。常见做法是用正则或 JSONPath 从响应中提取动态值,再注入到后续请求。覆盖率评估则用于判断爬取是否充分,常用指标包括:已发现 URL 数 / 应用实际路由数、已覆盖 API 数 / OpenAPI 定义接口数、以及参数覆盖率。若覆盖率低于 70%,应检查是否存在未登录、未渲染或未点击触发的路径。

现代Web应用探索策略:从入口到覆盖率评估 认证入口 表单登录 / Token / Cookie 静态抓取 HTML链接 / 表单 JS渲染爬取 Headless / networkidle OpenAPI/Swagger /v3/api-docs 导入 API发现(XHR/Fetch提取) 记录 URL / 方法 / 请求头 / 请求体 / 状态码 写操作默认只记录不重放,避免污染数据 流量录制回放(代理捕获) MITM Proxy 捕获完整请求响应 动态参数:时间戳 / CSRF / 签名 提取后注入 DAST 扫描引擎:参数注入 / 漏洞检测 基于接口契约与流量样本生成测试用例 覆盖率评估与补爬判断 URL覆盖率 = 已发现URL / 实际路由数  API覆盖率 = 已覆盖API / OpenAPI接口数 低于70% → 检查未登录 / 未渲染 / 未点击触发路径 补爬反馈

六、探索策略的工程化建议

在实际项目中,建议将上述能力组合使用:先通过 OpenAPI 导入获得基础接口清单,再用认证爬取和 JS 渲染覆盖页面路由,最后用流量录制补齐复杂业务流。每次扫描后输出覆盖率报告,记录已发现 URL、已测试接口、未覆盖原因(如需要特定角色、需要验证码、需要特定前置数据)。对于未覆盖项,可人工补充种子 URL 或录制脚本,形成“扫描—评估—补爬”的闭环。

若应用存在验证码、短信验证或设备指纹,自动化爬取会受阻。此时可考虑在测试环境关闭验证码,或使用固定测试账号与白名单 IP,避免因反爬机制导致覆盖率虚低。

最后需要强调:爬虫与探索策略不是一次性配置,而是随应用迭代持续调整的过程。前端路由、接口版本、鉴权方式一旦变化,原有爬取规则可能失效。建议将爬取配置纳入版本管理,并在每次 DAST 扫描前执行一次覆盖率基线对比,确保攻击面没有被遗漏。