1. 项目概述:当Burpsuite遇上“火眼金睛”
做安全测试的朋友,尤其是搞Web渗透和漏洞挖掘的,Burpsuite(下文简称BP)绝对是吃饭的家伙。但这两年,一个越来越普遍的现象是:你刚把BP的代理设置好,浏览器还没开始点,目标网站就直接弹出一个“检测到非法代理工具”或者干脆把你连接给掐了。这感觉就像你刚掏出钥匙,门卫就告诉你“我知道你想干嘛,门都没有”。这种“被针对”的体验,不仅打断了测试流程,更让人好奇:一个本地代理工具,是怎么被千里之外的服务器“看穿”的?
这背后,是攻防对抗在客户端层面的又一次升级。网站不再仅仅依赖服务端的WAF(Web应用防火墙)来拦截攻击流量,而是开始主动“侦查”来访的客户端环境。Burpsuite作为一个中间人代理,必然会留下一些独特的“指纹”。本次探讨的核心,就是深入分析这些指纹产生的根源,并分享经过实战检验的、行之有效的绕过方案。这不是简单的“改个User-Agent”就能解决的,我们需要理解其原理,从HTTP头、TLS指纹、浏览器特征等多个维度进行系统性的伪装和对抗。无论你是安全研究员、渗透测试工程师,还是对Web安全技术感兴趣的学习者,理解这套机制,都能让你在未来的测试中更加游刃有余。
2. Burpsuite被检测的根源深度剖析
网站检测Burpsuite,本质上是在进行客户端指纹识别。它并不关心你是不是“坏人”,它只关心你的流量特征是否与一个典型的、真实的浏览器发出的流量一致。BP作为一个代理工具,其默认行为与浏览器存在多处差异,这些差异点就构成了它的指纹。
2.1 HTTP请求头指纹
这是最基础也是最常见的检测点。Burpsuite在转发或修改请求时,其默认的HTTP头集合与真实浏览器有显著区别。
-
顺序与大小写
:真实浏览器(如Chrome、Firefox)发出的HTTP头,其字段名有固定的大小写格式(如
User-Agent,Accept-Encoding),并且头部字段的排列顺序也相对固定。Burpsuite默认生成的请求,其头部顺序可能与浏览器不同,一些工具甚至可能使用全小写的字段名(如user-agent)。虽然HTTP协议规定头部字段名不区分大小写,但这种非常规的格式本身就是一种可疑信号。 -
缺失或额外的头部
:
-
Sec-*系列头部 :现代浏览器为增强安全性,引入了一系列以Sec-开头的头部,例如Sec-Fetch-Dest(请求目标类型,如document,image)、Sec-Fetch-Mode(请求模式,如navigate,cors)、Sec-Fetch-Site(请求来源与目标的关系,如same-origin,cross-site)、Sec-Fetch-User(是否由用户交互触发)。这些头部由浏览器自动添加,用于向服务器提供更多关于请求来源的上下文信息,帮助防御CSRF等攻击。 Burpsuite默认不会添加这些头部 ,这是其一个非常强烈的指纹。 -
Upgrade-Insecure-Requests:浏览器在遇到HTTP页面或混合内容时,会发送此头部,表明其倾向于升级到HTTPS。BP默认请求可能不包含此头。 -
Accept-Encoding值 :浏览器通常声明支持gzip, deflate, br(Brotli)。BP的默认值可能不同或缺失br。 -
Connection头 :在一些特定场景或旧版本中,BP的Connection头值可能与浏览器有细微差别。
-
注意 :仅仅使用“Repeater”模块手动复制浏览器请求头到BP中,有时并不能一劳永逸。因为一些头部(如
Sec-*)的值与请求的上下文(如导航、iframe加载、XHR请求)紧密相关,手动设置错误的值同样会被检测。
2.2 TLS/SSL握手指纹(JA3指纹)
这是目前最强大、最难绕过的一类检测手段,它作用于HTTPS建立连接之前的TLS握手阶段。服务器(或前置的流量网关)可以分析客户端Hello报文中的特征,生成一个唯一的指纹,即JA3指纹。
TLS握手时,客户端会发送一个“Client Hello”消息,其中包含:
- TLS版本号 (如 TLS 1.2, TLS 1.3)
- 支持的加密套件列表 (Cipher Suites)
- 支持的椭圆曲线列表 (Elliptic Curves)
- 支持的椭圆曲线格式 (Elliptic Curve Point Formats)
- 支持的签名算法列表 (Signature Algorithms)
-
支持的ALPN协议
(如
http/1.1,h2)
JA3指纹算法就是将上述字段(按顺序、以特定格式)拼接成一个字符串,然后计算其MD5哈希值。 不同的客户端(Chrome, Firefox, Curl, Burpsuite)拥有完全不同的JA3指纹 。
Burpsuite的JA3指纹问题 :
- 固定性 :BP使用Java的SSL/TLS库(默认是JSSE),其支持的加密套件、扩展列表是固定的。这使得所有使用默认配置的BP实例,其JA3指纹都是一样的,或者在一个很小的集合内。安全设备可以轻松维护一个“Burpsuite JA3指纹黑名单”。
- 独特性 :这个指纹列表与任何主流浏览器都不匹配。当服务器收到一个来自“声称是Chrome”的客户端的TLS握手,但计算出的JA3指纹却匹配已知的Burpsuite指纹库时,检测就触发了。
2.3 WebSocket指纹
对于使用WebSocket的实时应用,Burpsuite同样会留下指纹。浏览器建立WebSocket连接时,其握手请求(一个升级的HTTP请求)包含特定的头部,如
Sec-WebSocket-Key
、
Sec-WebSocket-Version
、
Sec-WebSocket-Extensions
等。BP代理下的WebSocket握手包,这些头部的值或组合方式可能与浏览器不同。
2.4 JavaScript环境检测
一些高级的检测方案会在网页中嵌入JavaScript代码,对客户端环境进行深度探测。
-
插件与属性检测
:JS可以枚举
navigator.plugins(插件列表)、navigator.mimeTypes等。真实浏览器有一系列标准插件(如PDF Viewer, Chrome PDF Viewer),而BP的内置浏览器或通过BP代理的浏览器,其插件列表可能异常(例如为空,或包含Java相关插件)。 -
WebDriver属性
:自动化测试工具(如Selenium)会留下
navigator.webdriver属性为true。一些检测脚本也会检查这个属性。虽然BP本身不直接设置它,但如果测试者同时使用自动化浏览器+BP代理,就可能暴露。 -
屏幕分辨率与色彩深度
:JS可以获取
screen.width/height和screen.colorDepth。全屏或非常规的分辨率可能被视为可疑。 - 字体枚举 :通过Flash(已淘汰)或更隐蔽的CSS字体检测技术,可以枚举客户端安装的字体列表。系统字体组合也是一个独特的指纹。
2.5 流量行为模式
这属于更高级的启发式检测,通过分析一段时间内的请求模式来判断。
- 请求速率与顺序 :手工测试的请求间隔不均匀,而自动化扫描工具(BP的Intruder或Scanner)可能以固定、高速的频率发送请求。
-
参数遍历模式
:对同一个参数进行大量、系统的值替换(如
id=1,id=2,id=3...),这种模式明显区别于正常用户行为。 - 错误触发频率 :短时间内触发大量4xx或5xx错误响应。
3. 系统性绕过方案与实战配置
理解了检测原理,我们就可以有针对性地进行伪装。我们的目标是将Burpsuite的流量特征,尽可能贴近一个指定的、真实的浏览器。这里提供一套从易到难、层层递进的实战方案。
3.1 基础伪装:修改HTTP请求头
这是第一步,也是必须做的一步。我们不能再使用BP的默认请求头。
操作步骤:
- 打开Burpsuite,进入 Proxy -> Options 选项卡。
- 找到 Match and Replace 规则区域。我们将在这里添加规则,对经过代理的所有请求的头部进行全局替换或添加。
-
添加以下关键规则(示例以模仿最新版Chrome为例):
-
规则1(覆盖User-Agent)
:
-
Type:
Request header -
Match:
User-Agent:.*(正则表达式,匹配任意User-Agent) -
Replace:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
-
Type:
-
规则2(添加Sec-Fetch头部)
:
- 这需要根据请求类型动态设置,比较繁琐。一个折中方案是使用插件。但我们可以先添加一个静态的、对普通导航请求有效的规则:
-
Type:
Request header -
Match:
^$(匹配空,表示添加新头) -
Replace:
Sec-Fetch-Dest: document -
同样方法添加:
Sec-Fetch-Mode: navigate,Sec-Fetch-Site: same-origin,Sec-Fetch-User: ?1 -
注意
:对于非导航请求(如图片、XHR),这些值需要改变。例如,XHR请求的
Sec-Fetch-Dest可能是empty,Sec-Fetch-Mode是cors。过于死板的设置可能适得其反。更佳实践是使用“Copy from browser”功能,在Proxy的“HTTP history”中右键点击一个从真实浏览器捕获的、成功的请求,选择“Copy as curl command”,然后分析其完整的头部。
-
规则1(覆盖User-Agent)
:
实操心得:
不要只改User-Agent。优先从真实浏览器中捕获一个成功的请求包,将其所有头部(尤其是
Accept
,
Accept-Encoding
,
Accept-Language
,
Cache-Control
,
Sec-*
系列)完整地复制到BP的Match and Replace规则中,或配置到
Project options -> Sessions -> Session Handling Rules
中,利用宏(Macros)在会话中自动更新头部。这比静态规则更灵活。
3.2 中级对抗:使用插件增强伪装
Burpsuite的强大之处在于其可扩展性。以下插件能极大简化伪装工作:
-
User-Agent Switcher:虽然名字是UA切换,但优秀的功能远不止于此。它可以管理多个浏览器配置文件,不仅一键切换User-Agent,还能配套切换所有相关的HTTP头部(包括Accept,Sec-*等),使其与目标浏览器版本完全匹配。这是解决HTTP头指纹的最有效工具之一。 -
Burp Bypass Suite或Femida:这类插件专门为绕过WAF和客户端检测设计。它们可能集成了自动修复HTTP头顺序、添加缺失的浏览器特定头部、甚至尝试干扰一些简单的JS环境检测的功能。 -
TLS-Attacker或JA3S相关插件 :有社区开发者尝试制作修改JA3指纹的插件,但请注意, 在标准的Burpsuite中直接修改其底层TLS栈的JA3指纹极其困难 。因为JA3依赖于Java虚拟机(JVM)的SSL实现。这些插件可能通过一些技巧(如尝试重新排序加密套件列表)来改变指纹,但无法完全模拟另一个浏览器。此路通常不通,需要转向更底层的方案。
3.3 高级方案:上游代理与流量转发(核心绕过手段)
当网站部署了严格的JA3指纹检测时,修改Burpsuite本身往往力不从心。此时,我们需要引入一个“中间层”,让这个中间层去面对目标网站的检测,而Burpsuite则作为这个中间层的客户端。核心思路是: 让一个拥有合法浏览器指纹的客户端(工具)去负责与目标服务器的TLS握手,Burpsuite只分析与修改这个客户端收发的明文流量。
方案一:使用
mkcert
生成可信根证书 +
mitmproxy
等原生工具
此方案并非直接用于BP,而是一种替代思路。
mitmproxy
是用Python编写的,其TLS指纹取决于运行它的Python环境的SSL库。在某些配置下,可能比Java的BP更容易伪装。但对于深度依赖BP功能(如Scanner, Intruder, Repeater)的测试者,这不是首选。
方案二:使用
proxychains
等工具链(Linux/macOS)
-
配置一个拥有正确指纹的代理工具(如配置好的
mitmproxy或Charles)运行在本地(如127.0.0.1:8081)。 -
使用
proxychains强制Burpsuite的所有出站流量走这个代理。 -
这样,与目标服务器建立TLS连接的是
mitmproxy(假设其指纹已伪装),Burpsuite只是连接到mitmproxy的客户端。- 缺点 :配置复杂,且可能影响BP某些功能的稳定性。
方案三(推荐):使用
Burp Suite Mobile Assistant
或 真实手机代理
这是目前绕过客户端检测(包括TLS指纹和部分JS检测)最有效的方法之一。
- 原理 :在一台真实的手机(Android/iOS)上安装BP的CA证书,并将手机Wi-Fi的代理设置为运行BP的电脑。所有手机应用(包括其系统浏览器)的流量都会经过BP。
-
优势
:
- 完美的TLS指纹 :手机浏览器(如Android Chrome, iOS Safari)拥有全球数十亿设备的、绝对真实的TLS JA3指纹,几乎不可能被列入黑名单。
-
真实的JS环境
:运行在手机上的浏览器,其
navigator属性、屏幕参数、字体列表全是真实的。 -
天然的
Sec-*头部 :由手机浏览器自动生成,完全正确。
-
操作
:
-
在BP中,
Proxy -> Options -> Proxy Listeners确保代理运行(如127.0.0.1:8080)。 - 手机连接与电脑同一局域网,在Wi-Fi设置中配置手动代理,服务器为电脑的局域网IP,端口为8080。
-
用手机浏览器访问
http://burp,下载并安装CA证书(Android需在系统设置中进一步信任该证书;iOS安装后需在设置->通用->关于本机->证书信任设置中完全信任)。 - 此后,手机的所有HTTP(S)流量都将经过BP。你可以在电脑上的BP中观察、修改这些请求。
-
在BP中,
- 针对App的抓包 :对于手机App,可能需要额外处理证书绑定(SSL Pinning)。但这属于另一个层面的对抗。对于Web端检测,此方案效果极佳。
重要提示 :使用真实手机代理时,务必确保测试环境安全,仅在授权的测试范围内操作,避免个人隐私数据泄露。
3.4 终极策略:修改Burpsuite的TLS实现(高风险、高难度)
对于执着于在桌面端完美伪装的研究者,最终极的途径是修改Burpsuite运行的JVM环境或其使用的SSL库,以改变其JA3指纹。这通常涉及:
-
替换JSSE实现
:尝试使用其他JVM TLS实现,如
Bouncy Castle提供商。但这需要修改BP的启动脚本或代码,兼容性极差,极易导致BP崩溃。 - 使用原生库包装 :通过JNI调用一个用C/C++编写的、可以定制TLS握手参数的本地库。这需要深厚的开发功底。
-
基于源代码修改
:Burpsuite有社区版(旧版本)的源代码。理论上可以修改其
Client Hello的构造逻辑。但这涉及法律风险(违反许可证)和技术壁垒。
对于99%的渗透测试者和安全研究员,我不推荐尝试此路径。 投入产出比极低,且稳定性无法保证。方案三(真实手机代理)是当前性价比最高、最可靠的绕过方案。
4. 实战流程与配置详解
让我们以一个完整的实战场景,串联上述方案。假设目标网站
https://vulnerable-target.com
部署了基于JA3指纹和HTTP头的高级检测。
步骤1:环境准备与初步探测
-
启动Burpsuite,确保代理监听器(如
127.0.0.1:8080)已开启。 - 将浏览器(以Firefox为例)代理设置为BP,并安装BP的CA证书。
-
访问
https://vulnerable-target.com。如果页面正常加载,可能检测较弱。如果立即连接重置或弹出警告,说明检测生效。 -
在BP的Proxy历史记录中查看第一个
GET /请求。检查其HTTP头部,是否缺少Sec-Fetch-*等头。同时,可以尝试用浏览器直接访问(不经过BP),用开发者工具网络面板对比请求头差异。
步骤2:实施HTTP头伪装
- 使用浏览器直接访问目标,打开开发者工具(F12),进入“网络”标签。
-
刷新页面,点击第一个文档请求(通常是
/),在右侧“标头”部分找到“请求标头”,复制全部内容。 -
在Burpsuite中,进入
Project options -> Sessions -> Session Handling Rules。 - 点击“Add”,新建一个规则。在“Rule Actions”中点击“Add” -> “Run a macro”。
- 新建一个宏(Macro),选择从浏览器直接访问成功时捕获的那个请求。配置宏在每次会话开始时或定期触发。
- 在宏的编辑界面,勾选“Use custom headers in final request”,然后将从浏览器复制的完整请求头粘贴进去。这样,BP在发送请求时,会自动使用这套真实的浏览器头部。
步骤3:引入上游代理(以手机代理为例) 当步骤2仍无法绕过时(可能是JA3检测),启动方案三。
-
确保电脑和手机在同一Wi-Fi下。在电脑上使用
ipconfig(Windows) 或ifconfig(macOS/Linux) 查看电脑的局域网IP(如192.168.1.105)。 -
手机连接同一Wi-Fi,进入Wi-Fi设置,选择“修改网络” -> “高级选项” -> “代理”选择“手动”。
-
代理主机名:
192.168.1.105 -
代理端口:
8080
-
代理主机名:
-
保存后,用手机浏览器访问
http://burp,下载证书文件(cacert.der)。 - Android :进入“设置” -> “安全” -> “加密与凭据” -> “安装证书” -> “CA证书”,找到下载的文件安装。然后还需在“设置” -> “安全” -> “信任的凭据” -> “用户”中确认该证书已受信任。 iOS :安装描述文件后,需进入“设置” -> “通用” -> “关于本机” -> “证书信任设置”,打开对BP根证书的完全信任。
-
配置完成后,用手机浏览器访问
https://vulnerable-target.com。此时流量路径为:手机浏览器 -> 手机系统代理 -> 电脑BP代理 -> 互联网 -> 目标服务器。 - 在电脑的BP中,你应该能看到来自手机IP的请求。现在,你发送给目标的请求,其TLS指纹是手机浏览器的,HTTP头也是手机浏览器生成的,绕过成功率极高。
步骤4:在BP中操作手机流量
- 你可以在BP的Proxy -> Intercept中拦截手机的请求,进行修改后转发。
- 在Proxy -> HTTP history中查看所有手机流量。
- 可以将感兴趣的请求右键发送到Repeater进行重放测试,发送到Intruder进行模糊测试,或使用Scanner进行主动扫描。
-
关键技巧
:在Repeater中重放来自手机的请求时,BP默认会使用自己的TCP连接和TLS栈,这可能导致JA3指纹变回BP的,从而触发检测。为了解决这个问题,在Repeater中,你可以尝试修改请求的
Target主机为127.0.0.1:8080(或其他端口),然后配置一个Match and Replace规则,将该请求的Host头替换回原始目标vulnerable-target.com。但这需要另一个中间代理(如mitmproxy)在本地8080端口监听并转发。更简单的做法是,对于需要重放的测试,尽量在手机端通过刷新页面或操作App来触发,同时在BP的Proxy历史中观察结果,而不是过度依赖Repeater模块的重放功能。
5. 常见问题排查与解决技巧
在实际操作中,你可能会遇到以下问题。这里提供排查思路和解决方案。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 配置手机代理后,手机无法上网 |
1. 电脑防火墙阻止了8080端口。
2. 电脑与手机不在同一网段。 3. BP代理未运行或监听地址错误。 |
1. 关闭电脑防火墙或为8080端口添加入站规则。
2. 确认手机和电脑连接的Wi-Fi是同一个,且IP地址在同一子网(如都是192.168.1.x)。 3. 检查BP
Proxy -> Options -> Proxy Listeners
,确保
Running
为打勾状态,绑定地址为
0.0.0.0:8080
或本机IP,而不仅是
127.0.0.1
。
|
| 手机可以访问HTTP网站,但HTTPS网站证书错误 |
1. BP的CA证书未在手机上正确安装或信任。
2. 某些App使用了证书绑定(SSL Pinning)。 |
1. 重新访问
http://burp
下载证书,并严格按照系统步骤完成安装和信任(特别是iOS的“证书信任设置”)。
2. 对于App,需要尝试使用
Frida
、
Objection
等工具绕过SSL Pinning,这属于移动安全测试范畴。
|
| 经过所有伪装,网站仍能检测到代理 |
1. TLS指纹(JA3)检测依然有效。
2. 存在更底层的TCP/IP指纹(如TCP窗口大小、TTL)。 3. 网站使用了基于行为的检测(请求频率、模式)。 |
1.
确认是否已使用手机代理方案
。这是解决JA3问题最直接的方法。
2. TCP/IP指纹检测较为罕见。可尝试在BP或上游代理中调整MTU等参数,但难度大。 3. 降低测试速度 :在Intruder中设置更长的请求间隔(
Options -> Request Engine -> Throttle
)。
模拟人类操作
:不要以固定模式遍历参数,加入随机延迟和随机操作序列。
|
| Burpsuite Scanner或Intruder触发检测,但手动浏览不触发 | 工具自动化特征明显(如固定User-Agent、无Referer、请求间隔均匀、参数遍历模式化)。 |
1. 为Scanner/Intruder配置
会话处理规则(Session Handling Rules)
,使其能使用有效的会话令牌和正确的HTTP头。
2. 在Intruder的
Options
中,启用“
Add custom headers
”,填入完整的浏览器头部。
3. 大幅降低并发线程数,增加随机延迟。 |
| 使用上游代理方案后,Burpsuite无法解密HTTPS流量 | 流量在上游代理处已被解密并重新加密,BP拿到的是上游代理与目标之间的TLS流量,而非明文。 |
这是该架构的固有特点。你需要在上游代理(如
mitmproxy
)处查看和解密流量。或者,采用“BP -> 伪装客户端 -> 目标”的模式,确保BP是第一个也是唯一一个进行MITM的节点。手机代理方案不存在此问题,因为BP是手机的直接代理。
|
独家避坑技巧:
- “指纹采集”先行 :在针对重要目标进行测试前,先用一个干净的、无代理的浏览器(最好是目标网站主流用户使用的浏览器,如Chrome)正常访问几次关键页面。用Wireshark抓取TLS Client Hello包,或用浏览器开发者工具仔细记录下所有请求的完整头部、Cookie建立顺序。用这份“标本”来精细配置你的BP或伪装客户端,事半功倍。
- 保持环境干净 :测试时,关闭浏览器上所有可能与隐私、安全检测相关的插件(如某些广告拦截器、隐私保护插件),因为它们可能会修改或删除一些头部,使其变得特殊。
- 分阶段测试 :不要一开始就上Scanner全盘扫描。先用手动浏览+Repeater小范围测试,确认绕过方案稳定有效后,再逐步开展自动化测试,并密切观察响应状态码和内容,一旦出现异常检测迹象,立即暂停分析。
-
备用方案
:始终准备一个备用方案。如果手机代理因网络问题不稳定,可以快速切换到一个配置好的、使用
mitmproxy(已做基础伪装)作为上游代理的桌面测试环境。多一种手段,多一分成功率。
绕过客户端检测是一场持续的动态对抗。网站防御方会不断更新其指纹库和检测算法。因此,最根本的策略是 深刻理解原理 ,从而能够灵活组合各种方法,并随时调整策略。将Burpsuite的流量完美地隐藏在一个真实浏览器的“影子”里,是高级渗透测试中不可或缺的一项技能。
1244

被折叠的 条评论
为什么被折叠?



