一、前言与简介

在Web安全测试领域,Burp Suite毫无疑问是最具统治力的工具。无论是日常的
渗透测试、漏洞挖掘、还是安全研究与Bug Bounty,Burp Suite都是安全从业
人员手中不可或缺的瑞士军刀。然而,很多人对Burp的使用仍停留在简单的
抓包和Intruder暴力破解层面,对其强大的插件生态、扫描策略定制、
Session管理等高级功能知之甚少。

本文将从零开始,系统性地讲解Burp Suite的核心模块使用、高级配置技巧、
插件开发全流程以及完整的Web渗透测试实战案例。无论你是刚入门的安全初学
者,还是有一定经验的渗透测试工程师,都能从中获取实战可用的知识。

【提示】本文所有操作均在授权环境下进行,请勿用于非法用途。未经授权的
渗透测试行为可能违反《网络安全法》及相关法律法规。

本文适合人群:
- Web安全初学者,希望系统掌握Burp Suite
- 渗透测试工程师,希望提升Burp使用效率
- 安全研究人员,希望开发自定义Burp插件
- Bug Bounty猎人,希望优化工作流程

阅读本文你将掌握:
- Burp Suite全部核心模块的深度使用方法
- Intruder四种攻击类型的实战场景
- 使用Java和Python开发自定义Burp插件
- 常用BApp Store插件的配置与使用
- 宏录制与Session处理机制
- Collaborator服务器的高级用法
- 完整的Web应用渗透测试流程


二、Burp Suite概述与版本对比
 

Burp Suite由PortSwigger公司开发,创始人Dafydd Stuttard同时也是《The
Web Application Hacker's Handbook》的作者。Burp Suite不仅仅是一个代理
工具,而是一个完整的Web安全测试平台,集成了抓包代理、漏洞扫描、
请求重放、暴力破解、会话管理、插件扩展等全方位功能。

目前Burp Suite提供三个主要版本:社区版(Community Edition)、专业版
(Professional Edition)和企业版(Enterprise Edition)。

各版本功能对比表:

| 功能特性            | 社区版(免费) | 专业版(付费)   | 企业版(付费)     |
|---------------------|-------------|---------------|-----------------|
| 代理抓包功能        | 支持         | 支持           | 支持             |
| Target站点地图      | 基础功能     | 完整功能       | 完整功能         |
| Repeater请求重放    | 支持         | 支持           | 支持             |
| Intruder暴力破解    | 有限制       | 完整功能       | 完整功能         |
| Sequencer随机性分析  | 不支持       | 支持           | 支持             |
| Decoder解码器       | 支持         | 支持           | 支持             |
| Comparer比较器      | 支持         | 支持           | 支持             |
| 主动漏洞扫描        | 不支持       | 支持           | 支持             |
| 被动漏洞扫描        | 有限         | 完整功能       | 完整功能         |
| 扫描策略定制        | 不支持       | 支持           | 支持             |
| Burp Collaborator   | 不支持       | 支持(云端)     | 支持(私有部署)   |
| BApp Store插件市场   | 部分免费     | 全部可用       | 全部可用         |
| REST API接口        | 不支持       | 支持           | 支持             |
| CI/CD集成           | 不支持       | 有限支持       | 完整支持         |
| 多用户协作          | 不支持       | 不支持         | 支持             |
| 分布式扫描          | 不支持       | 不支持         | 支持             |
| 报告导出            | 不支持       | 支持           | 支持             |
| 价格                | 免费         | 约449美元/年   | 联系销售获取报价 |

【注意】社区版的Intruder模块有速率限制和功能限制,专业版没有这些限制。
对于专业安全测试工作,强烈建议购买专业版许可证。

各版本适用场景:

社区版适用场景:
- 安全入门学习
- 简单的HTTP请求分析和修改
- 手动漏洞验证
- 非商业用途的小规模测试

专业版适用场景:
- 专业渗透测试服务
- Bug Bounty漏洞挖掘
- 安全审计与合规评估
- 安全研究与漏洞分析

企业版适用场景:
- 大型企业内部持续安全监控
- DevSecOps CI/CD流水线集成
- 大规模资产漏洞扫描与管理
- 多团队协作的安全测试


三、环境配置与浏览器代理设置

3.1 Burp Suite安装

下载地址:https://portswigger.net/burp/releases

安装步骤(以Windows为例):

步骤1:下载安装包
- 访问PortSwigger官网下载页面
- 选择对应操作系统的安装包(Windows为.exe或.jar)

步骤2:安装JDK环境
Burp Suite基于Java开发,需要JDK环境支持。

```
# 检查Java版本(建议JDK 17+)
java -version

# 输出示例
# openjdk version "17.0.8" 2023-08-24
# OpenJDK Runtime Environment (build 17.0.8+0)
# OpenJDK 64-Bit Server VM (build 17.0.8+0)
```

步骤3:安装Burp Suite
- 运行下载的安装程序
- 按照向导提示完成安装
- 首次启动时选择Community或Professional版本
- 专业版用户输入许可证密钥激活

步骤4:配置Burp Suite内存
建议为Burp Suite分配充足的内存,避免在大量数据处理时出现卡顿。

```
# 命令行启动并指定内存
java -Xmx4g -jar burpsuite_pro.jar
```

【提示】对于大型目标的扫描,建议至少分配4GB内存。如果内存不足,
可能导致扫描中断或Burp崩溃。

3.2 浏览器代理设置

Burp Suite默认监听127.0.0.1:8080,需要配置浏览器将流量代理到该地址。

方法一:手动设置浏览器代理(以Firefox为例)

步骤1:打开Firefox设置
- 菜单 -> 设置 -> 常规 -> 网络设置 -> 设置

步骤2:配置代理
- 选择"手动代理配置"
- HTTP代理:127.0.0.1
- 端口:8080
- 勾选"也将此代理用于HTTPS"
- 点击确定保存

方法二:使用浏览器代理插件(推荐)

推荐使用FoxyProxy或SwitchyOmega插件,可以快速切换代理状态。

FoxyProxy配置步骤:
步骤1:安装FoxyProxy插件
步骤2:添加代理配置
- 代理名称:Burp Suite
- 代理类型:HTTP
- 代理地址:127.0.0.1
- 代理端口:8080

步骤3:一键切换代理模式
- 点击FoxyProxy图标
- 选择"Burp Suite"配置即可启用

【提示】使用FoxyProxy的好处是可以快速在"直连"和"Burp代理"之间切换,
不影响其他网页的正常浏览。

3.3 安装Burp CA证书

默认情况下,浏览器拦截HTTPS流量时会显示证书不受信任的错误。需要将
Burp Suite的CA证书导入浏览器信任列表。

安装步骤:

步骤1:配置好代理后,在浏览器访问以下地址
```
http://burp
```

步骤2:点击右上角的"CA Certificate"按钮下载证书文件
- 证书文件名:cacert.der

步骤3:在Firefox中导入证书
- 菜单 -> 设置 -> 隐私与安全 -> 查看证书 -> 导入
- 选择下载的cacert.der文件
- 勾选"信任此CA以识别网站"和"信任此CA以识别邮件用户"
- 点击确定完成导入

步骤4:验证HTTPS拦截是否正常
- 访问任意HTTPS网站
- 确认浏览器不再提示证书错误
- 在Burp的Proxy -> HTTP history中查看是否成功捕获HTTPS流量

【注意】安装Burp CA证书后,意味着Burp可以解密你的所有HTTPS流量。
在非测试环境下,建议禁用Burp代理或移除CA证书,防止敏感信息泄露。

3.4 Burp Suite全局设置优化

Proxy选项卡 -> Options -> Proxy Listeners

建议进行以下优化配置:

| 配置项                  | 默认值        | 建议值           | 说明                    |
|-------------------------|--------------|-----------------|-------------------------|
| Bind to address         | 127.0.0.1    | 127.0.0.1       | 安全考虑,仅本地监听    |
| Bind to port            | 8080         | 8080            | 默认端口                |
| Request handling        | 不勾选       | 勾选            | 统一处理HTTP请求        |
| Intercept on/off        | Intercept on | Intercept off   | 关闭拦截,避免手动操作  |
| Match and replace rules | 默认          | 根据需求添加    | 自定义匹配替换规则      |

User options -> Connections -> Upstream Proxy Servers

如果测试目标需要通过上游代理访问,在此处配置上游代理信息。

User options -> SSL -> TLS Protocols
建议保持默认设置,确保TLS版本兼容性。


四、Proxy模块详解
 

Proxy模块是Burp Suite最基础也是最核心的功能模块,它充当浏览器与目标
服务器之间的中间人,负责拦截、查看和修改HTTP/HTTPS请求与响应。

4.1 HTTP历史记录

Proxy -> HTTP history 选项卡记录了所有经过Burp代理的HTTP请求和响应。

HTTP历史记录的核心功能:

- 请求列表:显示每个HTTP请求的概要信息
  - Host:目标主机
  - Path:请求路径
  - Method:HTTP方法(GET/POST/PUT/DELETE等)
  - Status code:响应状态码
  - URL:完整请求URL
  - Length:响应体长度
  - MIME type:响应内容类型
  - Extension:URL文件扩展名
  - Title:HTML页面标题
  - Comment:自定义注释(可手动添加)

- 过滤器(Filter Bar)
  点击过滤栏可以设置显示过滤条件,快速定位特定请求。

  常用过滤条件:
  - 按MIME类型过滤:只显示HTML/Script/CSS/图片等
  - 按状态码过滤:只显示特定状态码的请求
  - 按关键词过滤:搜索请求/响应中包含特定内容
  - 按扩展名过滤:显示/隐藏特定扩展名的请求
  - 按注释过滤:显示带有特定注释的请求
  - 按scope过滤:只显示目标范围内的请求

【提示】在大型测试中,HTTP历史记录可能包含成千上万条记录。善用过滤器
可以大幅提高工作效率。建议在测试前设置好scope,配合scope过滤使用。

- 请求/响应详情查看
  点击任意一条历史记录,右侧面板显示该请求的详细内容。
  - Request:显示完整的HTTP请求,包含请求行、请求头、请求体
  - Response:显示完整的HTTP响应,包含状态行、响应头、响应体
  - 可切换Raw/Params/Headers/Hex等视图模式

4.2 WebSockets历史记录

Proxy -> WebSockets history 选项卡记录所有WebSocket通信数据。

WebSocket历史记录功能:
- 显示每个WebSocket连接的完整消息历史
- 支持按连接方向(客户端->服务端 / 服务端->客户端)筛选
- 支持查看消息的Hex视图
- 支持发送到Repeater进行消息重放

【注意】WebSockets历史记录默认会被Burp记录,但在某些情况下可能需要
在Proxy Options中确认WebSocket拦截功能已启用。

4.3 拦截功能

Proxy -> Intercept 选项卡提供实时拦截HTTP请求和响应的能力。

拦截功能配置选项:

