一、代理拦截的基础逻辑与常见瓶颈分析
很多做Web开发、测试的朋友,大概率都用过Burp Suite这款工具——说白了它就是个“中间传话的”,你手机、电脑发请求给网站,先绕到Burp这儿,它能帮你把请求、响应的内容扒开看,甚至改改内容再发出去。但不少人用着用着就发现问题:要么网页加载慢得像蜗牛,要么改了请求根本没生效,甚至Burp直接卡得动不了。这些问题本质上都是代理拦截过程里的瓶颈,得先搞懂瓶颈在哪,才能谈优化。
1.1 最常见的几类瓶颈
先说说最容易碰到的几种情况。第一种是“大请求卡壳”,比如你要上传一张几十兆的高清图,或者网站要返回一个包含几万条数据的列表,Burp得把这些内容全存下来才能处理,内存不够的话直接卡爆。第二种是“乱序请求丢包”,现在很多网页都是同时发好几个请求,比如打开一个电商详情页,要同时拿商品信息、评论、推荐商品,Burp如果按顺序处理不过来,就会出现请求乱序,甚至丢了某个请求,导致网页加载不全。第三种是“证书坑”,Burp要拦截HTTPS请求,得装自己的证书,但很多手机APP、浏览器会校验证书的合法性,装了假证书直接连不上,这也算拦截的瓶颈。第四种是“规则冲突”,很多人会加一堆拦截规则,比如只拦截某个域名、只拦截POST请求,规则加太多,Burp每收到一个请求都要挨个匹配,反而变慢了。
二、瓶颈的具体场景与优化措施
知道了瓶颈的类型,就得对应找解决办法,而且每个办法都得结合实际场景用,不然就是纸上谈兵。
2.1 大请求/大响应的瓶颈优化
比如你要做一个上传测试,要传100M的视频文件,Burp默认的设置很可能扛不住,要么上传到一半卡住,要么Burp直接崩溃。这是因为Burp默认的内存分配是按普通请求来的,大请求需要更多的内存和临时存储。优化的办法很简单,就是改Burp的配置,把大请求的存储改成用硬盘存,而不是全放内存里。
举个具体的例子,比如你要拦截一个POST类型的大文件上传请求,先在Burp的Proxy选项里找到“Intercept Client Requests”,然后加一条规则,专门处理大请求。具体的配置规则用JSON格式写的话,就是下面这样(技术栈:Burp Suite配置规则):
{
"type": "proxy",
"action": "intercept",
"conditions": [
{
"type": "request-size",
"operator": "greater-than",
"value": 10485760, // 10M,单位是字节,超过这个大小的请求单独处理
"unit": "bytes"
},
{
"type": "method",
"operator": "equals",
"value": "POST"
}
],
"action-settings": {
"use-disk-storage": true // 大请求用硬盘存储,不用内存
}
}
这个配置的作用是,只要是超过10M的POST请求,Burp就直接存到硬盘里,不会占太多内存,也就不会卡。另外,如果你经常要处理大响应,比如网站返回的大JSON数据,还可以在Burp的Proxy选项里找到“Response Interception”,同样加类似的规则,把大响应的存储也改成硬盘。
2.2 乱序请求与丢包的瓶颈优化
现在的网页都是前后端分离的,一个页面要发十几个甚至几十个请求很正常,比如打开一个直播页面,要同时拿直播地址、弹幕列表、用户信息、礼物列表,Burp如果按顺序处理不过来,就会出现请求乱序,导致网页加载不全。这种情况的瓶颈主要是Burp的并发处理能力不够,或者你的网络带宽不够。
优化的办法有两个,第一个是调大Burp的并发数,在Burp的Proxy选项里找到“Options”,然后找到“Connection Handling”,把“Maximum concurrent connections”从默认的10改成50甚至100,这样Burp就能同时处理更多的请求,不会出现排队的情况。第二个是过滤不需要的请求,比如网页加载的时候会发很多静态资源的请求,比如CSS、JS、图片,这些请求一般不需要拦截,你可以加一条规则,直接跳过这些请求的拦截,减少Burp的处理压力。
比如你要跳过所有静态资源的拦截,配置规则如下(技术栈:Burp Suite配置规则):
{
"type": "proxy",
"action": "do-not-intercept", // 不拦截
"conditions": [
{
"type": "extension",
"operator": "in",
"value": [".css", ".js", ".jpg", ".png", ".gif", ".svg"] // 静态资源后缀
}
]
}
加了这条规则之后,Burp收到静态资源的请求就直接转发,不会存下来,也就不会占用处理能力,其他需要拦截的请求就能更快处理,减少乱序和丢包的概率。
2.3 证书校验的瓶颈优化
HTTPS请求的拦截是很多人的痛点,Burp要拦截HTTPS,得装自己的证书,但是很多浏览器、手机APP会校验证书的合法性,比如证书的签发机构、有效期、域名匹配,装了Burp的假证书之后,APP会直接报错,连不上网。这种情况的瓶颈主要是证书的校验机制,优化的办法就是让Burp的证书看起来更像真的。
比如你要拦截一个手机APP的HTTPS请求,首先要把Burp的证书导出,然后导入到手机的系统证书里(不是用户证书,很多APP会校验证书是不是系统级的)。另外,如果你要拦截的是自己开发的APP,还可以在开发的时候把证书校验关掉,或者把Burp的证书加入到APP的信任列表里。
举个例子,比如你开发的是一个安卓APP,用的是OkHttp框架,要把Burp的证书加入信任列表,代码如下(技术栈:安卓OkHttp框架):
// 初始化OkHttp客户端
OkHttpClient.Builder builder = new OkHttpClient.Builder();
// 信任Burp的证书,burpCert是Burp导出的证书字节数组
builder.sslSocketFactory(sslSocketFactory, trustManager)
.hostnameVerifier((hostname, session) -> true); // 临时关闭域名校验,开发用
这段代码的作用是,让OkHttp信任Burp的证书,不会因为证书不合法而拒绝连接,这样就能正常拦截APP的HTTPS请求了。
2.4 规则冲突的瓶颈优化
很多人用Burp的时候,会加一堆拦截规则,比如只拦截某个域名、只拦截POST请求、只拦截带某个参数的请求,规则加太多,Burp每收到一个请求都要挨个匹配,反而变慢了,甚至出现规则冲突,导致该拦截的没拦截,不该拦截的反而拦截了。
优化的办法就是整理规则,把相似的规则合并,去掉不必要的规则。比如你要拦截某个域名下的POST请求,不要分开加两条规则,一条拦截域名,一条拦截POST,而是合并成一条规则。另外,规则的顺序也很重要,把常用的规则放在前面,这样Burp匹配的时候能更快找到对应的规则,减少匹配时间。
比如你要拦截test.com域名下,带userId参数的POST请求,合并后的规则如下(技术栈:Burp Suite配置规则):
{
"type": "proxy",
"action": "intercept",
"conditions": [
{
"type": "domain",
"operator": "equals",
"value": "test.com" // 只拦截test.com的请求
},
{
"type": "method",
"operator": "equals",
"value": "POST" // 只拦截POST请求
},
{
"type": "parameter",
"operator": "exists",
"value": "userId" // 只拦截带userId参数的请求
}
]
}
这样一条规则就能搞定,比三条分开的规则效率高很多,也不会出现冲突。
三、各优化措施的应用场景、优缺点与注意事项
不同的优化措施有不同的适用场景,也有各自的优缺点,用错了反而会出问题。
比如把大请求的存储改成硬盘,适合上传大文件、下载大响应的场景,优点是能减少内存占用,避免Burp崩溃,缺点是读写硬盘的速度比内存慢,可能会稍微增加一点延迟,所以不要把所有请求都改成硬盘存储,只针对大请求就行。
调大并发数适合多请求的场景,比如前后端分离的网页、多接口的APP,优点是能同时处理更多请求,减少乱序和丢包,缺点是如果你的电脑配置不够,调太大的并发数反而会让电脑变卡,所以要根据自己的电脑配置调整,一般调到50到100就够了。
证书优化适合HTTPS拦截的场景,优点是能正常拦截HTTPS请求,缺点是要注意证书的安全,不要随便把证书加入系统信任列表,用完之后要及时删掉,不然会有安全风险。
规则优化适合规则多的场景,优点是能提高匹配效率,减少规则冲突,缺点是整理规则需要花时间,要确保规则的逻辑正确,不然会漏掉需要拦截的请求。
另外,还有几个通用的注意事项:第一,不要在生产环境用Burp拦截,不然会影响生产环境的正常运行;第二,拦截完请求之后要及时关掉拦截,不然会影响自己的正常上网;第三,定期清理Burp的缓存和日志,不然会占用太多硬盘空间。
四、文章总结
Burp Suite的代理拦截过程中,瓶颈主要来自大请求/大响应的内存占用、多请求的并发处理、HTTPS证书校验、规则冲突这几个方面,对应的优化措施就是改配置、调参数、优化规则、处理证书。这些优化措施都要结合具体的场景用,不能一概而论,比如大请求用硬盘存储,多请求调大并发数,HTTPS处理证书,多规则整理合并。
只要把这些瓶颈都解决了,Burp就能用得更顺畅,不管是做开发调试还是做安全测试,都能事半功倍。另外,用Burp的时候还要注意安全,不要随便拦截别人的请求,不要随便改别人的请求内容,遵守相关的法律法规和道德规范。
Comments