You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在ZAP CLI(Docker zap-baseline/zap-full-scan)中配置登录认证以扫描需登录的Web应用

如何在ZAP CLI(Docker zap-baseline/zap-full-scan)中配置登录认证以扫描需登录的Web应用

我之前折腾过好多次ZAP的CLI扫描认证,最推荐用Automation Framework——不管是zap-baseline还是zap-full-scan的Docker镜像,都能无缝对接,而且能把「登录+扫描」的全流程完全自动化,比单独用Context Authentication或者Replacer更省心。下面我给你分场景拆解,再附上可直接复用的配置示例。

一、先选对方案:不同登录场景的适配

  • 表单登录(Web应用最常见):用Automation Framework的authentication模块模拟真实用户登录,能处理重定向、Session保持,比Token方式更贴近真实用户行为。
  • Bearer Token认证(API或前后端分离应用):用Replacer插件自动在请求头插入Token,配置更简洁。
  • 别纠结单独用Context Authentication——它是基础能力,但Automation Framework已经把Context和认证逻辑整合在一起了,一步到位更高效。

二、表单登录的完整配置示例(automation-config.yaml)

给你一个可直接修改的yaml模板,每个字段都加了注释,完美适配「目标URL跳转到登录页」的场景:

env:
  contexts:
    - name: "TargetAppContext"
      includeUrls:
        - "https://your-target-app.com/.*"  # 用正则覆盖目标域名下所有需要扫描的路径
      excludeUrls:
        - "https://your-target-app.com/logout"  # 排除登出接口,避免扫描中意外登出
      authentication:
        method: "formBasedAuthentication"
        parameters:
          formLoginUrl: "https://your-target-app.com/login"  # 登录页URL,ZAP会自动处理目标URL的重定向跳转
          loginRequestData: "username=${USERNAME}&password=${PASSWORD}"  # 登录请求的参数串,用环境变量存敏感信息
          usernameParam: "username"  # 要和登录表单里的input name完全一致,比如可能是email/account
          passwordParam: "password"  # 同理,注意表单里的密码参数名
          postLoginIndicator: "https://your-target-app.com/dashboard"  # 登录成功的判断标志:要么填跳转后的URL,要么填页面唯一文本(比如「欢迎回来」)
          isPost: true  # 登录请求是POST就设为true,GET则设为false
      users:
        - name: "TestAuthenticatedUser"
          credentials:
            username: "${USERNAME}"
            password: "${PASSWORD}"
  jobs:
    - type: "spider"
      parameters:
        context: "TargetAppContext"
        user: "TestAuthenticatedUser"  # 用配置好的认证用户执行爬虫
        maxDuration: 10  # 爬虫最长运行时长(分钟),可根据应用规模调整
    - type: "activeScan"
      parameters:
        context: "TargetAppContext"
        user: "TestAuthenticatedUser"  # 保持认证状态执行主动扫描
        maxDuration: 20  # 主动扫描最长运行时长(分钟)
    - type: "report"
      parameters:
        template: "traditional-html"
        reportFileName: "zap-scan-report.html"

三、用Docker运行扫描的命令

把上面的yaml保存为automation-config.yaml,然后用zap-full-scan镜像运行(zap-baseline同理,只是扫描强度更低、速度更快):

docker run -t \
  -v $(pwd)/automation-config.yaml:/zap/wrk/automation-config.yaml \
  -v $(pwd)/reports:/zap/wrk/reports \
  -e USERNAME=your-real-username \
  -e PASSWORD=your-real-password \
  owasp/zap2docker-stable zap-full-scan.py \
  -t https://your-target-app.com \
  -c /zap/wrk/automation-config.yaml \
  -r /zap/wrk/reports/zap-report.html

四、Bearer Token认证的简化配置

如果你的应用是用Bearer Token做认证(比如登录后从接口拿到Token),可以用Replacer插件自动在所有请求头插入Token,yaml配置更简洁:

env:
  contexts:
    - name: "TargetAppContext"
      includeUrls:
        - "https://your-target-app.com/.*"
  replacer:
    rules:
      - description: "Add Bearer Token to all requests"
        enabled: true
        matchType: "REQ_HEADER"
        matchString: "Authorization"
        replacement: "Bearer ${AUTH_TOKEN}"
  jobs:
    - type: "spider"
      parameters:
        context: "TargetAppContext"
        maxDuration: 10
    - type: "activeScan"
      parameters:
        context: "TargetAppContext"
        maxDuration: 20

运行时通过环境变量传入Token:

docker run -t \
  -v $(pwd)/automation-config.yaml:/zap/wrk/automation-config.yaml \
  -e AUTH_TOKEN=your-real-bearer-token \
  owasp/zap2docker-stable zap-full-scan.py \
  -t https://your-target-app.com \
  -c /zap/wrk/automation-config.yaml

五、踩过的坑:关键注意事项

  • 确认登录请求参数:一定要手动抓包看真实的登录请求,比如用户名参数可能是email而非username,填错的话ZAP肯定登录失败。
  • postLoginIndicator要准确:这是ZAP判断登录成功的核心,别用太泛的内容(比如「首页」),要么填登录成功后的唯一跳转URL,要么填页面独有的文本(比如「我的账户」)。
  • 敏感信息别硬编码:用环境变量传用户名、密码、Token,绝对别把敏感信息写死在yaml里,避免提交到代码仓库。
  • 测试认证是否生效:第一次运行可以加-v参数看ZAP的详细日志,找有没有Login successful for user: TestAuthenticatedUser的提示,确认认证成功后再跑完整扫描。
  • 排除登出接口:一定要把/logout这类URL加入excludeUrls,不然ZAP爬虫可能触发登出,导致后续扫描变回未认证状态。

我用这个方案扫过好几个内部系统,都能完美保持认证状态完成全量扫描。如果遇到特殊场景(比如需要处理验证码,一般内部测试环境可以关闭验证码),咱们再细化调整~

火山引擎 最新活动