| 配置项                      | 说明                                    |
|-----------------------------|-----------------------------------------|
| Intercept is on/off         | 开启/关闭拦截功能                       |
| Forward                     | 放行当前拦截的请求/响应                 |
| Drop                        | 丢弃当前拦截的请求/响应                 |
| Intercept Client Requests   | 配置拦截客户端请求的规则               |
| Intercept Server Responses  | 配置拦截服务端响应的规则               |
| Intercept WebSocket Messages| 配置拦截WebSocket消息的规则            |

拦截规则配置示例:

场景1:只拦截POST请求
- 添加规则
- Match type: HTTP method
- Match value: POST
- Action: Intercept

场景2:只拦截特定域名的请求
- 添加规则
- Match type: Host header
- Match value: target.example.com
- Action: Intercept

场景3:只拦截包含Cookie的请求
- 添加规则
- Match type: Request header
- Match value: Cookie
- Action: Intercept

场景4:只拦截JSON格式的响应
- 添加规则
- Match type: Response Content-Type header
- Match value: application/json
- Action: Intercept

【提示】在实际测试中,建议关闭默认拦截(Intercept is off),让所有
请求自动通过。需要时再通过HTTP history查看和修改。频繁的手动放行
会严重影响测试效率。

4.4 拦截规则高级配置

Proxy -> Options -> Intercept rules

支持多条件组合,使用AND/OR逻辑连接。每条规则包含三部分:

- Match type:匹配类型
  - Request method、URL、HTTP header、Body content等
  
- Match condition:匹配条件
  - Contains、Does not contain、Matches regex等

- Action:执行动作
  - Intercept(拦截)、Do not intercept(不拦截)

高级规则示例:

规则1:拦截所有包含登录凭据的POST请求
- AND条件组
  - Match: HTTP method = POST
  - Match: Request body contains password
- Action: Intercept

规则2:不拦截静态资源请求
- AND条件组
  - Match: URL path matches regex \.(jpg|png|gif|css|js)$
- Action: Do not intercept

4.5 Match and Replace 功能

Proxy -> Options -> Match and Replace

此功能可以在请求/响应经过Burp时自动执行文本匹配和替换,无需手动
修改每条请求。

常见应用场景:

场景1:修改User-Agent绕过简单的WAF检测
- Match (regex): User-Agent: .* 
- Replace: User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1)
- Type: Request header

场景2:自动移除客户端IP泄露头
- Match (regex): X-Forwarded-For: .*
- Replace: (留空)
- Type: Request header

场景3:在所有请求中添加自定义Header
- Match (regex): ^$
- Replace: X-Custom-Header: CustomValue
- Type: Request header

场景4:替换响应中的敏感信息
- Match (regex): \b\d{16,19}\b (匹配信用卡号模式)
- Replace: [REDACTED-CARD]
- Type: Response body

【警告】Match and Replace规则会对所有匹配的请求/响应生效。请确保
正则表达式正确,避免误替换导致请求异常。建议在使用前先用测试数据
验证规则效果。


五、Target模块实战
 

Target模块用于管理和分析目标站点信息,包括站点地图浏览、目标范围
设置、漏洞信息汇总等功能。

5.1 站点地图分析

Target -> Site map 选项卡以树形结构展示目标站点的所有URL和页面关系。

站点地图的核心价值:
- 直观展示目标站点的目录结构和页面层级关系
- 快速发现隐藏路径和敏感接口
- 查看每个请求的完整详情
- 发现测试遗漏的功能点

站点地图的三个视图层级:

层级1:站点域名级别
- 显示所有访问过的目标域名
- 展开后显示各域名下的路径结构

层级2:目录/路径级别
- 以树形结构展示URL路径层级
- 叶子节点表示具体的页面或接口

层级3:请求级别
- 显示该路径下的具体HTTP请求
- 点击可查看请求和响应详情

实战技巧:

技巧1:快速发现敏感接口
在站点地图中,重点检查以下路径模式:
- /api/  - API接口目录
- /admin/ - 管理后台
- /debug/ - 调试接口
- /config/ - 配置文件
- /backup/ - 备份文件
- /test/ - 测试页面
- /.git/ - 版本控制泄露
- /.env - 环境配置文件

技巧2:利用Content-Type筛选接口
在站点地图中,可以按响应的Content-Type筛选:
- application/json - JSON API接口
- application/xml - XML接口
- text/xml - SOAP接口

5.2 目标范围设置

Target -> Scope 选项卡用于配置测试范围,限定Burp的操作目标。

Scope配置的重要性:
- 控制扫描范围,避免测试越界目标
- 提高Intruder等模块的效率
- 配合Proxy过滤,只记录目标范围内的请求
- 防止误操作非目标域名

Scope配置步骤:

步骤1:打开Scope设置
- Target -> Scope -> Add

步骤2:添加目标范围
- 添加单个URL: https://target.example.com
- 添加通配符匹配: https://*.example.com
- 添加路径前缀: https://target.example.com/api/
- 添加正则匹配: ^https://target\.example\.com/(api|admin)/

步骤3:配置Scope过滤选项
- Include in scope:包含在范围内的目标
- Exclude from scope:从范围内排除的目标

步骤4:在Proxy中启用Scope过滤
- Proxy -> Options -> 勾选"And only in-scope items"
- Proxy -> HTTP history -> 过滤栏勾选"Show only in-scope items"

【注意】Scope设置不影响已有的HTTP历史记录,只影响新产生的请求。
如果需要清除历史记录中的非目标请求,可以右键选择"Delete items"。

5.3 目标信息汇总

Target -> Site map -> 右键站点 -> "Engagement tools"

Burp提供了一系列 Engagement tools 用于目标分析:

工具1:Find comments
- 搜索目标站点所有页面中的HTML注释
- 可发现隐藏的开发信息、测试账号、内部接口等

工具2:Find scripts
- 查找目标站点引用的所有JavaScript文件
- 有助于发现隐藏的API接口和业务逻辑

工具3:Find reference
- 查找目标站点中的外部链接和引用
- 发现关联系统和子域名

工具4:Analyze target
- 统计目标站点的各类信息
- 包括静态/动态URL数量、参数数量等
- 输出详细的统计分析报告

工具5:Discover content
- 对目标站点进行目录爆破
- 使用内置字典和自定义字典
- 发现隐藏目录和文件



六、Scanner模块详解
 

Scanner模块是Burp Suite专业版的核心功能,支持主动扫描和被动扫描,
能够自动发现Web应用中的安全漏洞。

6.1 主动扫描

主动扫描(Active Scan)会向目标发送大量探测请求,用于发现注入类
漏洞、逻辑漏洞等。

主动扫描的触发方式:

方式1:从Proxy历史记录发起
- 右键HTTP历史记录中的请求
- 选择"Do active scan"

方式2:从Repeater发起
- 在Repeater中右键
- 选择"Do active scan"

方式3:从Target站点地图发起
- 右键目标URL或目录
- 选择"Actively scan this host"或"Actively scan this branch"

方式4:批量扫描
- Dashboard -> New scan -> Active scan
- 选择目标URL列表

主动扫描配置选项:

| 配置项                | 说明                                      |
|-----------------------|-------------------------------------------|
| Scan type             | Crawl and audit / Crawl only / Audit only |
| URL scope             | 在范围内 / 自定义URL列表                  |
| Crawl configuration   | 爬虫深度、最大URL数、是否提交表单等       |
| Audit configuration   | 审计策略、并发数、超时设置等              |
| Application login     | 配置登录凭据用于扫描需要认证的页面        |

扫描策略配置详解:

Dashboard -> New scan -> Audit configuration -> Check Groups

Burp内置了多个审计检查组:

检查组1:Injection vulnerabilities(注入漏洞检查)
- SQL注入(包括盲注、错误注入、时间盲注等)
- 操作系统命令注入
- LDAP注入
- XML/SOAP注入
- 表达式语言注入
- 模板注入(SSTI)
- HTTP请求走私

检查组2:Input handling(输入处理检查)
- 跨站脚本攻击(XSS,包括反射型、存储型、DOM型)
- HTTP响应头注入
- 开放重定向
- 路径遍历
- HTTP请求拆分

检查组3:Server-side vulnerabilities(服务端漏洞检查)
- 服务器端请求伪造(SSRF)
- XML外部实体注入(XXE)
- 不安全的反序列化
- 文件上传漏洞

检查组4:Client-side vulnerabilities(客户端漏洞检查)
- DOM型XSS
- 开放重定向
- Clickjacking
- Content Security Policy绕过

检查组5:Authentication and session(认证与会话检查)
- 认证绕过
- 会话固定
- 会话令牌预测
- 密码强度策略

检查组6:Business logic(业务逻辑检查)
- 并发问题
- 价格篡改
- 工作流绕过

检查组7:Miscellaneous checks(杂项检查)
- 信息泄露
- 安全配置错误
- 不安全的HTTP头
- SSL/TLS配置问题

【提示】根据测试需求,可以选择性地启用或禁用检查组。例如,在只需要
测试注入漏洞时,可以禁用其他检查组以提高扫描速度。

6.2 被动扫描

被动扫描(Passive Scan)在正常浏览流量经过Burp代理时自动执行,不会
向目标发送额外的探测请求。

被动扫描的优势:
- 零额外流量,不会对目标造成负载
- 实时分析,浏览即扫描
- 不会触发WAF告警
- 适合在生产环境中使用

被动扫描覆盖的漏洞类型:
- 信息泄露(错误消息、调试信息、源代码)
- 不安全的Cookie设置(缺少HttpOnly/Secure/SameSite属性)
- 缺失的安全响应头
- 敏感信息在HTML注释中泄露
- 密码字段的自动完成功能
- 表单字段类型与输入验证不匹配

被动扫描配置:
- Dashboard -> Passive scanning
- 可以配置被动扫描的检查项和严重性级别阈值

6.3 扫描结果分析

扫描完成后,在Dashboard或Target -> Issues选项卡中查看发现的漏洞。

漏洞信息展示:
- Severity(严重性):High / Medium / Low / Information
- Confidence(置信度):Certain / Firm / Tentative
- Issue detail:漏洞详细描述
- Issue background:漏洞背景知识
- Remediation detail:修复建议
- References:参考链接
- Request/Response:触发漏洞的具体请求和响应

【提示】扫描结果中的漏洞严重性级别仅供参考,需要人工验证确认。
有些误报需要结合业务逻辑判断。建议对High级别的漏洞逐一验证。

6.4 漏洞验证

对于扫描器发现的漏洞,需要进行人工验证确认其真实性。

验证方法:

方法1:使用Repeater重放请求
- 右键漏洞条目
- 选择"Send to Repeater"
- 在Repeater中修改参数重新发送请求
- 观察响应确认漏洞是否存在

方法2:检查完整的请求和响应
- 查看漏洞条目中的Request和Response标签页
- 分析payload和响应内容
- 确认漏洞是否被成功利用

方法3:对比正常请求和异常请求
- 将漏洞请求与正常请求发送到Comparer
- 对比两者差异,确认漏洞触发条件


七、Intruder模块详解

Intruder模块是Burp Suite最强大的暴力破解和参数模糊测试工具,支持
四种攻击类型,能够应对各种复杂的安全测试场景。

7.1 四种攻击类型详解

Intruder支持以下四种攻击类型:

