本教程由简入繁,逐步介绍 Environment 插件的使用方法,适合从初学者到高级用户的各个阶段。
Environment 是一个 Burp Suite 插件,它可以在你发送 HTTP 请求之前,自动将请求中的特殊标记(如 {{user_id}})替换为动态生成的值(如随机数、UUID、时间戳等)。
- 下载或编译得到
environment-0.1.13_yyyyMMdd_HHmm.jar文件。 - 打开 Burp Suite,点击菜单栏 Extensions → Installed → Add。
- Extension type 选择 Java。
- 点击 Select file,选择下载的 JAR 文件。
- 点击 Next,插件安装成功后会自动显示 environment 标签页。
让我们创建一个自动更新的时间戳参数:
- 在 environment 标签页中,点击 Add 按钮。
- 在弹出的对话框中填写:
- arg name:
timestamp - arg type:
ALL - auto update type:
TIMESTAMP - description:
当前时间戳
- arg name:
- 点击 OK。
现在,在任何 HTTP 请求中写入 {{timestamp}},发送时它会被自动替换为当前毫秒时间戳。
每个参数包含以下属性:
| 属性 | 说明 |
|---|---|
| arg name | 参数名称,用于在请求中标记,如 {{user_id}} |
| arg type | 参数类型:TEXT(文本)、NUMBER(数字)、ALL(通用) |
| auto update type | 自动更新方式,决定值如何生成 |
| arg length | 长度限制(部分类型需要) |
| defaultValue | 默认值(自增数时作为起始值) |
| arg value | 当前值 |
| code path | Groovy 脚本路径(仅 Groovy_CODE 类型) |
| description | 描述信息 |
| enabled | 是否启用该参数 |
| persistent | 是否保存到数据库(重启后保留) |
点击 Add 按钮,按提示填写信息。参数名称只能包含字母、数字和下划线,且必须以字母或下划线开头。
- 单击选中表格中的某一行,点击 Edit 按钮。
- 或者直接双击某一行,即可打开查看/编辑对话框。
- 选中一行或多行(按住 Ctrl 可多选),点击 Remove 按钮,确认后删除。
- 点击 Clear 按钮可清空所有参数(谨慎操作)。
在搜索框中输入关键字,点击 Query 按钮,表格会按参数名进行正则匹配筛选。
选中一行,点击 Move Up 或 Move Down 调整参数在列表中的顺序。
| 类型 | 说明 | 需要长度 | 需要默认值 |
|---|---|---|---|
| NONE | 不自动更新,保持当前值 | 否 | 否 |
| UUID | 生成随机 UUID | 否 | 否 |
| TIMESTAMP | 当前时间戳(毫秒) | 否 | 否 |
| SHA1_OF_TIMESTAMP | 当前时间戳的 SHA1 哈希 | 否 | 否 |
| RANDOM_NUMBER | 指定长度的随机数字 | 是 | 否 |
| RANDOM_TEXT | 指定长度的随机小写字母 | 是 | 否 |
| INCREMENT_NUMBER | 自增数 | 否 | 是 |
| Groovy_CODE | 通过 Groovy 脚本自定义 | 否 | 否 |
适合生成会话标识、请求 ID 等:
- arg name:
session_id - auto update type:
UUID - 每次请求都会生成一个新的 UUID,如
550e8400-e29b-41d4-a716-446655440000
适合生成验证码、随机 ID 等:
- arg name:
verify_code - auto update type:
RANDOM_NUMBER - arg length:
6 - 每次生成 6 位随机数字,如
837492
适合生成随机字符串:
- arg name:
random_str - auto update type:
RANDOM_TEXT - arg length:
10 - 每次生成 10 位随机小写字母,如
abcxyzdefg
适合需要顺序编号的场景:
- arg name:
order_id - auto update type:
INCREMENT_NUMBER - defaultValue:
1000 - 第一次请求值为
1001,第二次为1002,以此类推
适合需要签名或防重放攻击的场景:
- arg name:
signature - auto update type:
SHA1_OF_TIMESTAMP - 生成当前时间戳的 SHA1 哈希值
在 HTTP 请求的任何位置使用 {{参数名}} 标记变量:
GET /api/users/{{user_id}}/orders/{{order_id}}?token={{session_token}} HTTP/1.1
Host: api.example.com
Authorization: Bearer {{auth_token}}
X-Request-ID: {{request_uuid}}
Content-Type: application/json
{
"timestamp": {{timestamp}},
"nonce": "{{random_str}}"
}GET /api/v1/users/{{user_id}}/profile HTTP/1.1插件会自动将 {{user_id}} 替换为对应参数的当前值。
GET /api/search?q={{keyword}}&page={{page_num}}&token={{session_token}} HTTP/1.1GET /api/data HTTP/1.1
Host: example.com
X-API-Key: {{api_key}}
X-Timestamp: {{timestamp}}
X-Nonce: {{nonce}}JSON 格式:
POST /api/create HTTP/1.1
Content-Type: application/json
{
"user_id": "{{user_id}}",
"request_id": "{{request_uuid}}",
"created_at": {{timestamp}}
}Form 格式:
POST /api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username={{username}}&password={{password}}&nonce={{nonce}}- 参数名必须严格匹配,区分大小写。
- 如果参数被禁用(enabled=false),标记不会被替换。
- 如果参数不存在,标记将保持原样。
- 点击 Export 按钮。
- 选择保存位置,默认文件名为
environment_export.yaml。 - 点击保存,所有参数将被导出。
导出的 YAML 示例:
version: "1.0"
exported_at: "2024-01-15T10:30:00+08:00"
args:
- id: 1
name: "timestamp"
type: "ALL"
auto_update_type: "TIMESTAMP"
length: 0
default_value: ""
value: ""
code_path: ""
enabled: true
description: "当前时间戳"
persistent: true
- id: 2
name: "user_id"
type: "NUMBER"
auto_update_type: "INCREMENT_NUMBER"
length: 0
default_value: "1000"
value: "1000"
code_path: ""
enabled: true
description: "用户ID"
persistent: true- 点击 Import 按钮。
- 选择 YAML 文件(支持
.yaml和.yml)。 - 插件会自动导入参数,重复名称的参数将被跳过。
- 导入完成后会显示成功导入和跳过的数量。
- 团队协作:将配置导出分享给团队成员。
- 环境迁移:在不同机器或 Burp 实例间迁移配置。
- 备份恢复:定期导出作为备份。
当内置的自动更新类型无法满足需求时,你可以编写 Groovy 脚本来自定义参数值的生成逻辑。
脚本必须包含一个名为 modifyArg 的方法,接收一个 Map<String, String> 参数:
def modifyArg(Map<String, String> params) {
// params 的 key 是参数名,value 是当前值
def name = params.keySet().iterator().next()
def value = params.get(name)
// 返回新的值
return "your_custom_value"
}def modifyArg(Map<String, String> params) {
def name = params.keySet().iterator().next()
def value = params.get(name)
return "REQ_" + System.currentTimeMillis()
}def modifyArg(Map<String, String> params) {
def name = params.keySet().iterator().next()
def value = params.get(name)
// 将值反转并加上后缀
return value.reverse() + "_modified"
}def modifyArg(Map<String, String> params) {
def date = new Date().format("yyyyMMdd")
def random = (new Random().nextInt(9000) + 1000).toString()
return "ORD-${date}-${random}"
}- 创建一个
.groovy文件,写入上述脚本内容。 - 在插件中点击 Add。
- auto update type 选择
Groovy_CODE。 - 点击 code path 旁边的
...按钮,选择你的.groovy文件。 - 点击 OK 完成添加。
- 脚本执行错误会输出到 Burp 的 Extensions 日志中。
- 可以先在 Groovy 控制台测试脚本逻辑。
- 确保脚本文件编码为 UTF-8。
排查步骤:
- 打开 Burp 的 Extensions → Installed,确认插件已加载。
- 查看 Output 子标签,检查是否有错误日志。
- 确认使用的 JAR 文件是带依赖的 fat JAR(通过
mvn clean package生成)。 - 确认 Burp Suite 的 Java 版本不低于 17。
排查步骤:
- 确认参数已启用(表格中 enabled 为 true)。
- 确认请求中使用了正确的标记语法
{{参数名}}。 - 确认参数名大小写完全匹配。
- 查看 Burp 的 Extensions 输出日志,确认 HTTP 处理器已触发。
排查步骤:
- 确认 auto update type 为
INCREMENT_NUMBER。 - 确认 defaultValue 已设置有效的数字。
- 每次请求后参数值会自动更新,可在表格中查看当前值。
排查步骤:
- 确认脚本中包含
modifyArg(Map<String, String>)方法。 - 确认方法返回值为
String类型。 - 确认脚本文件路径正确且文件存在。
- 查看 Burp 的 Extensions 错误日志获取详细信息。
排查步骤:
- 确认添加参数时 persistent 复选框已勾选。
- 确认 Burp 运行目录有写入权限(需要创建
environment/environment.db)。 - 检查 Extensions 日志中是否有数据库初始化失败的错误。
排查步骤:
- 确认 YAML 文件格式正确。
- 确认文件编码为 UTF-8。
- 检查 Extensions 日志中的具体错误信息。
{{parameterName}}
| 场景 | 推荐类型 |
|---|---|
| 会话 ID | UUID |
| 时间戳 | TIMESTAMP |
| 签名/防重放 | SHA1_OF_TIMESTAMP |
| 验证码 | RANDOM_NUMBER |
| 随机字符串 | RANDOM_TEXT |
| 顺序编号 | INCREMENT_NUMBER |
| 自定义逻辑 | Groovy_CODE |
| 操作 | 方式 |
|---|---|
| 添加参数 | 点击 Add |
| 编辑参数 | 选中行 + Edit,或双击行 |
| 删除参数 | 选中行 + Remove |
| 搜索参数 | 输入关键字 + Query |
| 调整顺序 | 选中行 + Move Up / Move Down |
文档版本:0.1.13
最后更新:2026年4月