ZAP代理PHP站点只需配置浏览器指向其默认代理端口127.0.0.1:8080,确保Proxy运行正常;CSRF检测需人工验证token存在性、校验逻辑及可复用性,ZAP主动扫描效果有限;抓不到token常因JS动态生成,需启用Headless Browser或分析XHR接口。

ZAP 怎么代理转发 PHP 站点的请求
ZAP 本身不区分后端语言,它只抓 HTTP 流量;只要 PHP 站能被你本地浏览器访问,ZAP 就能代理它。关键不是“PHP 特殊配置”,而是确保浏览器流量真走 ZAP 的代理端口(默认 127.0.0.1:8080)。
实操要点:
- 启动 ZAP 后,在
Tools → Options → Local Proxy确认监听地址和端口(别改成本机外网 IP,否则可能被防火墙拦截) - 浏览器手动设置代理:HTTP/HTTPS 都指向
127.0.0.1:8080;Chrome 推荐用SwitchyOmega插件快速切换,避免全局污染 - 访问目标 PHP 站前,先在 ZAP 的
Quick Start标签页点Automated Scan或手动输入 URL 进Manual Explore,否则 ZAP 不会主动记录请求 - 如果页面加载失败,检查 ZAP 右下角状态栏是否显示
Proxy is running,以及浏览器是否报ERR_PROXY_CONNECTION_FAILED—— 多半是端口被占用或代理没开
怎么确认 PHP 页面存在 CSRF 漏洞
CSRF 检测不靠 ZAP 自动扫描“打分”,而要人工验证表单行为是否缺失抗抵赖机制。ZAP 的 Active Scan 对 CSRF 效果有限,真正有效的是看请求里有没有 CSRF token、是否校验、能否复用。
操作路径:
立即学习“PHP免费学习笔记(深入)”;
- 在 ZAP 的
Sites树里找到目标 PHP 页面的 POST 请求(比如/admin/update_profile.php) - 右键 →
Resend with Request Editor,删掉Cookie头或修改Referer,看响应是否仍成功(若成功,说明没校验来源) - 重点查参数:是否存在类似
token=abc123或_csrf=xyz的字段;再进 PHP 源码(如果有权限)或响应 HTML 里搜hidden输入框,确认该 token 是否每次请求都刷新 - 用 ZAP 的
Breakpoints功能拦截请求,在发包前手动删掉 token 字段,再放行 —— 若服务器仍执行操作,就是漏洞确认
为什么 ZAP 抓不到 PHP 表单的 token 参数
常见原因不是 ZAP 问题,而是 PHP 页面用了前端 JS 动态生成 token(比如 Vue/AJAX 初始化时从 /api/csrf-token 拿),ZAP 默认不执行 JS,所以 token 字段压根不会出现在原始 HTML 表单里。
应对方式:
- 打开 ZAP 的
Spider时勾选Parse JavaScript,并启用Headless Browser(需提前装好 Chromium) - 手动访问页面后,在 ZAP 的
History标签页过滤XHR或fetch请求,找返回 JSON 中带csrf_token的接口 - 如果 token 由 JS 加密拼接(如
md5(timestamp + secret)),ZAP 无法还原,必须结合 PHP 代码逻辑或 Burp 的Extensions → CSPro辅助 - 注意 PHP 的
session.use_only_cookies=1配置会导致 ZAP 无法通过 URL 传 sessionid,此时必须保留 Cookie 头,否则 token 校验直接失败
绕过 Referer / Origin 校验的实操边界
有些 PHP 站只校验 Referer 是否为本站,看似防 CSRF,实则极易绕过。ZAP 本身不发包爆破,但可导出请求供 curl 或 Python 复现。
典型绕过方式:
- 把
Referer: https://victim.com/admin改成Referer: https://victim.com.admin.evil.com(部分 PHPparse_url()解析缺陷) - 删除
Origin头,或设为Origin: null(某些 PHP 框架对 null 值未做严格判断) - 用 ZAP 的
Send to Repeater后,在Raw标签页手动添加换行符混淆头解析:Referer: https://victim.com\r\nX-Forwarded-Host: evil.com - 注意:PHP 的
$_SERVER['HTTP_ORIGIN']在非 CORS 请求中可能为空,此时仅靠Referer校验形同虚设
真正难搞的是结合双重提交 Cookie + 同步 token 的 PHP 实现(比如 Laravel 的 @csrf),这种必须拿到用户 session 才能构造合法请求,ZAP 单独跑不出结果,得配合已登录态的手动重放。