攻击类型1:Sniper(狙击手模式)
- 将一个payload列表依次填入每个位置
- 如果有2个位置,每次只攻击一个位置
- 其他位置保持原值不变
- 总请求数 = 位置数 × payload数量

攻击类型2:Battering Ram(攻城锤模式)
- 所有位置使用相同的payload列表
- 每次请求所有位置使用相同的payload值
- 总请求数 = payload数量

攻击类型3:Pitchfork(叉子模式)
- 每个位置使用不同的payload列表
- 多个位置同步前进,即第N个请求使用各列表的第N个值
- 总请求数 = 最短payload列表的长度

攻击类型4:Cluster Bomb(集束炸弹模式)
- 每个位置使用不同的payload列表
- 对所有payload组合进行笛卡尔积排列
- 总请求数 = payload列表1长度 × payload列表2长度 × ...

四种攻击类型对比表:

| 攻击类型      | Payload列表数量 | 位置间关系    | 适用场景           | 总请求数公式           |
|---------------|----------------|--------------|-------------------|------------------------|
| Sniper        | 1个            | 独立逐个测试 | 单参数模糊测试     | 位置数 × payload数     |
| Battering Ram | 1个            | 同步相同值   | 多参数同值测试     | payload数              |
| Pitchfork     | 每位置1个       | 同步不同值   | 多参数对应值测试   | 最短列表长度           |
| Cluster Bomb  | 每位置1个       | 全组合排列   | 多参数组合测试     | 各列表长度之积         |

7.2 实际攻击场景示例

场景1:Sniper模式 - 单参数SQL注入测试

目标:测试用户ID参数是否存在SQL注入
原始请求:
```
POST /api/user HTTP/1.1
Host: target.example.com
Content-Type: application/json

{"user_id": "1"}
```

配置步骤:
步骤1:将请求发送到Intruder(右键 -> Send to Intruder)
步骤2:在Positions选项卡中清除所有自动标记
步骤3:手动选择payload位置
- 标记位置:§1§(即payload为1的位置)
- 最终请求体:{"user_id": "§1§"}

步骤4:在Payloads选项卡中加载SQL注入payload列表

部分SQL注入测试payload列表:
```
'
"
\
'
OR'1'='1
' OR '1'='1' --
' OR '1'='1' #
' UNION SELECT NULL --
' UNION SELECT NULL,NULL --
' UNION SELECT NULL,NULL,NULL --
'; WAITFOR DELAY '0:0:5' --
' AND SLEEP(5) --
' AND (SELECT * FROM (SELECT(SLEEP(5)))a) --
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT VERSION())))
```

步骤5:在Options选项卡中配置匹配规则
- Grep - Match:添加关键词 "error"、"SQL"、"syntax"
- 可以快速定位出现SQL错误信息的响应

步骤6:点击"Start attack"开始攻击
步骤7:分析结果
- 按Length(响应长度)排序,查找异常长度的响应
- 按Status code排序,查找返回非200状态码的请求
- 查看包含错误关键词的响应

场景2:Battering Ram模式 - Cookie会话固定测试

目标:测试多个接口是否使用相同的Session Token
配置:将Session Token作为payload,所有位置使用相同值
通过Battering Ram模式快速验证Session共享问题。

场景3:Pitchfork模式 - 用户名密码批量验证

目标:使用已知的用户名和密码对列表进行登录测试
原始请求:
```
POST /login HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

username=admin&password=admin123
```

配置步骤:
步骤1:选择攻击类型为Pitchfork
步骤2:设置两个payload位置
- §admin§(用户名)
- §admin123§(密码)

步骤3:Payload Set 1加载用户名列表
```
admin
administrator
root
test
user
guest
support
```

步骤4:Payload Set 2加载密码列表
- 与用户名列表一一对应

步骤5:配置Options
- 添加Grep - Match关键词 "login failed"、"invalid"、"error"
- 设置Request Engine的并发数和延迟

步骤6:开始攻击并分析结果

【注意】使用Intruder进行密码爆破时,请注意目标是否有以下防护措施:
- 账号锁定机制
- 验证码
- 频率限制
如果存在以上防护,需要调整攻击策略或间隔时间。

场景4:Cluster Bomb模式 - 多参数组合模糊测试

目标:测试搜索接口的两个参数的交互行为
原始请求:
```
GET /search?q=test&sort=asc HTTP/1.1
Host: target.example.com
```

配置步骤:
步骤1:选择攻击类型为Cluster Bomb
步骤2:设置两个payload位置
- §test§(搜索关键词q参数)
- §asc§(排序sort参数)

步骤3:Payload Set 1 - 关键词列表
```
test
admin
test' OR 1=1 --
../../etc/passwd
<script>alert(1)</script>
```

步骤4:Payload Set 2 - 排序参数列表
```
asc
desc
id; DROP TABLE
1 UNION SELECT 1
```

步骤5:开始攻击,生成 5 × 4 = 20 个请求

7.3 Payload类型与处理

Intruder支持多种Payload类型和处理方式:

Payload类型:

| 类型                | 说明                                     |
|---------------------|------------------------------------------|
| Simple list         | 简单列表,手动输入或从文件加载           |
| Runtime file        | 运行时文件,从文件逐行读取payload         |
| Numbers             | 数字序列,指定范围和步长                 |
| Brute forcer        | 暴力破解,指定字符集和长度范围            |
| Null payloads       | 空payload,发送固定字符串                |
| Character blocks    | 字符块,用于缓冲区溢出测试                |
| Character substitution | 字符替换,如大小写、编码替换           |
| Case modification   | 大小写变换                               |
| Recursive grep      | 递归提取,从响应中提取下一次的payload     |
| Illegal Unicode     | 非法Unicode字符                          |
| Character frobber   | 字符逐位变换                              |
| Bit flipper         | 位翻转                                    |

Payload Processing规则:

可以对payload列表中的每个值进行额外处理:

规则1:Add prefix(添加前缀)
- 在payload前添加指定字符串
- 例:prefix为",payload为"admin",结果为"admin"

规则2:Add suffix(添加后缀)
- 在payload后添加指定字符串

规则3:Match/replace(匹配替换)
- 对payload执行正则匹配并替换

规则4:Base64-encode(Base64编码)
- 将payload进行Base64编码

规则5:URL-encode(URL编码)
- 对payload进行URL编码

规则6:Hash(哈希计算)
- 对payload进行MD5/SHA1/SHA256等哈希

规则7:Case modification(大小写变换)
- 转换为大小写、首字母大写等

Payload Encoding配置:

在Options选项卡中,可以配置URL编码字符集:
- 默认编码字符集包括:空格、&、=、+、#等特殊字符
- 可以自定义需要编码的字符
- 可以选择对整个payload进行编码还是仅对特殊字符编码

7.4 Intruder高级配置

Options选项卡中的关键配置项:

| 配置区域          | 配置项                    | 说明                          |
|-------------------|---------------------------|-------------------------------|
| Request Engine    | Number of threads         | 并发线程数(建议10-20)       |
| Request Engine    | Number of retries         | 失败重试次数(建议3次)       |
| Request Engine    | Pause before retry        | 重试前等待时间                |
| Request Engine    | Max concurrent requests    | 最大并发请求数                |
| Redirects         | Follow redirections       | 是否跟随重定向(最多5次)     |
| Redirects         | Process cookies in redirects | 重定向时是否处理Cookie    |
| Speed             | Delay between requests    | 请求间隔时间(毫秒)          |
| Speed             | Jitter                    | 随机抖动时间(模拟人类行为)  |
| Grep - Match      | 添加匹配关键词            | 在响应中搜索特定字符串        |
| Grep - Extract    | 正则提取响应内容          | 提取Token、错误码等           |
| Grep - Extract    | 定义提取的正则表达式      | 自动提取到结果表格中          |

Grep - Extract 实战配置示例:

场景:提取CSRF Token用于后续请求
- 添加Grep - Extract规则
- 设置正则表达式:name="csrf_token" value="([^"]*)"
- 结果表格中将新增一列显示提取的Token值


八、Repeater模块详解

Repeater模块允许安全测试人员对HTTP请求进行手动修改和重发,是漏洞
验证和利用过程中最常用的工具。

8.1 请求重放与修改

基本操作流程:

步骤1:发送请求到Repeater
- 在Proxy历史记录中右键 -> Send to Repeater
- 或使用快捷键 Ctrl+R

步骤2:查看请求
- 左侧面板显示完整的HTTP请求
- 可以修改请求的任何部分(请求行、请求头、请求体)

步骤3:发送请求
- 点击"Send"按钮发送修改后的请求
- 右侧面板显示服务器响应

步骤4:分析响应
- 查看响应状态码、响应头、响应体
- 使用Hex/Render/Render(浏览器视图)等模式查看

Repeater面板功能详解:

| 区域          | 功能                                    |
|---------------|-----------------------------------------|
| 请求面板      | 显示和编辑HTTP请求                      |
| 响应面板      | 显示服务器响应                          |
| Target        | 显示当前请求的目标主机和端口            |
| 标签页        | 支持多个请求标签页,每个标签独立工作   |
| 视图模式      | Pretty / Raw / Hex / 还可以查看参数    |

8.2 JSON请求处理

现代Web应用大量使用JSON格式的API请求。Repeater对JSON请求有良好的
支持。

JSON请求测试示例:

原始请求:
```
POST /api/v1/user/profile HTTP/1.1
Host: api.target.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Length: 85

{
    "user_id": 1001,
    "action": "update",
    "data": {
        "name": "John",
        "email": "john@example.com",
        "role": "user"
    }
}
```

测试场景1:越权测试 - 修改role字段
将请求中的 "role": "user" 修改为 "role": "admin"
发送请求观察是否成功提权。

测试场景2:IDOR测试 - 修改user_id
将 "user_id": 1001 修改为其他用户ID
观察是否可以访问其他用户的数据。

测试场景3:类型混淆测试
将 "user_id": 1001 修改为以下值:
```
"user_id": "1001"
"user_id": 1001.0
"user_id": true
"user_id": {"$gt": 0}
"user_id": [1001, 1002, 1003]
"user_id": null
```

测试场景4:JSON注入测试
在JSON值中注入特殊字符:
```
{"name": "John\", \"role\": \"admin"}
{"name": "John\", \"role\": \"admin//"}
```

8.3 XML请求处理

SOAP Web服务和其他旧式系统常用XML格式请求。

XML请求测试示例:

原始请求:
```
POST /api/service HTTP/1.1
Host: target.example.com
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <GetUser>
            <userId>1001</userId>
        </GetUser>
    </soap:Body>
</soap:Envelope>
```

测试场景1:XXE注入测试
将XML内容修改为:
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <GetUser>
            <userId>&xxe;</userId>
        </GetUser>
    </soap:Body>
</soap:Envelope>
```

测试场景2:XML注入测试
在XML标签值中注入XML标签:
```
<userId>1001</userId><isAdmin>true</isAdmin>
```

8.4 Repeater高级功能

功能1:请求标签页管理
- 支持创建多个标签页
- 每个标签页独立保存请求状态
- 可以对标签页重命名和分组

功能2:Inspector面板
- 自动解析请求参数
- 支持快速编辑请求参数
- 显示Cookie、Query参数、Body参数

功能3:请求历史
- 每个请求的修改历史被保存
- 可以回溯到之前的请求版本
- 方便对比不同payload的效果

功能4:右键菜单功能
- Send to Intruder:发送到Intruder进行批量测试
- Send to Repeater(新标签):在新的Repeater标签中打开
- Change request method:快速切换GET/POST
- Convert selection:各种编码/解码转换
- URL-encode as you type:输入时自动URL编码

【提示】在Repeater中修改请求时,注意Content-Length的值。Burp会自动
更新Content-Length,但如果手动修改了请求体长度,请确认Content-Length
与实际请求体长度一致。


九、Sequencer模块详解

Sequencer模块用于分析随机数据的统计特性,主要用于评估Token、Session
ID等敏感数据的随机性和可预测性。

9.1 随机性分析

Sequencer对采集的数据样本进行多层次的统计分析:

分析层次1:字符级分析(Character-level analysis)
- 每个字符位置的可转移性(字符转换概率)
- 字符分布的均匀性测试
- 单字符熵分析

分析层次2:双位级分析(Bit-level analysis)
- 每个比特位的分布测试
- 比特位的0/1分布比例
- 比特级熵分析

分析层次3:序列分析(Sequence analysis)
- 相邻样本之间的相关性分析
- 序列的可预测性评估
- 模式识别

9.2 Token强度评估

Token强度评估实战流程:

步骤1:采集Token样本
- 在Proxy历史记录中找到包含目标Token的响应
- 右键 -> Send to Sequencer
- 或者使用Live Capture模式

步骤2:配置采样
- 选择Token所在位置(响应头或响应体)
- 定义Token提取规则(正则表达式或直接位置)
- 设置采样数量(建议至少200个样本)

步骤3:开始采集
- 点击"Start capture"开始采集
- Burp会不断发送请求获取新的Token
- 采集足够样本后点击"Stop capture"或"Pause"

步骤4:执行分析
- 采集完成后点击"Analyze now"
- 分析完成后查看结果

步骤5:查看分析结果

分析结果包含以下关键指标:

| 指标                     | 说明                          | 安全标准       |
|--------------------------|-------------------------------|----------------|
| Overall result           | 综合评估结果                  | Pass/Fail      |
| Entropy (bits)           | 熵值(比特数)                | >=64 bits 安全 |
| Reliability              | 结果可靠性                    | >=80% 较可靠   |
| Samples obtained        | 采集样本数量                  | >=200个        |
| Character set size       | 字符集大小                    | 越大越好       |
| Significance level       | 显著性水平                    | <1% 为正常     |

分析结果详细展示:

1. 字符级分析结果
- 每个字符位置的平均熵
- 字符分布图
- 转移概率矩阵

2. 比特级分析结果
- 每个比特位的0/1分布
- 比特位熵分布图
- 比特位独立性测试

3. 序列分析结果
- 序列相关性图
- 自相关函数(ACF)图
- 周期性检测

9.3 Token强度评估实战

场景:评估网站CSRF Token的安全性

步骤1:在登录页面找到CSRF Token
步骤2:发送包含CSRF Token的请求到Sequencer
步骤3:配置Token提取规则
- Token位置:响应体中的隐藏字段
- 提取正则:name="csrf_token" value="([a-f0-9]{32})"

步骤4:采集500个样本
步骤5:执行分析

评估标准:
- 熵值 >= 64 bits:Token强度充足
- 熵值 32-64 bits:Token强度中等,需要改进
- 熵值 < 32 bits:Token强度不足,存在被预测的风险

【提示】Sequencer需要足够多的样本才能提供可靠的统计结果。建议
至少采集500个样本进行分析。样本数量越多,结果越准确。


十、Decoder与Comparer模块详解

10.1 Decoder模块

Decoder模块提供多种编码格式之间的转换功能。

支持的编码格式:

| 编码格式          | 解码格式          | 说明                     |
|-------------------|-------------------|--------------------------|
| URL               | URL decode        | URL编码/解码             |
| Base64            | Base64 decode     | Base64编码/解码          |
| HTML              | HTML decode       | HTML实体编码/解码        |
| Hex               | Hex decode        | 十六进制编码/解码        |
| ASCII Hex         | ASCII Hex decode  | ASCII十六进制编码        |
| gzip              | gzip decode       | gzip压缩/解压           |
| URL-encode all    | -                 | URL全字符编码            |

Decoder使用方法:

方法1:直接输入
- 在Decoder面板输入待编码/解码的数据
- 选择"Encode as"或"Decode as"
- 选择目标编码格式

方法2:从其他模块发送
- 在任何模块中选中数据
- 右键 -> Send to Decoder
- 在Decoder中选择编码/解码操作

实战示例1:解码Base64编码的JWT
```
输入:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
操作:Decode as -> Base64
输出:{"alg":"HS256","typ":"JWT"}
```

实战示例2:解码URL编码的参数
```
输入:%3Cscript%3Ealert(1)%3C%2Fscript%3E
操作:Decode as -> URL
输出:<script>alert(1)</script>
```

实战示例3:十六进制转ASCII
```
输入:48656c6c6f20576f726c64
操作:Decode as -> Hex
输出:Hello World
```

实战示例4:多重解码
某些数据可能经过多重编码,Decoder支持连续应用多个解码操作。
例如:先Base64解码,再URL解码。
- 输入数据 -> Decode as Base64 -> 结果选中 -> Decode as URL -> 最终结果

【提示】Decoder还支持Hash计算功能,可以对输入数据计算MD5、SHA1、
SHA256等哈希值。

10.2 Comparer模块

Comparer模块用于比较两个HTTP请求或响应的差异。

使用场景:
- 对比正常请求和异常请求的差异
- 对比不同用户的响应内容(发现越权数据)
- 对比修改前后的响应变化

Comparer使用方法:

步骤1:发送数据到Comparer
- 在任何模块中右键 -> Send to Comparer
- 需要发送两份数据(分别作为对比的两个端)

步骤2:选择对比模式
- Words模式:按单词级别对比
- Bytes模式:按字节级别对比

步骤3:查看对比结果
- 差异部分以颜色高亮显示
- 红色表示仅在第一份数据中存在
- 绿色表示仅在第二份数据中存在

Comparer对比示例:

场景:对比两个用户的个人信息API响应

用户A的响应发送到Comparer(1),用户B的响应发送到Comparer(2)。

选择Words模式对比,结果可能显示:
- 用户A有额外字段:"credit_card": "****-****-****-1234"
- 用户B的role字段值为"user",而用户A为"admin"

通过Comparer可以快速发现响应内容的差异,辅助发现越权漏洞。


十一、Burp插件开发实战
 

Burp Suite的强大之处在于其可扩展性。用户可以使用Java或Python
开发自定义插件(Extender),扩展Burp的功能。

11.1 Burp Extender API基础

Burp提供了两套API:

旧版API(Legacy API):
- 基于IBurpExtender接口
- 使用Jython(Python 2)或Java开发
- 逐步被淘汰

新版API(Montoya API):
- 基于BurpExtension接口
- 使用Java开发(支持Java 11+)
- 推荐使用的新API

主要API接口说明:

| 接口名称               | 说明                                |
|------------------------|-------------------------------------|
| IBurpExtender          | 扩展入口接口(旧版API)            |
| BurpExtension          | 扩展入口接口(新版Montoya API)     |
| IProxyListener         | 代理事件监听                        |
| IHttpListener          | HTTP请求/响应监听                   |
| IScannerListener       | 扫描结果监听                        |
| IExtensionStateListener| 扩展状态监听                        |
| ITab                   | 自定义UI标签页                      |
| IContextMenuFactory    | 右键菜单扩展                        |
| IMessageEditorTab      | 自定义消息编辑器标签页              |
| IHttpRequestResponse   | HTTP请求响应对象                    |

11.2 Java插件开发实战(Montoya API)

开发环境准备:

步骤1:安装JDK 17+
步骤2:安装Maven
步骤3:创建Maven项目

pom.xml配置文件:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.security</groupId>
    <artifactId>custom-burp-extension</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>net.portswigger.burp.extensions</groupId>
            <artifactId>montoya-api</artifactId>
            <version>2023.12.1</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.security.CustomExtension</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```

Java插件完整代码示例:自定义请求日志记录插件

