无法通过ZAP Proxy针对指定上下文启动主动扫描(ascan)的问题
我之前也遇到过类似的坑,ZAP的API文档描述有时候不够细致,当你想扫描整个上下文的所有已记录URL时,用/JSON/ascan/action/scan/端点确实容易出问题,推荐你改用专门的上下文扫描API,同时检查几个关键配置:
问题根源
你使用的/JSON/ascan/action/scan/主要是为单URL或URL递归扫描设计的,虽然文档说明contextId可选,但实际调用时如果只传contextId而留空url,ZAP会判定参数缺失(正如你看到的日志)。更贴合你需求的是ZAP提供的scanContext端点——它就是专门用来扫描指定上下文内所有已发现URL的。
解决方案步骤
1. 先确认上下文已捕获到URL
在启动扫描前,先验证你的上下文(ID=2)已经通过步骤6的UI测试记录了目标URL,调用以下API检查:
/JSON/core/view/urls/?apikey=12345&contextId=2
如果返回的urls数组是空的,说明UI测试的流量没有经过ZAP代理,或者ZAP没有正确记录请求,需要先解决这个问题(确保测试时代理配置正确,ZAP能捕获到目标站点的请求)。
2. 使用scanContext API启动主动扫描
替换原来的步骤7,调用这个专门的上下文扫描端点:
/JSON/ascan/action/scanContext/?apikey=12345&contextId=2&scanPolicyName=
scanPolicyName可以留空,使用ZAP的默认扫描策略;如果你有自定义的扫描策略,填上策略名称即可。- 这个API会返回一个
scanId,你可以用它来跟踪扫描状态(和你原来步骤8的用法完全一致)。
3. 验证扫描状态并获取告警
扫描启动后,用返回的scanId调用状态接口:
/JSON/ascan/view/status/?apikey=12345&scanId=XXX
当返回的status值为100时,表示扫描完成,之后就可以调用告警接口获取结果:
/JSON/alert/view/alerts/?apikey=12345&baseurl=&start=&count=&riskId=
额外提示
如果你坚持要用原来的scan API,也可以调整参数,把url设为目标站点的根URL,并开启inScopeOnly=true,示例如下:
/JSON/ascan/action/scan/?apikey=12345&url=https://myowsapjuiceshop.herokuapp.com/&recurse=true&inScopeOnly=true&contextId=2
这种方式也会扫描上下文内的所有URL,但相比scanContext,它更偏向于从根URL开始递归扫描,而scanContext是直接扫描ZAP已记录的所有上下文内URL,效率更高。
内容的提问来源于stack exchange,提问作者Dileep17

