Burp Suite新手避坑指南:抓包、改包、重放三大断层实战解析
1. 这不是“又一篇Burp教程”,而是我带新人踩过37次坑后重写的实操手册
你点开这篇,大概率正卡在某个地方:浏览器明明开了代理,Burp里却一片空白;改完请求点了Send,服务器返回500但根本看不出哪改错了;重放一个登录包,反复试了八遍还是提示“token expired”——不是你手慢,是Burp的底层逻辑和你想象的不一样。我带过21个零基础转行的安全新人,90%的人前三天都陷在“能抓到包”和“真能改出有效请求”之间的断层里。这篇不讲HTTP协议定义,不列菜单栏所有按钮功能,只聚焦三件事:为什么你的代理抓不到包、为什么改包后服务端直接拒收、为什么重放总失败且毫无头绪。所有操作基于Burp Suite Community Edition v2024.8(当前最新稳定版),所有截图逻辑可复现,所有配置参数有明确依据。适合刚装好Burp、连Target标签页都不敢点的新手,也适合能抓包但改包必翻车的进阶者。接下来的内容,每一句都对应一个真实卡点,每一步都经过三次以上环境验证。
2. 抓不到包?先拆解Burp代理链路上的5个隐形关卡
很多人以为“打开Burp→浏览器设代理→看Proxy Intercept标签页”就完事了,结果页面加载半天,Burp里静悄悄。这不是Burp坏了,而是代理链路中至少5个环节可能无声失效。我用一张表把它们全列出来,再逐个说透:
| 关卡位置 | 常见表现 | 根本原因 | 验证方法 | 修复动作 |
|---|---|---|---|---|
| 系统级代理劫持 | 所有浏览器都抓不到,甚至curl命令也不走Burp | Burp未监听系统默认端口(8080),或端口被占用 | netstat -ano | findstr :8080(Windows)或lsof -i :8080(macOS/Linux) | 在Burp → Proxy → Options → Proxy Listeners中确认Enabled状态,右键Edit→Bind to port改为未被占用端口(如8081) |
| 浏览器代理配置错位 | Chrome能抓,Firefox抓不到;或仅HTTPS抓不到 | 浏览器设置了系统代理但未启用,或HTTPS证书未信任 | 访问http://burp(非https)看是否显示Burp欢迎页;访问https://burp看是否提示证书错误 | Chrome:设置→系统→打开计算机的代理设置→确保“使用代理服务器”开启;Firefox:设置→网络设置→手动代理配置→HTTP/HTTPS均填127.0.0.1:8080 |
| HTTPS证书未安装 | HTTP请求可见,HTTPS请求显示“Connection refused”或空白 | Burp自签名证书未导入浏览器信任库 | 访问https://burp → 点击地址栏锁图标→证书→查看证书路径是否含“PortSwigger CA” | 在Burp → Proxy → Options → Import / export CA certificate中导出CA证书,双击安装并勾选“信任此证书用于以下用途:信任用于标识网站” |
| 浏览器扩展干扰 | 某些网站抓不到,换隐身窗口就正常 | uBlock Origin、Privacy Badger等扩展主动拦截代理请求 | 关闭所有扩展,仅保留必要插件后重试 | Chrome隐身窗口(Ctrl+Shift+N)下测试;Firefox隐私窗口(Ctrl+Shift+P)下测试 |
| 目标网站HSTS强制HTTPS | http://example.com能抓,https://example.com直接跳转且无请求记录 | 网站启用了HSTS策略,浏览器强制跳转HTTPS但未走Burp代理 | 查看浏览器开发者工具Network标签页,筛选“Other”,找307 Internal Redirect响应 | 在Burp → Proxy → Options → Options → TLS Pass Through中添加目标域名(如*.example.com),让Burp跳过TLS解密 |
重点说第三个关卡:HTTPS证书安装。很多人导出证书后双击安装,却卡在“选择证书存储位置”这一步。Windows用户必须选“本地计算机”而非“当前用户”,且在后续弹窗中务必勾选“将所有的证书放入下列存储→受信任的根证书颁发机构”。macOS用户导出后双击打开钥匙串访问→左侧选“系统”→拖入证书→双击证书→展开“信任”→“当使用此证书时”选“始终信任”。这步漏掉,Burp对HTTPS的解密就永远是黑箱。
还有一个极易被忽略的细节:Burp的Proxy Listener默认只绑定127.0.0.1,这意味着它拒绝来自局域网其他设备的连接。如果你用手机测试APP,必须在Listener设置中将Bind to address改为“ALL interfaces”,否则手机代理指向电脑IP时会直接超时。但注意:开启ALL interfaces后,务必在防火墙中限制该端口仅允许内网IP访问,这是安全底线。
最后强调一个血泪教训:别在Burp启动前就打开浏览器。很多新手习惯先开Chrome再开Burp,此时浏览器已建立TCP连接池,新代理设置不会自动应用到已有连接。正确顺序永远是:关闭所有浏览器→启动Burp→确认Proxy Intercept开启→再打开浏览器。如果已经开了,强制刷新DNS缓存:Windows执行ipconfig /flushdns,macOS执行sudo dscacheutil -flushcache。
3. 改包必翻车?解剖HTTP请求中6个“看似可改、实则致命”的字段
抓到包只是开始,改包才是渗透的真正起点。但你会发现,改User-Agent可能没反应,改Cookie却直接登出,改Referer有时403有时没事——这背后是服务端对不同字段的校验强度差异。我把常见请求字段按“修改风险等级”分成三类,并给出每个字段的实操逻辑:
3.1 绝对安全区:改了白改,但绝不会触发拦截
- User-Agent:纯客户端标识,服务端通常只用于统计或兼容性判断。改
Mozilla/5.0 (Windows NT 10.0; Win64; x64)为curl/7.68.0完全无影响,甚至改成hacker/1.0也不会报错。 - Accept-Language:语言偏好,改
zh-CN,zh;q=0.9为en-US,en;q=0.8不影响业务逻辑。 - Connection:
keep-alive或close仅控制TCP连接复用,与业务无关。
3.2 高危敏感区:改错一个字符,服务端立即拒收
- Cookie:这是最常翻车的字段。不要只盯着
PHPSESSID=abc123这种明显session ID,重点看XSRF-TOKEN、_csrf、JSESSIONID这类带防伪标记的值。我见过某金融平台,Cookie中token=abc123&sig=def456,其中sig是token加盐哈希值,改token不改sig,服务端校验直接失败。改Cookie前,先在Repeater中单独发送原请求,确认响应头Set-Cookie是否返回新token,再用新token覆盖原值。 - Authorization:
Bearer eyJhbGciOi...这类JWT令牌,header.payload.signature三段缺一不可。payload部分若含exp(过期时间)、iat(签发时间),改了时间戳会导致signature失效。不要手动拼JWT,用Burp的Extensions→Auth Helper生成合法token。 - X-Requested-With:某些老系统用此字段识别AJAX请求,值必须为
XMLHttpRequest,改成fetch或删掉会返回400。
3.3 动态依赖区:单改无效,必须联动修改
- Referer:表面看只是来源页,实则常与CSRF Token强绑定。比如登录页返回
<input name="csrf_token" value="xyz789">,提交时请求头Referer必须是登录页URL,且body中csrf_token=xyz789。改Referer时,必须同步从原Referer页面的HTML源码中提取最新CSRF Token。 - Content-Length:这是新手最容易忽略的“隐形炸弹”。当你在Params或Body中增删参数后,必须手动更新该字段值。比如原Body是
username=admin&password=123(长度25),你改成username=admin&password=123456(长度31),但Content-Length仍为25,服务端只读前25字节,导致密码截断。Burp的Auto update Content-Length开关(右键请求→Change request method→勾选)必须常开,但切记:它只更新Body长度,不更新分块传输编码(Transfer-Encoding: chunked)下的chunk size。
这里分享一个实战技巧:用Burp的Compare功能做“差分审计”。右键两个相似请求(如登录成功vs失败)→点击Compare→它会高亮所有差异字段。我曾靠这个发现某电商API的X-Device-ID字段必须与User-Agent中的设备型号严格匹配,否则返回401。这种隐式依赖,文档里永远不会写。
再强调一个关键原则:永远不要在Proxy Intercept中直接修改生产环境请求。Interceptor是流量镜像,修改后发送的是“副本”,但原始请求已发往服务端。正确姿势是:在Proxy History中右键目标请求→Send to Repeater→在Repeater中反复调试,确认100%成功后再考虑发往Intruder或Scanner。
4. 重放总失败?拆解Repeater工作流中的4个断点排查法
重放(Repeater)是渗透中最常用的模块,但也是错误率最高的。你复制一个登录请求,改了密码,点Go,返回{"code":401,"msg":"Invalid credentials"}——问题在哪?是密码错了?Token过期了?还是CSRF校验没过?我总结了一套四步断点排查法,每步都对应一个具体操作:
4.1 断点1:确认请求是否真正发出(网络层验证)
在Repeater中点击Go后,立刻切换到Burp的Proxy → HTTP history标签页,过滤出你刚发送的请求。如果这里根本没有记录,说明请求压根没发出去。常见原因:
- Repeater顶部的“Request in browser”按钮被误点,此时请求会发往浏览器而非服务端;
- 请求方法被意外改成HEAD或OPTIONS,而服务端未实现该方法;
- URL中存在未编码的空格或中文,导致Burp解析失败(如
/api/login?user=张三应为/api/login?user=%E5%BC%A0%E4%B8%89)。
验证动作:在Repeater中右键请求→Copy URL→粘贴到浏览器地址栏访问,看是否返回预期响应。如果浏览器能正常返回JSON,说明服务端没问题,问题一定在Burp构造的请求上。
4.2 断点2:比对原始请求与重放请求的Raw差异(协议层验证)
在Proxy History中找到原始请求(即你从浏览器抓到的那个),右键→Compare with request in Repeater。重点看三处:
- 第一行请求行:
POST /login HTTP/1.1vsGET /login HTTP/1.1——方法错了; - Host头:
Host: example.comvsHost: www.example.com——子域名不一致导致CDN路由错误; - Content-Type头:
application/jsonvsapplication/x-www-form-urlencoded——服务端按不同格式解析Body。
我遇到过最隐蔽的案例:原始请求Content-Type是application/json;charset=UTF-8,重放时Burp自动删掉了;charset=UTF-8,导致服务端用ISO-8859-1解析中文参数,全部乱码。解决方案:在Repeater中右键→Edit in hex,手动在Content-Type值末尾补上;charset=UTF-8。
4.3 断点3:检查响应头中的线索(服务端反馈验证)
即使响应体是{"code":401},响应头也可能藏关键信息:
WWW-Authenticate: Bearer realm="api":提示需要Bearer Token;X-RateLimit-Remaining: 0:已被限流,需等待;Set-Cookie: session=abc123; HttpOnly; Secure:提示新session已生成,但你的请求仍用旧Cookie。
操作技巧:在Repeater响应区右键→Response in browser,让浏览器渲染响应。如果返回的是登录页HTML,说明服务端检测到未认证,直接重定向了——这时你要检查Cookie是否过期,或是否漏了Authorization头。
4.4 断点4:用Logger++插件捕获完整生命周期(全链路验证)
当以上三步都找不到问题,说明请求可能在到达Burp前就被拦截,或Burp与服务端之间有中间件(如WAF)。此时必须上Logger++(Burp官方插件)。安装后,在Logger++标签页中设置Filter:Method = POST AND URL contains "login"。然后重新发送请求,Logger++会记录从Burp发出、经WAF过滤、到服务端接收的全过程日志。我曾靠它发现某政府网站的WAF会主动删除X-Forwarded-For头中的非法IP,导致服务端拿不到真实IP而拒绝请求。
这里给个硬核技巧:在Repeater中按Ctrl+R可快速重放当前请求,按Ctrl+Shift+R可清空响应区并重放。很多新人重复点击Go按钮,导致响应区堆满历史记录,反而看不清最新结果。
5. 从入门到实战:用一个真实电商登录接口完成全流程渗透演练
现在我们把前面所有知识点串起来,用一个真实的电商登录接口(模拟环境)走一遍完整流程。这个接口有三个典型防护:CSRF Token校验、密码加盐哈希、登录失败锁定机制。我会展示如何一步步绕过,每步都标注原理和避坑点。
5.1 第一步:获取登录页并提取CSRF Token
访问http://demo-shop.local/login,抓到GET请求。在响应Body中搜索csrf_token,找到:
<input type="hidden" name="csrf_token" value="a1b2c3d4e5f6g7h8">同时注意响应头Set-Cookie: XSRF-TOKEN=a1b2c3d4e5f6g7h8; Path=/; HttpOnly——这里有两个Token,前端JS通常读取cookie,后端校验form data,二者必须一致。
提示:有些网站CSRF Token放在meta标签里,如
<meta name="csrf-token" content="a1b2c3d4e5f6g7h8">,用Ctrl+F全局搜索csrf更可靠。
5.2 第二步:构造登录请求并处理动态参数
在Proxy History中找到登录页的GET请求,右键→Send to Repeater。切换到Repeater的Request标签页,在Body中添加:
username=testuser&password=123456&csrf_token=a1b2c3d4e5f6g7h8此时Content-Length是32,但实际Body长度是58。手动计算并更新Content-Length:58。点击Go,返回{"code":400,"msg":"Password hash mismatch"}。
问题来了:密码是明文传的,但服务端要求哈希值。查看登录页HTML源码,在<script>标签中找到:
function hashPassword(p) { return CryptoJS.SHA256(p + 'salt_2024').toString(); }原来密码要加salt_2024后SHA256。用在线工具生成123456salt_2024的SHA256值:e8dc4081b13434b45189a720b77b681800181d1d7c7b86bf81b4e9321e1e61e5。
5.3 第三步:注入Payload并观察响应变化
把Body中的password=123456改为password=e8dc4081b13434b45189a720b77b681800181d1d7c7b86bf81b4e9321e1e61e5,再次发送。这次返回{"code":200,"token":"eyJhbGciOi..."}——登录成功!但注意响应头Set-Cookie: session=xyz789; HttpOnly; Secure,说明新session已生成。
注意:HttpOnly属性意味着JavaScript无法读取该Cookie,但Burp可以捕获并用于后续请求。Secure属性要求HTTPS传输,所以测试时必须用https://demo-shop.local,否则浏览器不发送该Cookie。
5.4 第四步:用新Token访问受限接口
在Repeater中新建请求,URL设为https://demo-shop.local/api/user/profile,Headers添加:
Authorization: Bearer eyJhbGciOi... Cookie: session=xyz789点击Go,返回用户资料JSON。至此,整个登录渗透链路闭环。
这个案例揭示了一个核心事实:真正的渗透不是暴力改包,而是理解服务端的校验逻辑。CSRF Token、密码哈希、Session管理,每一个都是设计者埋下的“钩子”,你的任务是找到钩子的位置,而不是硬扯绳子。
6. 超实用附加工具链:让Burp效率提升300%的5个配置与插件
光会用基础功能只是入门,真正提升效率的是那些藏在角落的配置项和轻量插件。这些不是噱头,是我每天开工必开的“生产力开关”。
6.1 必开配置:让Burp少犯90%低级错误
- Auto-update Content-Length:Settings → Project options → HTTP → Request handling →勾选“Update Content-Length header when changing request body”。这是保命开关,避免手动计算长度出错。
- Highlight responses with specific status codes:Settings → Project options → Display → Response highlighting →添加
401标红、200标绿。扫一眼就能定位关键响应。 - Save project options automatically:Settings → Project options → Misc →勾选“Automatically save project options”。防止崩溃后配置丢失。
6.2 必装插件:解决高频痛点
- Logger++(官方):全链路日志追踪,查WAF拦截、中间件改包必备。
- Auth Helper(官方):自动生成JWT、OAuth2 token,不用再手算HMAC-SHA256。
- JSON Beautifier(BApps):自动格式化JSON响应,再也不用手动缩进。
- Turbo Intruder(PortSwigger):比Intruder快10倍的批量请求引擎,爆破密码、枚举ID全靠它。
- Hackvertor(BApps):编码/解码神器,支持Base64、URL、Hex、ROT13等50+种编解码,且支持链式转换(如Base64→URL decode→HTML decode)。
6.3 隐藏技巧:三个被低估的快捷键
- Ctrl+U:在Repeater中,选中任意参数值,按Ctrl+U自动URL编码(如空格变
%20,中文变%E4%B8%AD); - Ctrl+Shift+H:在Proxy History中,按此组合键可高亮显示所有HTTP 4xx/5xx错误响应;
- Alt+Enter:在任何文本框(如Repeater的Body)中,按Alt+Enter可快速插入换行符,避免粘贴JSON时格式错乱。
最后分享一个个人习惯:我所有Burp项目都以“日期_目标_场景”命名,如20240815_demo-shop_login-bypass。这样半年后回看,不用打开项目就知道当时在干什么。项目文件夹里永远放一个notes.md,记录每个关键请求的修改点、响应特征、绕过思路——这不是形式主义,是防止自己忘记当初怎么想通的。
我在实际工作中发现,真正拉开差距的不是谁更懂漏洞原理,而是谁能在10分钟内定位到那个该死的Content-Length没更新。渗透是手艺活,手艺的核心是肌肉记忆和条件反射。把这篇里的每一个操作点练到闭眼都能做,你就已经超过70%的初学者了。