```java
package com.security;

import burp.api.montoya.MontoyaApi;
import burp.api.montoya.BurpExtension;
import burp.api.montoya.core.ByteArray;
import burp.api.montoya.http.message.requests.HttpRequest;
import burp.api.montoya.http.message.responses.HttpResponse;
import burp.api.montoya.proxy.http.HttpRequestResponse;
import burp.api.montoya.proxy.http.ProxyRequestHandler;
import burp.api.montoya.proxy.http.ProxyRequestReceivedAction;
import burp.api.montoya.proxy.http.ProxyRequestToBeSentAction;
import burp.api.montoya.proxy.http.ProxyResponseHandler;
import burp.api.montoya.proxy.http.ProxyResponseReceivedAction;
import burp.api.montoya.proxy.http.ProxyResponseToBeSentAction;
import burp.api.montoya.ui.contextmenu.ContextMenuEvent;
import burp.api.montoya.ui.contextmenu.ContextMenuItemsProvider;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class CustomExtension implements BurpExtension, ProxyRequestHandler {
    
    private MontoyaApi api;
    private JTextArea logArea;
    private int requestCount = 0;
    private final List<String> loggedRequests = new ArrayList<>();
    
    @Override
    public void initialize(MontoyaApi api) {
        this.api = api;
        
        // 设置扩展名称
        api.extension().setName("Custom Request Logger");
        
        // 注册代理请求处理器
        api.proxy().registerRequestHandler(this);
        
        // 创建自定义UI标签页
        createCustomTab();
        
        // 注册右键菜单
        api.userInterface().registerContextMenuItemsProvider(
            new CustomContextMenuProvider(api, this)
        );
        
        // 输出日志到Burp的控制台
        api.logging().logToOutput("[Custom Extension] 初始化成功!");
        api.logging().logToOutput("[Custom Extension] 请求日志记录器已启动");
    }
    
    // 创建自定义UI标签页
    private void createCustomTab() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        
        // 日志显示区域
        logArea = new JTextArea();
        logArea.setEditable(false);
        logArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
        JScrollPane scrollPane = new JScrollPane(logArea);
        
        // 工具栏
        JToolBar toolBar = new JToolBar();
        JButton clearButton = new JButton("清空日志");
        JButton exportButton = new JButton("导出日志");
        JButton searchButton = new JButton("搜索");
        
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                logArea.setText("");
                loggedRequests.clear();
                requestCount = 0;
            }
        });
        
        exportButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                if (fileChooser.showSaveDialog(mainPanel) == JFileChooser.APPROVE_OPTION) {
                    // 导出逻辑省略,实际应用中实现文件保存
                    api.logging().logToOutput("日志导出功能触发");
                }
            }
        });
        
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String keyword = JOptionPane.showInputDialog(mainPanel, "输入搜索关键词:");
                if (keyword != null && !keyword.isEmpty()) {
                    searchInLog(keyword);
                }
            }
        });
        
        toolBar.add(clearButton);
        toolBar.add(exportButton);
        toolBar.add(searchButton);
        
        // 状态栏
        JLabel statusLabel = new JLabel("  就绪 - 等待请求...");
        
        mainPanel.add(toolBar, BorderLayout.NORTH);
        mainPanel.add(scrollPane, BorderLayout.CENTER);
        mainPanel.add(statusLabel, BorderLayout.SOUTH);
        
        // 注册UI标签页
        api.userInterface().registerSuiteTab("Request Logger", mainPanel);
    }
    
    // 在日志中搜索关键词
    private void searchInLog(String keyword) {
        StringBuilder results = new StringBuilder();
        results.append("=== 搜索结果: ").append(keyword).append(" ===\n\n");
        
        for (String entry : loggedRequests) {
            if (entry.toLowerCase().contains(keyword.toLowerCase())) {
                results.append(entry).append("\n---\n");
            }
        }
        
        if (results.toString().equals("=== 搜索结果: " + keyword + " ===\n\n")) {
            results.append("未找到匹配结果");
        }
        
        JOptionPane.showMessageDialog(null, results.toString(), 
            "搜索结果", JOptionPane.INFORMATION_MESSAGE);
    }
    
    // 处理接收到的代理请求
    @Override
    public ProxyRequestReceivedAction handleRequestReceived(
            HttpRequestResponse requestResponse) {
        
        HttpRequest request = requestResponse.request();
        
        requestCount++;
        String timestamp = LocalDateTime.now().format(
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        );
        
        StringBuilder logEntry = new StringBuilder();
        logEntry.append("[").append(timestamp).append("] ");
        logEntry.append("Request #").append(requestCount).append("\n");
        logEntry.append("Method: ").append(request.method()).append("\n");
        logEntry.append("URL: ").append(request.url()).append("\n");
        logEntry.append("Host: ").append(request.headerValue("Host")).append("\n");
        
        // 记录请求头
        logEntry.append("Headers:\n");
        request.headers().forEach(header -> {
            logEntry.append("  ").append(header.name())
                   .append(": ").append(header.value()).append("\n");
        });
        
        // 记录请求体(如果有)
        if (request.body().length() > 0) {
            logEntry.append("Body:\n");
            logEntry.append(request.bodyToString()).append("\n");
        }
        
        logEntry.append("========================================\n");
        
        // 添加到日志区域
        SwingUtilities.invokeLater(() -> {
            logArea.append(logEntry.toString());
        });
        
        loggedRequests.add(logEntry.toString());
        
        return ProxyRequestReceivedAction.continueWith(requestResponse);
    }
    
    @Override
    public ProxyRequestToBeSentAction handleRequestToBeSent(
            HttpRequestResponse requestResponse) {
        return ProxyRequestToBeSentAction.continueWith(requestResponse);
    }
    
    // 获取请求计数
    public int getRequestCount() {
        return requestCount;
    }
    
    // 添加自定义日志条目
    public void addCustomLogEntry(String entry) {
        String timestamp = LocalDateTime.now().format(
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        );
        String logEntry = "[" + timestamp + "] [手动] " + entry + "\n";
        SwingUtilities.invokeLater(() -> {
            logArea.append(logEntry);
        });
        loggedRequests.add(logEntry);
    }
}

// 自定义右键菜单提供者
class CustomContextMenuProvider implements ContextMenuItemsProvider {
    
    private final MontoyaApi api;
    private final CustomExtension extension;
    
    public CustomContextMenuProvider(MontoyaApi api, CustomExtension extension) {
        this.api = api;
        this.extension = extension;
    }
    
    @Override
    public List<Component> provideMenuItems(ContextMenuEvent event) {
        List<Component> menuItems = new ArrayList<>();
        
        JMenuItem addToLogItem = new JMenuItem("添加到自定义日志");
        
        addToLogItem.addActionListener(e -> {
            if (event.messageEditorRequestResponse().isPresent()) {
                String requestInfo = event.messageEditorRequestResponse()
                    .get().requestResponse().request().url();
                extension.addCustomLogEntry("右键添加: " + requestInfo);
            }
        });
        
        menuItems.add(addToLogItem);
        return menuItems;
    }
}
```

编译与打包:
```
# 在项目根目录执行
mvn clean package -DskipTests

# 生成的JAR文件位于 target/ 目录下
# 文件名格式:custom-burp-extension-1.0.0-jar-with-dependencies.jar
```

在Burp中加载插件:
步骤1:Burp -> Extensions -> Installed -> Add
步骤2:Extension type 选择 Java
步骤3:选择编译好的JAR文件
步骤4:点击Next加载插件
步骤5:查看Output和Errors面板确认加载成功

11.3 Python插件开发实战

Burp支持通过Jython使用Python开发插件。需要安装Jython环境。

Jython环境配置:

步骤1:下载Jython
- 访问 https://www.jython.org/download.html
- 下载 Jython 2.7 Standalone版本(jython-standalone-2.7.3.jar)

步骤2:在Burp中配置Jython
- Extensions -> Options -> Python Environment
- 选择Jython的JAR文件路径

步骤3:创建Python插件文件

Python插件完整代码示例:敏感信息扫描插件

```python
# -*- coding: utf-8 -*-
# 文件名: sensitive_info_scanner.py
# 功能: 被动扫描HTTP响应中的敏感信息泄露

from burp import IBurpExtender, IScannerCheck, IScanIssue
from java.net import URL
import re

# 敏感信息正则模式列表
SENSITIVE_PATTERNS = [
    {
        "name": "Email Address",
        "pattern": r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
        "severity": "Low"
    },
    {
        "name": "Phone Number (CN)",
        "pattern": r"\b1[3-9]\d{9}\b",
        "severity": "Low"
    },
    {
        "name": "ID Card Number (CN)",
        "pattern": r"\b\d{17}[\dXx]\b",
        "severity": "High"
    },
    {
        "name": "Credit Card Number",
        "pattern": r"\b(?:\d[ -]*?){13,19}\b",
        "severity": "High"
    },
    {
        "name": "AWS Access Key",
        "pattern": r"\bAKIA[0-9A-Z]{16}\b",
        "severity": "High"
    },
    {
        "name": "AWS Secret Key",
        "pattern": r"\b(?<![A-Za-z0-9/+])[A-Za-z0-9/+]{40}(?![A-Za-z0-9/+])\b",
        "severity": "High"
    },
    {
        "name": "GitHub Token",
        "pattern": r"\bghp_[A-Za-z0-9]{36}\b",
        "severity": "High"
    },
    {
        "name": "Slack Token",
        "pattern": r"\bxox[baprs]-[A-Za-z0-9-]{10,}\b",
        "severity": "High"
    },
    {
        "name": "Private IP Address",
        "pattern": r"\b(?:10|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}\b",
        "severity": "Information"
    },
    {
        "name": "JWT Token",
        "pattern": r"\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b",
        "severity": "Medium"
    },
    {
        "name": "Database Connection String",
        "pattern": r"(?:mysql|postgresql|mongodb)://[^\s<>'\"]+",
        "severity": "High"
    },
    {
        "name": "Stack Trace",
        "pattern": r"(?:at\s+\w+\.\w+\([^)]+\)|Traceback \(most recent call last\))",
        "severity": "Medium"
    },
    {
        "name": "Internal Server Error",
        "pattern": r"(?:Internal Server Error|StackOverflowException|NullPointerException)",
        "severity": "Medium"
    }
]


class BurpExtender(IBurpExtender, IScannerCheck):
    
    def registerExtenderCallbacks(self, callbacks):
        # 保存回调对象
        self._callbacks = callbacks
        
        # 设置扩展名称
        callbacks.setExtensionName("Sensitive Info Scanner")
        
        # 注册被动扫描检查器
        callbacks.registerScannerCheck(self)
        
        # 获取辅助对象
        self._helpers = callbacks.getHelpers()
        
        # 输出加载信息
        print("[Sensitive Info Scanner] 插件加载成功")
        print("[Sensitive Info Scanner] 已注册 %d 个敏感信息检测规则" % len(SENSITIVE_PATTERNS))
        
        return
    
    def doPassiveScan(self, baseRequestResponse):
        """
        被动扫描:分析HTTP响应中的敏感信息
        """
        issues = []
        
        # 获取响应内容
        responseInfo = self._helpers.analyzeResponse(
            baseRequestResponse.getResponse()
        )
        
        if responseInfo is None:
            return issues
        
        # 提取响应体
        responseBytes = baseRequestResponse.getResponse()
        if responseBytes is None:
            return issues
        
        responseStr = self._helpers.bytesToString(responseBytes)
        
        # 获取响应头
        headers = responseInfo.getHeaders()
        headersStr = "\n".join(headers)
        
        # 合并响应头和响应体进行扫描
        fullResponse = headersStr + "\n" + responseStr
        
        # 遍历所有敏感信息模式
        for pattern_info in SENSITIVE_PATTERNS:
            matches = re.finditer(pattern_info["pattern"], fullResponse)
            
            match_count = 0
            found_values = []
            
            for match in matches:
                match_count += 1
                matched_text = match.group()
                # 截断过长的匹配结果
                if len(matched_text) > 100:
                    matched_text = matched_text[:100] + "..."
                found_values.append(matched_text)
                
                # 限制最大匹配数量
                if match_count >= 5:
                    break
            
            if match_count > 0:
                # 创建扫描问题
                issue = SensitiveInfoIssue(
                    self._callbacks,
                    baseRequestResponse,
                    pattern_info["name"],
                    pattern_info["severity"],
                    found_values
                )
                issues.append(issue)
        
        return issues
    
    def doActiveScan(self, baseRequestResponse, insertionPoint):
        # 主动扫描不做处理
        return None
    
    def consolidateDuplicateIssues(self, existingIssue, newIssue):
        # 如果是同一个类型的问题,保留已有的
        if existingIssue.getIssueName() == newIssue.getIssueName():
            return -1  # 保留已有问题
        return 0


class SensitiveInfoIssue(IScanIssue):
    """
    自定义扫描问题类
    """
    
    def __init__(self, callbacks, requestResponse, issueName, severity, foundValues):
        self._callbacks = callbacks
        self._requestResponse = requestResponse
        self._issueName = issueName
        self._severity = severity
        self._foundValues = foundValues
        
        # 获取URL
        url = self._callbacks.getHelpers().analyzeResponse(
            requestResponse.getResponse()
        ).getUrl()
        self._url = url
    
    def getUrl(self):
        return self._url
    
    def getIssueName(self):
        return "Sensitive Information: " + self._issueName
    
    def getIssueType(self):
        # 0x04000000 表示信息泄露类型
        return 0x04000000
    
    def getSeverity(self):
        severity_map = {
            "High": "High",
            "Medium": "Medium",
            "Low": "Low",
            "Information": "Information"
        }
        return severity_map.get(self._severity, "Information")
    
    def getConfidence(self):
        return "Firm"
    
    def getIssueBackground(self):
        return ("该响应中包含敏感信息泄露。敏感信息泄露可能导致用户隐私泄露、"
                "凭据被窃取、内部架构暴露等安全风险。")
    
    def getIssueDetail(self):
        detail = "在HTTP响应中检测到以下敏感信息:\n\n"
        for value in self._foundValues:
            detail += "- %s\n" % value
        detail += "\n建议检查这些信息是否应该出现在响应中。"
        return detail
    
    def getRemediationDetail(self):
        return ("1. 检查响应内容,确认敏感信息是否需要脱敏处理。\n"
                "2. 避免在客户端响应中包含服务器端敏感数据。\n"
                "3. 对日志、错误消息等进行脱敏处理。\n"
                "4. 定期审计API响应内容,确保不泄露敏感信息。")
    
    def getIssueBackground(self):
        return None
    
    def getRemediationBackground(self):
        return None
    
    def getHttpMessages(self):
        return [self._requestResponse]
    
    def getHttpService(self):
        return self._requestResponse.getHttpService()
```

