Owasp ZAP的request hooks使用:特定请求触发自定义动作的实现方法
OWASP ZAP自定义请求钩子实现方案
完全可以实现该需求,ZAP没有直接命名为request hooks的配置项,但可以通过内置的HTTP监听器脚本能力,完成特定请求触发自定义动作的逻辑,docker环境也支持无需二次打包镜像的配置方式。
核心实现逻辑
ZAP的HTTP监听器脚本支持两个触发节点:请求发送前、响应返回后,你可以选择请求发送完成后的触发节点,匹配登录/登出请求规则后,调用ZAP内置的HTTP客户端向指定端点发送POST请求即可。
具体操作步骤
- 第一步:编写自定义监听器脚本
支持JavaScript、Python等多种脚本语言,以下是JavaScript示例,可直接修改使用:// 脚本类型选择「HTTP监听器」,触发时机选择请求发送后 function sendingRequest(msg, initiator, helper) { // 无需处理请求发送前逻辑,此处留空即可 } function responseReceived(msg, initiator, helper) { // 获取当前请求的完整URL const reqUrl = msg.getRequestHeader().getURI().toString(); // 替换为你实际的登录/登出接口匹配规则 if (reqUrl.includes("/api/user/login") || reqUrl.includes("/api/user/logout")) { // 构造POST请求参数 const targetEndpoint = "http://你的指定端点地址"; const postBody = JSON.stringify({ event: reqUrl.includes("login") ? "login_request" : "logout_request", request_id: msg.getRequestHeader().getHeader("X-Request-ID") || "", timestamp: Date.now() }); // 调用ZAP内置HTTP客户端发送请求 const httpSender = org.parosproxy.paros.network.HttpSender.newInstance( org.parosproxy.paros.control.Control.getSingleton() .getExtensionLoader() .getExtension("ExtensionNetwork") .getHttpSenderConfig() ); const requestHeader = new org.parosproxy.paros.network.HttpRequestHeader( "POST", new java.net.URI(targetEndpoint), "HTTP/1.1" ); requestHeader.setHeader("Content-Type", "application/json"); // 可自行添加鉴权头,比如Authorization等 const httpMessage = new org.parosproxy.paros.network.HttpMessage( requestHeader, postBody.getBytes() ); httpSender.sendAndReceive(httpMessage, true); } } - 第二步:Docker环境挂载脚本启动
不需要修改ZAP镜像,直接将本地编写的脚本挂载到容器的自动加载目录即可:- 把上面的脚本保存为本地文件
auth-monitor.js - 启动容器时添加挂载参数,同时指定脚本加载配置:
如果你有多个自定义脚本,也可以把所有脚本放到本地的docker run -t \ -v $(pwd)/auth-monitor.js:/home/zap/.ZAP_D/scripts/scripts/http/auth-monitor.js \ owasp/zap2docker-stable \ zap.sh -daemon \ -script /home/zap/.ZAP_D/scripts/scripts/http/auth-monitor.js \ -scriptparams "type=httplistener,enabled=true"zap-scripts目录,统一挂载到/home/zap/.ZAP_D/scripts/scripts/路径下,ZAP启动时会自动扫描加载所有合法脚本。 - 把上面的脚本保存为本地文件
注意事项
- 如果你指定的POST端点是宿主机本地服务,需要注意docker容器的网络配置,保证容器内可以正常访问到端点地址
- 匹配登录/登出请求的规则尽量精准,可同时添加请求方法、请求参数等匹配条件,避免误触发
- 发送POST请求如果需要加签名、鉴权等逻辑,直接在脚本里构造请求头和请求体时自行添加即可
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