在Burp中加载Python插件:
步骤1:Extensions -> Installed -> Add
步骤2:Extension type 选择 Python
步骤3:选择 sensitive_info_scanner.py 文件
步骤4:点击Next加载插件
步骤5:正常浏览目标网站,被动扫描自动运行

11.4 自定义Passive Scanner插件

以下是一个更完整的被动扫描插件示例,使用Montoya API(Java)开发,
用于检测HTTP响应中缺失的安全头。

```java
package com.security;

import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.scanner.AuditResult;
import burp.api.montoya.scanner.ConsolidationAction;
import burp.api.montoya.scanner.audit.insertionpoint.AuditInsertionPoint;
import burp.api.montoya.scanner.audit.issues.AuditIssue;
import burp.api.montoya.scanner.audit.issues.AuditIssueSeverity;
import burp.api.montoya.scanner.audit.issues.AuditIssueConfidence;
import burp.api.montoya.http.message.HttpRequestResponse;
import burp.api.montoya.http.message.responses.HttpResponse;
import burp.api.montoya.core.ByteArray;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

public class SecurityHeaderScanner implements BurpExtension {
    
    private MontoyaApi api;
    
    // 需要检查的安全头列表
    private static final Map<String, String[]> SECURITY_HEADERS = new HashMap<>();
    
    static {
        // headerName, [expectedValue, description, severity]
        SECURITY_HEADERS.put("X-Content-Type-Options", 
            new String[]{"nosniff", "防止MIME类型嗅探攻击", "Medium"});
        SECURITY_HEADERS.put("X-Frame-Options", 
            new String[]{"DENY or SAMEORIGIN", "防止点击劫持攻击", "Medium"});
        SECURITY_HEADERS.put("X-XSS-Protection", 
            new String[]{"1; mode=block", "启用浏览器XSS过滤器", "Low"});
        SECURITY_HEADERS.put("Strict-Transport-Security", 
            new String[]{"max-age=31536000", "强制使用HTTPS", "Medium"});
        SECURITY_HEADERS.put("Content-Security-Policy", 
            new String[]{"default-src", "内容安全策略", "Medium"});
        SECURITY_HEADERS.put("Referrer-Policy", 
            new String[]{"no-referrer or same-origin", "控制Referrer信息泄露", "Low"});
        SECURITY_HEADERS.put("Permissions-Policy", 
            new String[]{"各种权限控制", "控制浏览器功能权限", "Low"});
    }
    
    @Override
    public void initialize(MontoyaApi api) {
        this.api = api;
        
        api.extension().setName("Security Header Scanner");
        
        // 注册被动扫描检查器
        api.scanner().registerScanCheck(new SecurityHeaderScanCheck(api));
        
        api.logging().logToOutput("[Security Header Scanner] 插件加载成功");
        api.logging().logToOutput("[Security Header Scanner] 检查 %d 个安全头", 
            SECURITY_HEADERS.size());
    }
}
```

【注意】以上插件代码为完整可用的示例。在实际开发中,请根据Burp的
版本选择对应的API。Montoya API是新版API,推荐用于新开发。旧版
IBurpExtender接口仍可使用,但未来可能不再支持。


十二、常用BApp Store插件推荐与配置

BApp Store是Burp Suite的官方插件市场,提供了大量社区开发的扩展插件。
以下推荐最常用的高价值插件。

12.1 Active Scan++

功能:增强Burp的主动扫描能力,添加额外的漏洞检测规则。

安装:BApp Store -> 搜索 "Active Scan++" -> Install

主要功能:
- 添加了额外的注入测试payload
- 增强的XSS检测能力
- 更全面的命令注入检测
- 时间盲注检测优化

配置建议:安装后无需额外配置,自动集成到主动扫描流程中。

12.2 Authz

功能:权限测试辅助工具,用于检测越权漏洞(IDOR/水平越权/垂直越权)。

安装:BApp Store -> 搜索 "Authz" -> Install

使用方法:
步骤1:配置两组Cookie/Authorization头
- Cookie1:低权限用户A的Session
- Cookie2:高权限用户B的Session

步骤2:以用户A身份浏览目标,在Proxy历史记录中选中请求
步骤3:右键 -> Send to Authz
步骤4:在Authz面板点击"Send"
步骤5:对比两组响应
- 如果用户A的请求返回了用户B的数据,存在越权漏洞
- 如果两个响应完全相同,可能存在水平越权

12.3 Logger++

功能:增强的日志记录工具,支持多维度过滤和导出。

安装:BApp Store -> 搜索 "Logger++" -> Install

主要功能:
- 记录所有HTTP请求和响应
- 支持多列自定义显示
- 支持高级过滤表达式
- 支持导出为CSV/JSON/XML格式
- 支持Grep搜索
- 支持请求重放

配置建议:
- 在Logger++选项中配置要记录的请求字段
- 设置过滤规则排除静态资源
- 配置自动导出路径用于后续分析

12.4 HTTP Request Smuggler

功能:HTTP请求走私漏洞检测和利用工具。

安装:BApp Store -> 搜索 "HTTP Request Smuggler" -> Install

主要功能:
- 自动检测HTTP请求走私漏洞
- 支持CL.TE和TE.CL两种走私方式
- 支持自定义走私payload
- 提供请求走私利用功能

使用方法:
步骤1:在Repeater中选中目标请求
步骤2:右键 -> Send to HTTP Request Smuggler
步骤3:选择探测方式(CL.TE探测 / TE.CL探测)
步骤4:点击"Start"开始探测
步骤5:观察结果判断是否存在漏洞

【警告】HTTP请求走私测试可能对目标服务器造成影响,请在授权环境下
使用,并注意控制测试频率。

12.5 Autorize

功能:自动化越权漏洞检测工具。

安装:BApp Store -> 搜索 "Autorize" -> Install

使用方法:
步骤1:配置低权限用户的Cookie
- 在Autorize面板的Configuration中输入低权限用户的Authorization头或Cookie

步骤2:以高权限用户身份正常浏览目标
- Autorize会自动使用低权限凭据重放每个请求
- 自动对比响应,判断是否存在越权

步骤3:查看检测结果
- Bypassed(红色):低权限用户成功访问了高权限资源,存在越权漏洞
- Enforced(绿色):低权限用户被正确拦截,无越权
- Is Enforced???(黄色):无法确定,需手动检查

12.6 JSON Web Tokens

功能:JWT Token的查看、解码、修改和攻击工具。

安装:BApp Store -> 搜索 "JSON Web Tokens" -> Install

主要功能:
- 自动解码JWT Token
- 支持修改JWT Header和Payload
- 支持none算法绕过攻击
- 支持密钥爆破
- 自动在请求中更新过期的JWT

使用方法:
步骤1:在Proxy历史记录中找到包含JWT的请求
步骤2:右键 -> Send to JSON Web Tokens
步骤3:查看JWT的解码内容
步骤4:尝试修改Payload中的字段(如role字段)
步骤5:尝试none算法绕过(将alg修改为none)
步骤6:使用修改后的JWT重放请求

12.7 其他推荐插件

| 插件名称                  | 功能                                | 推荐指数 |
|---------------------------|-------------------------------------|----------|
| Param Miner               | 发现隐藏参数和缓存中毒             | ★★★★★   |
| Upload Scanner            | 文件上传漏洞扫描                    | ★★★★☆   |
| Retire.js                 | 检测前端库的已知漏洞               | ★★★★☆   |
| Flow                      | 可视化HTTP请求/响应流程            | ★★★★☆   |
| SQLiPy                    | 集成SQLMap进行SQL注入检测          | ★★★★☆   |
| Hackvertor                | 使用标签进行数据编码转换           | ★★★★☆   |
| JWT Heartbreaker          | JWT密钥攻击和验证                  | ★★★★☆   |
| WebSocket Smuggler        | WebSocket走私检测                  | ★★★☆☆   |
| CORS                      | CORS跨域漏洞检测                   | ★★★★☆   |
| Backslash Powered Scanner | 基于反馈的模糊测试                  | ★★★★☆   |
| Turbo Intruder            | 高性能Intruder替代品               | ★★★★★   |
| Copy as Python Requests   | 将请求导出为Python requests代码    | ★★★☆☆   |
| Request Randomizer        | 随机化请求参数                     | ★★★☆☆   |
| Bambda                    | 使用Python脚本过滤HTTP历史         | ★★★★☆   |
| Doppler Match and Replace  | 增强的匹配替换功能                 | ★★★☆☆   |



十三、高级技巧

13.1 宏录制与Session处理

宏(Macro)功能用于自动维护会话状态,如自动登录刷新Session Token。

宏录制步骤:

步骤1:打开宏配置
- Project options -> Sessions -> Macros -> Add

步骤2:录制宏
- 点击"Record Macro"
- 在浏览器中执行需要录制的操作(如登录)
- Burp会记录这些请求
- 选择需要保留的请求

步骤3:配置宏参数
- 选择需要自动更新的参数(如Session Token)
- 配置Token提取规则(从响应中提取Token值)

步骤4:配置宏触发条件
- 选择触发条件(如HTTP响应包含特定错误时触发)
- 配置重试逻辑

步骤5:设置Session Handling Rules
- Project options -> Sessions -> Session Handling Rules -> Add
- 配置规则动作:Run Macro
- 配置规则范围:所有请求或特定URL

实战场景:自动刷新过期的Session

场景描述:测试目标Session有效期为15分钟,过期后需要重新登录。
配置自动登录宏:
1. 录制登录请求作为宏
2. 配置Session Handling Rule
3. 规则动作:当检测到401/302响应时,自动执行登录宏
4. 从登录响应中提取新的Session Token
5. 自动更新后续请求中的Session Token

【提示】宏录制功能在进行长时间的扫描或Intruder攻击时非常有用,
可以确保Session不会过期导致测试中断。

13.2 Session Handling Rules详解

Session Handling Rules用于在发送请求前自动修改请求。

规则类型1:Run Macro
- 在发送请求前执行宏(如自动登录)
- 从宏执行结果中提取参数更新当前请求

规则类型2:Modify Cookie
- 自动添加或修改请求中的Cookie
- 用于维持会话状态

规则类型3:Set HTTP Header
- 自动添加或修改请求头
- 如自动添加Authorization头

规则类型4:Prompt for input
- 在发送请求前弹窗提示输入参数
- 适用于需要人工输入的场景

Session Rule配置参数:

| 配置项                    | 说明                            |
|---------------------------|---------------------------------|
| Rule name                 | 规则名称                        |
| Rule enabled              | 是否启用规则                    |
| Rule actions              | 规则动作列表                    |
| Scope - URL               | 规则生效的URL范围               |
| Scope - Tools             | 规则在哪些模块中生效            |
| Trigger                   | 触发条件                        |

13.3 Collaborator服务器使用

Burp Collaborator是用于检测带外(Out-of-band)漏洞的外部服务。

Collaborator的工作原理:
1. Burp向目标请求中插入Collaborator域名
2. 如果目标存在带外漏洞,会向Collaborator发起DNS/HTTP/SMTP请求
3. Collaborator记录这些请求
4. Burp查询Collaborator确认漏洞存在

Collaborator适用漏洞类型:
- 盲注SQLi(通过DNS带外提取数据)
- 盲注XXE
- 盲注SSRF
- 盲注命令注入
- 盲注反序列化

Collaborator使用方法:

方法1:手动使用
步骤1:点击"Copy to clipboard"获取一个Collaborator域名
步骤2:将域名插入到测试payload中
- 例如:XXE测试 payload中使用Collaborator域名
步骤3:发送请求
步骤4:点击"Poll now"查看是否有Collaborator交互
步骤5:如果有DNS查询或HTTP请求到达Collaborator,确认漏洞存在

方法2:在Intruder中使用
步骤1:在Intruder的Payloads选项卡中选择Payload type为"Collaborator payload"
步骤2:Intruder会自动为每个请求生成不同的Collaborator域名
步骤3:攻击完成后,Burp会自动检查所有Collaborator域名

方法3:在扫描中自动使用
- 主动扫描会自动使用Collaborator进行带外漏洞检测
- 确保Collaborator服务器可用

Collaborator交互类型:
- DNS interactions:DNS查询记录
- HTTP interactions:HTTP请求记录
- SMTP interactions:SMTP邮件记录
- TCP interactions:TCP连接记录
- TLS interactions:TLS握手记录

【提示】Collaborator服务器需要网络连接。如果在内网环境无法访问
PortSwigger的云端Collaborator,可以配置私有Collaborator服务器
(仅企业版支持)。

Collaborator实战示例:检测盲注SSRF

步骤1:获取Collaborator域名
- 点击Burp -> Collaborator -> Copy to clipboard
- 获取域名如:xxx.oastify.com

步骤2:构造SSRF测试payload
```
POST /api/import HTTP/1.1
Host: target.example.com
Content-Type: application/json

{"url": "http://xxx.oastify.com/test"}
```

步骤3:发送请求
步骤4:在Collaborator面板点击"Poll now"
步骤5:如果看到DNS或HTTP交互记录,确认存在SSRF漏洞

13.4 匹配替换规则

Project options -> Match and Replace(不同于Proxy的Match and Replace)

此处的匹配替换规则应用于所有模块的请求和响应。

实战配置示例:

规则集1:自动添加CSRF Token
- Match: <csrf_token>([^<]+)</csrf_token>(从响应中提取Token)
- Replace: 在后续请求中更新对应的CSRF Token参数

规则集2:修改请求来源IP
- Match: X-Forwarded-For: .*
- Replace: X-Forwarded-For: 127.0.0.1
- 用途:测试后端是否信任X-Forwarded-For头

规则集3:移除安全标记
- Match: Secure
- Replace: (留空)
- 用途:测试Cookie安全配置(仅用于测试环境)



十四、实战案例:使用Burp完成一次完整的Web应用渗透测试流程

以下演示使用Burp Suite完成一次完整的Web应用渗透测试全流程。

测试目标:https://demo.testapp.com(示例目标,已获授权)

14.1 第一阶段:信息收集与目标范围设置

步骤1:配置目标Scope
- Target -> Scope -> Add
- 添加 https://demo.testapp.com 到范围

步骤2:浏览目标站点
- 在浏览器中正常浏览目标站点
- 访问所有可见页面和功能
- 尝试登录、注册、搜索等核心功能
- 让Burp代理记录所有流量

步骤3:分析站点地图
- Target -> Site map
- 查看站点目录结构
- 发现隐藏的API接口
- 识别技术栈和框架

步骤4:使用Discover content进行目录爆破
- 右键目标域名 -> Engagement tools -> Discover content
- 配置字典文件进行目录爆破
- 发现隐藏目录和文件

步骤5:使用Find comments和Find scripts
- 搜索HTML注释中的敏感信息
- 发现JavaScript中的API接口

14.2 第二阶段:被动扫描与初步分析

步骤1:确认被动扫描已启用
- Dashboard -> Passive scanning
- 确保所有被动扫描检查项已启用

步骤2:浏览过程中被动扫描自动运行
- 正常浏览目标站点的所有功能
- 被动扫描会自动分析所有流量
- 查看发现的问题

步骤3:分析被动扫描结果
- 查看Dashboard中的Issues
- 记录发现的信息泄露、安全配置问题
- 标记需要深入测试的方向

14.3 第三阶段:主动扫描

步骤1:配置主动扫描
- Dashboard -> New scan -> Active scan
- 选择目标URL范围
- 配置扫描策略(Crawl and Audit)

步骤2:配置扫描选项
- 设置爬虫深度和最大URL数
- 配置审计检查组(根据测试需求选择)
- 设置并发数和超时

步骤3:如果目标需要认证
- 配置Application login
- 提供登录凭据
- 配置Session处理规则

步骤4:开始扫描
- 点击"Start scan"
- 监控扫描进度
- 查看实时发现的漏洞

步骤5:分析扫描结果
- 查看所有发现的漏洞
- 按严重性排序
- 记录需要人工验证的漏洞

14.4 第四阶段:手动漏洞验证与深入测试

步骤1:验证注入漏洞
- 将扫描发现的注入漏洞请求发送到Repeater
- 手动构造payload验证漏洞
- 使用Intruder进行批量模糊测试

步骤2:测试认证与会话管理
- 使用Sequencer分析Session Token随机性
- 测试Session固定漏洞
- 测试密码重置流程
- 测试多因素认证绕过

步骤3:测试访问控制
- 使用Autorize或Authz插件测试越权漏洞
- 测试水平越权(同级别用户之间)
- 测试垂直越权(低权限访问高权限功能)

步骤4:测试业务逻辑
- 使用Intruder测试并发条件
- 测试价格篡改
- 测试工作流绕过
- 测试负数或超大数值

步骤5:使用Collaborator测试带外漏洞
- 测试盲注SSRF
- 测试盲注XXE
- 测试盲注命令注入

14.5 第五阶段:漏洞利用与影响评估

步骤1:对已确认的漏洞进行利用
- 使用Repeater构造利用payload
- 评估漏洞的实际影响
- 获取最大权限的证明

步骤2:记录漏洞利用过程
- 截图保存关键证据
- 记录完整的请求和响应
- 编写漏洞利用步骤

步骤3:评估漏洞风险
- 结合CVSS评分标准评估漏洞严重性
- 考虑漏洞链组合的影响
- 评估对业务的影响

14.6 第六阶段:报告生成

步骤1:使用Burp生成报告
- Target -> Issues -> 右键 -> "Report issues"
- 选择报告格式(HTML/PDF)
- 配置报告内容

步骤2:补充人工测试发现
- 添加扫描器未发现的漏洞
- 补充业务逻辑漏洞
- 添加漏洞利用截图

步骤3:编写修复建议
- 针对每个漏洞提供具体修复方案
- 参考OWASP最佳实践
- 提供安全代码示例



十五、绕过WAF的Burp配置技巧

在渗透测试中,目标可能部署了Web应用防火墙(WAF),会拦截恶意请求。
以下介绍使用Burp绕过WAF的常见技巧。

15.1 修改请求特征

技巧1:修改User-Agent
- WAF可能根据User-Agent拦截扫描器请求
- 将User-Agent修改为常见浏览器UA
- 配置Match and Replace规则自动替换

配置方法:
- Proxy -> Options -> Match and Replace -> Add
- Match: User-Agent: .*
- Replace: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
- Type: Request header

技巧2:移除WAF识别标记
- WAF可能通过特定请求头识别Burp
- 移除如 X-Burp 等标记头
- 移除Origin头(某些WAF根据Origin判断)

15.2 请求分块与编码绕过

技巧1:使用Chunked Transfer Encoding
- 将请求体使用分块传输编码
- 可以绕过某些WAF的请求体检查

配置方法:
- 在Repeater中修改请求头
- 添加 Transfer-Encoding: chunked
- 将请求体转换为分块格式

技巧2:使用多重编码
- 对payload进行多重URL编码
- 使用Unicode编码
- 使用HTML实体编码

Intruder配置:
- Payload Processing -> Add -> URL-encode key characters
- 多次添加编码规则进行多重编码

技巧3:大小写混合
- 将SQL注入payload进行大小写混合
- 例:UnIoN SeLeCt 代替 UNION SELECT

Intruder配置:
- Payload Processing -> Add -> Case modification
- 选择"Lower case"或"To lower case"

15.3 请求频率控制

技巧1:降低请求频率
- 设置请求间隔时间
- 添加随机抖动模拟人类行为

配置方法:
- Intruder -> Options -> Request Engine
- Delay between requests: 1000-3000毫秒
- 添加随机Jitter

技巧2:分批次发送
- 将payload列表分成多个小批次
- 每批次之间添加长时间间隔
- 避免触发频率限制

技巧3:使用Turbo Intruder
- Turbo Intruder支持更精细的速率控制
- 支持HTTP/2多路复用
- 可以在单个TCP连接上发送大量请求

15.4 使用HTTP/2绕过

某些WAF对HTTP/2的解析与HTTP/1.1不一致,可以利用这种差异绕过WAF。

配置方法:
- Settings -> Network -> HTTP -> 启用HTTP/2支持
- 在Repeater中切换HTTP版本
- 对比HTTP/1.1和HTTP/2的WAF拦截差异

15.5 请求参数混淆

技巧1:参数污染
- 添加多个同名参数
- 不同的服务器对同名参数的处理方式不同
- WAF可能只检查第一个参数值

示例:
```
GET /search?q=normal&q=<script>alert(1)</script> HTTP/1.1
```

技巧2:使用不同的Content-Type
- 某些WAF只检查特定Content-Type的请求
- 尝试切换Content-Type绕过检查
- 如从application/x-www-form-urlencoded切换为application/json

技巧3:利用HTTP参数解析差异
- 使用分号分隔参数
- 使用不同的参数编码方式

【警告】绕过WAF的技巧可能因WAF类型和版本不同而效果不同。请根据
实际目标环境调整策略。绕过WAF的行为可能触发安全告警,请在授权
环境下测试。



十六、防御建议

针对Burp Suite测试中发现的常见问题,以下提供防御建议。

16.1 输入验证与输出编码

防御措施1:严格输入验证
- 对所有用户输入进行白名单验证
- 验证数据类型、长度、格式、范围
- 拒绝不符合预期的输入
- 在服务器端进行验证,不依赖客户端验证

防御措施2:安全输出编码
- 根据输出上下文选择合适的编码方式
- HTML上下文使用HTML实体编码
- JavaScript上下文使用JavaScript编码
- URL上下文使用URL编码

防御措施3:参数化查询
- 使用预编译语句(PreparedStatement)
- 避免字符串拼接SQL语句
- 使用ORM框架的参数化查询功能

16.2 认证与会话管理

防御措施1:安全的Session管理
- 使用足够随机的Session Token(至少128位熵)
- Session Token使用安全的传输方式(仅HTTPS)
- 设置Cookie的HttpOnly、Secure、SameSite属性
- 实现Session超时和注销机制

防御措施2:多因素认证
- 对敏感操作要求多因素认证
- 使用TOTP或硬件密钥
- 避免使用短信作为唯一因素

防御措施3:防暴力破解
- 实现账号锁定机制(基于IP和账号)
- 添加验证码
- 实施频率限制
- 记录和监控异常登录行为

16.3 访问控制

防御措施1:基于角色的访问控制(RBAC)
- 严格定义用户角色和权限
- 在服务器端验证每次操作的权限
- 不信任客户端传入的用户ID

防御措施2:默认拒绝原则
- 默认拒绝所有访问
- 显式授权允许的访问
- 定期审计权限配置

防御措施3:资源归属验证
- 验证请求者对资源的访问权限
- 使用间接对象引用
- 检查请求者是否拥有目标资源

16.4 安全配置

防御措施1:安全HTTP响应头
- 配置X-Content-Type-Options: nosniff
- 配置X-Frame-Options: DENY
- 配置Content-Security-Policy
- 配置Strict-Transport-Security
- 配置Referrer-Policy

防御措施2:错误处理
- 自定义错误页面,不泄露技术细节
- 记录详细错误日志到服务器端
- 禁用调试模式和详细错误输出

防御措施3:WAF配置
- 部署Web应用防火墙
- 配置合理的规则
- 定期更新WAF规则
- 监控WAF告警

16.5 持续安全测试

建议1:定期进行渗透测试
- 每年至少进行一次全面渗透测试
- 在重大版本发布前进行安全测试
- 使用自动化工具与人工测试相结合

建议2:实施安全编码规范
- 制定并执行安全编码规范
- 进行代码安全审查
- 使用静态代码分析工具

建议3:建立漏洞响应机制
- 建立漏洞报告渠道
- 制定漏洞响应流程
- 及时修复已发现的安全漏洞



十七、总结

本文系统性地介绍了Burp Suite从基础使用到高级插件开发的全流程。

核心要点回顾:

1. Burp Suite版本选择
- 社区版适合入门学习和简单测试
- 专业版适合专业渗透测试和Bug Bounty
- 企业版适合大规模持续安全监控

2. 核心模块使用
- Proxy:抓包、拦截、修改HTTP流量
- Target:站点地图分析、目标范围管理
- Scanner:主动扫描和被动扫描
- Intruder:四种攻击类型的灵活运用
- Repeater:手动请求修改和重放
- Sequencer:Token随机性分析
- Decoder/Comparer:编码转换和差异对比

3. 插件生态
- BApp Store提供了丰富的扩展插件
- 可使用Java(Montoya API)或Python(Jython)开发自定义插件
- 推荐安装的插件:Active Scan++、Logger++、Authz、Autorize、
  HTTP Request Smuggler、JSON Web Tokens、Param Miner等

4. 高级技巧
- 宏录制与Session处理实现自动化会话维护
- Collaborator服务器用于检测带外漏洞
- 匹配替换规则实现自动化请求修改
- WAF绕过需要综合运用多种技巧

5. 实战流程
- 信息收集 -> 被动扫描 -> 主动扫描 -> 手动验证 -> 漏洞利用 -> 报告生成
- 每个阶段都有对应工具和技巧

6. 防御建议
- 输入验证与输出编码
- 安全的认证与会话管理
- 严格的访问控制
- 安全配置和错误处理
- 持续的安全测试

【提示】Burp Suite是一个功能极其丰富的工具,本文涵盖了主要功能模块。
在实际使用中,建议多参考官方文档和社区资源,不断探索和学习新的
使用技巧。

官方资源:
- PortSwigger官网:https://portswigger.net
- PortSwigger官方文档:https://portswigger.net/burp/documentation
- BApp Store:https://portswigger.net/bapps
- PortSwigger博客:https://portswigger.net/blog
- PortSwigger Web Security Academy:https://portswigger.net/web-security

学习建议:
- 完成PortSwigger Web Security Academy的所有实验
- 参与Bug Bounty平台实战练习
- 阅读PortSwigger研究博客的最新安全研究
- 尝试开发自己的Burp插件


================================================================================
附录A:Burp Suite常用快捷键
================================================================================

| 快捷键          | 功能                        | 适用模块          |
|-----------------|-----------------------------|-------------------|
| Ctrl+R          | 发送到Repeater              | Proxy/Target      |
| Ctrl+I          | 发送到Intruder              | Proxy/Target      |
| Ctrl+Shift+R    | 在新标签中发送到Repeater    | 全局              |
| Ctrl+Shift+I    | 在新标签中发送到Intruder    | 全局              |
| Ctrl+B          | 发送到Comparer              | 全局              |
| Ctrl+D          | 发送到Decoder               | 全局              |
| Ctrl+Space      | 切换Proxy拦截状态           | 全局              |
| Ctrl+F          | 在当前面板搜索              | 全局              |
| Ctrl+T          | 切换请求方法(GET/POST)    | Repeater          |
| Ctrl+U          | URL编码选中内容              | 全局              |
| Ctrl+Shift+U    | URL解码选中内容              | 全局              |
| Ctrl+H          | HTML编码选中内容            | 全局              |
| Ctrl+Shift+H    | HTML解码选中内容            | 全局              |
| Ctrl+B          | Base64编码选中内容          | 全局              |
| Ctrl+Shift+B    | Base64解码选中内容          | 全局              |


================================================================================
附录B:Burp Suite命令行参数
================================================================================

```
# 启动Burp Suite(GUI模式)
java -jar burpsuite_pro.jar

# 指定内存大小启动
java -Xmx4g -jar burpsuite_pro.jar

# 命令行模式启动(无需GUI)
java -jar burpsuite_pro.jar --project-file=/path/to/project.burp

# 指定配置文件启动
java -jar burpsuite_pro.jar --config-file=/path/to/config.json

# 以无界面模式运行扫描(CI/CD集成)
java -jar burpsuite_pro.jar --unpause-spider-and-scanner \
    --project-file=/path/to/project.burp

# 使用REST API触发扫描
# 获取API密钥
curl -X GET https://127.0.0.1:1337/v0.1/api-key \
  -H "Authorization: Bearer YOUR_API_KEY"

# 发起扫描
curl -X POST https://127.0.0.1:1337/v0.1/scan \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scan_id":"custom-scan","urls":["https://target.example.com"]}'
```

【提示】Burp Suite的命令行模式和REST API功能仅专业版和企业版支持。
在CI/CD流水线中集成Burp扫描时,使用命令行模式可以实现自动化安全
测试。


================================================================================
附录C:常见问题与解答
================================================================================

Q1: Burp Suite社区版可以用于商业用途吗?
A1: Burp Suite社区版可以免费使用,包括商业用途,但功能受限。如需
进行专业的商业渗透测试,建议购买专业版。

Q2: Burp Suite支持哪些操作系统?
A2: Burp Suite基于Java开发,支持Windows、macOS和Linux。只要有
JDK环境即可运行。

Q3: 如何提高Burp Suite的扫描速度?
A3: 可以通过以下方式提高扫描速度:
- 增加并发线程数(Settings -> Scan -> Maximum concurrent requests)
- 禁用不需要的检查组
- 减少爬虫深度
- 增加分配给Burp的内存
- 使用多台机器进行分布式扫描(企业版功能)

Q4: Burp Suite是否会触发WAF告警?
A4: 默认情况下,Burp Suite的请求特征可能被WAF识别。可以通过修改
User-Agent、降低请求频率、使用Turbo Intruder等方式减少WAF告警。
具体绕过方法参考第十五章。

Q5: 如何在CI/CD中集成Burp扫描?
A5: 使用Burp的命令行模式和REST API可以实现CI/CD集成。在流水线中
启动Burp的命令行扫描,通过API获取扫描结果,根据结果决定是否阻断
部署。企业版提供了更完善的CI/CD集成支持。

Q6: 自己开发的Burp插件如何发布到BApp Store?
A6: 将插件源码提交到PortSwigger的GitHub仓库
(https://github.com/PortSwigger/bapps),经过审核后可以发布到
BApp Store供全球用户使用。

Q7: Jython开发的插件和Java开发的插件有什么区别?
A7: Jython插件开发更简单快速,但性能较低,且不支持Python 3特性。
Java插件性能更好,功能更全,推荐使用Montoya API进行Java插件开发。

Q8: Burp Suite如何处理WebSocket?
A8: Burp Suite支持WebSocket代理,可以在Proxy -> WebSockets history
中查看WebSocket消息。可以将WebSocket消息发送到Repeater进行重放
和修改。

================================================================================
附录D:推荐的Burp配置文件模板
================================================================================

以下是一份推荐的Burp Suite项目配置模板,可在新项目开始时快速应用。

扫描策略配置推荐:
```
# 适合快速扫描的配置
检查组:Injection vulnerabilities -> 启用
检查组:Input handling -> 启用
检查组:Server-side vulnerabilities -> 启用
检查组:Client-side vulnerabilities -> 禁用(减少扫描时间)
检查组:Authentication and session -> 启用
检查组:Business logic -> 禁用(需要手动测试)
检查组:Miscellaneous checks -> 启用

并发请求:10
超时:60秒
最大URL数:5000
爬虫深度:3
```

Proxy过滤器推荐配置:
```
# 隐藏静态资源
Filter: Hide CSS, image, general non-interesting items
Filter: Show only in-scope items
```

Session Handling推荐规则:
```
# 自动维护Session
规则1: Run Macro - 自动登录
触发条件: 响应包含 "session expired" 或状态码 302
动作: 执行登录宏,更新Session Token

规则2: Set HTTP Header
匹配: 所有请求
动作: 添加 Authorization: Bearer <token>
```

Match and Replace推荐规则:
```
# 规则1: 修改User-Agent
Match: User-Agent: .*
Replace: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...

# 规则2: 移除客户端IP头
Match: X-Forwarded-For: .*
Replace: (空)

# 规则3: 添加自定义测试标记
Match: ^$
Replace: X-Testing-Tool: BurpSuite
Type: Request header
```

================================================================================
全文完
================================================================================
```

以上就是Burp Suite高级实战指南的完整内容。本文涵盖了从基础环境
配置到插件开发的全流程,适合各层次的网络安全学习者参考使用。

再次提醒:所有技术操作请在授权环境下进行,遵守相关法律法规

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