跳到主要内容

fuzz

fuzz 库是 yaklang 的 Web 模糊测试核心,围绕"FuzzHTTPRequest"对 HTTP 请求的各个部位(路径、参数、Header、Body、Cookie 等)做变异与批量发包,是漏洞探测与参数爆破的主力工具。它同时提供字符串模糊(fuzztag)与协议数据变异能力。

典型使用场景:

  • 构造请求:fuzz.HTTPRequest / fuzz.MustHTTPRequest 从原始报文构建可变异请求,fuzz.UrlToHTTPRequest / fuzz.UrlsToHTTPRequests 从 URL 构建。
  • 字符串变异:fuzz.Strings / fuzz.StringsWithParam / fuzz.StringsFunc 用 fuzztag 语法批量生成 Payload,fuzz.FuzzCalcExpr 生成数学表达式探测。
  • 协议数据:fuzz.ProtobufBytes / fuzz.ProtobufJSON / fuzz.ProtobufHex / fuzz.ProtobufYAML 解析与变异 Protobuf。
  • 发包池:fuzz.WithConcurrentLimit / fuzz.WithDelay / fuzz.WithTimeOut 控制并发与节流,fuzz.https / fuzz.proxy / fuzz.context 控制传输。

与相邻库的关系:fuzzpoc(单发/精确请求)互补——poc 偏"构造与发送一个确定请求",fuzz 偏"对请求批量变异探测";爬取(crawler)得到的请求常交给 fuzz 做深入测试。fuzzx 是其更新的变体。

快速上手(fuzztag 字符串变异,本地生成 Payload,不出网即可验证):

// fuzztag 语法: {{int(1-3)}} 展开为 1、2、3, 与前缀拼接生成一组 payload
payloads = fuzz.Strings("admin{{int(1-3)}}")
println(payloads) // 预期输出: [admin1 admin2 admin3]
assert len(payloads) == 3, "int(1-3) should expand to 3 payloads"

// 常见用途: 把生成的 payload 套进请求做批量变异(需要可达目标, 这里仅示意)
// for p in payloads {
// rsp, req = fuzz.HTTPRequest(`GET /?id=__P__ HTTP/1.1\r\nHost: example.com\r\n\r\n`)~ ...
// }

共 24 个函数

函数索引

函数参数返回值说明
fuzz.FuzzCalcExpr-map[string]any生成一组用于表达式注入(SSTI/计算型)探测的随机日期相关变量与计算表达式
fuzz.FuzzCalcExprInt32Safe-map[string]any生成一组用于表达式注入(SSTI/计算型)探测的随机变量,保证减法结果在 int32 安全范围内
fuzz.FuzzCalcExprInt64Safe-map[string]any生成一组用于表达式注入(SSTI/计算型)探测的随机变量,保证减法结果在 int64 安全范围内
fuzz.ProtobufBytesi any*ProtobufRecords解析 Protobuf 编码的字节流,返回可读取/变形的 Protobuf 记录集合对象
fuzz.ProtobufHexi any*ProtobufRecords解析十六进制字符串表示的 Protobuf 编码数据,返回可读取/变形的 Protobuf 记录集合对象
fuzz.ProtobufJSONi any*ProtobufRecords从 JSON 描述还原 Protobuf 记录集合对象(与 ProtobufRecords.ToJSON 互逆)
fuzz.ProtobufYAMLi any*ProtobufRecords从 YAML 描述还原 Protobuf 记录集合对象(与 ProtobufRecords.ToYAML 互逆)
fuzz.Stringsi any[]string使用 fuzztag 渲染规则,将一个模板字符串展开成一组字符串结果
fuzz.StringsWithParami any, i2 any[]string使用 fuzztag 渲染模板,并允许传入额外的命名参数表参与渲染
fuzz.UrlToHTTPRequestmethod string, i any*mutate.FuzzHTTPRequest, error根据请求方法与 URL 构造一个 HTTP Fuzz 请求对象,便于后续做参数变形与发包
fuzz.WithConcurrentLimiti intHttpPoolConfigOptionsize 是一个 HTTP 连接池/批量请求配置选项,用于设置并发请求数量(并发上限)
fuzz.WithDelayb float64HttpPoolConfigOptiondelay 是一个 HTTP 连接池/批量请求配置选项,用于设置每个请求之间的固定延迟秒数
fuzz.WithNamingContextinvokerName stringHttpPoolConfigOptionnamingContext 是一个 HTTP 连接池/批量请求配置选项,用于设置命名调用上下文以便对并发任务进行分组限流
fuzz.WithTimeOutf float64HttpPoolConfigOptionperRequestTimeout 是一个 HTTP 连接池/批量请求配置选项,用于设置单个请求的超时时间(单位:秒)

可变参数函数索引

函数参数返回值说明
fuzz.HTTPRequesti any, opts ...BuildFuzzHTTPRequestOption*FuzzHTTPRequest, error根据原始请求报文构造一个 HTTP Fuzz 请求对象,用于对请求各部分进行参数变形与发包
fuzz.MustHTTPRequesti any, opts ...BuildFuzzHTTPRequestOption*FuzzHTTPRequest根据原始请求报文构造一个 HTTP Fuzz 请求对象,构造失败时不返回错误(仅记录日志),便于链式调用
fuzz.StringsFunci any, cb func(i *mutate.MutateResult), params ...anyerror使用 fuzztag 渲染模板,并为每个渲染结果回调一次,便于流式处理大量结果
fuzz.UrlsToHTTPRequeststarget ...any*FuzzHTTPRequestBatch, error将一个或多个 URL 转换成可批量变形发包的 HTTP Fuzz 请求批次对象

函数详情

FuzzCalcExpr

FuzzCalcExpr() map[string]any

生成一组用于表达式注入(SSTI/计算型)探测的随机日期相关变量与计算表达式

返回值

序号类型说明
r1map[string]any包含 year、month、day、expr、result 等键的变量表,用于构造与校验计算型注入 payload

示例

// 生成计算型注入变量,此处仅作示意
vars = fuzz.FuzzCalcExpr()
println(vars["expr"])

FuzzCalcExprInt32Safe

FuzzCalcExprInt32Safe() map[string]any

生成一组用于表达式注入(SSTI/计算型)探测的随机变量,保证减法结果在 int32 安全范围内

返回值

序号类型说明
r1map[string]any包含 num1、num2、expr、result 等键的变量表,用于构造与校验计算型注入 payload

示例

// 生成 int32 安全的计算型注入变量,此处仅作示意
vars = fuzz.FuzzCalcExprInt32Safe()
println(vars["expr"])

FuzzCalcExprInt64Safe

FuzzCalcExprInt64Safe() map[string]any

生成一组用于表达式注入(SSTI/计算型)探测的随机变量,保证减法结果在 int64 安全范围内

返回值

序号类型说明
r1map[string]any包含 num1、num2、expr、result 等键的变量表,用于构造与校验计算型注入 payload

示例

// 生成 int64 安全的计算型注入变量,此处仅作示意
vars = fuzz.FuzzCalcExprInt64Safe()
println(vars["expr"])

ProtobufBytes

ProtobufBytes(i any) *ProtobufRecords

解析 Protobuf 编码的字节流,返回可读取/变形的 Protobuf 记录集合对象

参数

参数名类型说明
ianyProtobuf 编码的字节流(字符串或字节数组)

返回值

序号类型说明
r1*ProtobufRecordsProtobuf 记录集合对象,可用于查看与 fuzz 变形

示例

// 解析 protobuf 字节流并打印结构,此处仅作示意
records = fuzz.ProtobufBytes(raw)
println(records.String())

ProtobufHex

ProtobufHex(i any) *ProtobufRecords

解析十六进制字符串表示的 Protobuf 编码数据,返回可读取/变形的 Protobuf 记录集合对象

参数

参数名类型说明
iany十六进制编码的 Protobuf 数据字符串

返回值

序号类型说明
r1*ProtobufRecordsProtobuf 记录集合对象,可用于查看与 fuzz 变形

示例

// 解析 hex 形式的 protobuf 数据,此处仅作示意
records = fuzz.ProtobufHex("0a0568656c6c6f")
println(records.String())

ProtobufJSON

ProtobufJSON(i any) *ProtobufRecords

从 JSON 描述还原 Protobuf 记录集合对象(与 ProtobufRecords.ToJSON 互逆)

参数

参数名类型说明
iany描述 Protobuf 记录的 JSON 字符串

返回值

序号类型说明
r1*ProtobufRecordsProtobuf 记录集合对象,可用于序列化回字节流或 fuzz 变形

示例

// 从 JSON 还原 protobuf 记录,此处仅作示意
records = fuzz.ProtobufJSON(jsonStr)
println(records.ToHex())

ProtobufYAML

ProtobufYAML(i any) *ProtobufRecords

从 YAML 描述还原 Protobuf 记录集合对象(与 ProtobufRecords.ToYAML 互逆)

参数

参数名类型说明
iany描述 Protobuf 记录的 YAML 字符串

返回值

序号类型说明
r1*ProtobufRecordsProtobuf 记录集合对象,可用于序列化回字节流或 fuzz 变形

示例

// 从 YAML 还原 protobuf 记录,此处仅作示意
records = fuzz.ProtobufYAML(yamlStr)
println(records.ToHex())

Strings

Strings(i any) []string

使用 fuzztag 渲染规则,将一个模板字符串展开成一组字符串结果

参数

参数名类型说明
iany含 fuzztag 的模板(如 "{{i(1-3)}}"),也可以是普通字符串

返回值

序号类型说明
r1[]string渲染展开后的字符串列表

示例:示例:fuzz.Strings 的基本用法(整数范围展开)

// 关键词: fuzz.Strings, fuzztag, 整数范围
// {{int(a-b)}} 把闭区间内每个整数都展开成一个结果, 常用于遍历 id/页码等
results = fuzz.Strings("id={{int(1-3)}}")
println(results) // 预期输出: [id=1 id=2 id=3]
assert len(results) == 3, "int(1-3) should expand to 3 results"

示例:示例:fuzz.Strings 的列表与笛卡尔组合

// 关键词: fuzz.Strings, list, 笛卡尔积
// {{list(a|b|c)}} 按 | 分隔逐项展开
single = fuzz.Strings("{{list(admin|root|guest)}}")
println(single) // 预期输出: [admin root guest]
assert len(single) == 3, "list should expand to 3 payloads"
// 同一模板里有多个 fuzztag 时, 各标签的结果做笛卡尔积组合
combo = fuzz.Strings("{{int(1-2)}}-{{list(x|y)}}") // 2 x 2 = 4 种组合
println(combo) // 预期输出: [1-x 2-x 1-y 2-y]
assert len(combo) == 4, "two tags should form a cartesian product"

StringsWithParam

StringsWithParam(i any, i2 any) []string

使用 fuzztag 渲染模板,并允许传入额外的命名参数表参与渲染

参数

参数名类型说明
iany含 fuzztag 的模板字符串
i2any额外参数表(map),可被模板中的 {{params(...)}} 等标签引用

返回值

序号类型说明
r1[]string渲染展开后的字符串列表

示例

results = fuzz.StringsWithParam("{{params(p)}}", {"p": "abc"})
println(results) // OUT: [abc]
assert results[0] == "abc", "param p should be rendered into result"

UrlToHTTPRequest

UrlToHTTPRequest(method string, i any) (*mutate.FuzzHTTPRequest, error)

根据请求方法与 URL 构造一个 HTTP Fuzz 请求对象,便于后续做参数变形与发包

参数

参数名类型说明
methodstring请求方法,如 "GET"、"POST"
iany目标 URL

返回值

序号类型说明
r1*mutate.FuzzHTTPRequest构造好的 HTTP Fuzz 请求对象
r2error错误信息,URL 解析失败时返回非空

示例

freq = fuzz.UrlToHTTPRequest("GET", "https://www.example.com/a?b=1")~
freq.Show()

WithConcurrentLimit

WithConcurrentLimit(i int) HttpPoolConfigOption

size 是一个 HTTP 连接池/批量请求配置选项,用于设置并发请求数量(并发上限)

参数

参数名类型说明
iint并发数量

返回值

序号类型说明
r1HttpPoolConfigOption一个连接池配置选项,作为可变参数传入 httpool.Pool / fuzz / fuzzx 等

示例

// 设置 20 并发,依赖网络,无法本地验证(仅作示意)
res = httpool.Pool(reqs, httpool.size(20))~

WithDelay

WithDelay(b float64) HttpPoolConfigOption

delay 是一个 HTTP 连接池/批量请求配置选项,用于设置每个请求之间的固定延迟秒数

参数

参数名类型说明
bfloat64延迟时间,单位为秒,支持小数

返回值

序号类型说明
r1HttpPoolConfigOption一个连接池配置选项,作为可变参数传入 httpool.Pool / fuzz.Exec / fuzzx 等

示例

// 设置每个请求间隔 1 秒,依赖网络,无法本地验证(仅作示意)
res = httpool.Pool(reqs, fuzzx.delay(1))~

WithNamingContext

WithNamingContext(invokerName string) HttpPoolConfigOption

namingContext 是一个 HTTP 连接池/批量请求配置选项,用于设置命名调用上下文以便对并发任务进行分组限流

参数

参数名类型说明
invokerNamestring调用者名称,用于并发分组标识

返回值

序号类型说明
r1HttpPoolConfigOption一个连接池配置选项,作为可变参数传入 fuzz / fuzzx 等

示例

// 设置命名调用上下文,依赖网络,无法本地验证(仅作示意)
res = httpool.Pool(reqs, fuzzx.namingContext("scan-group-1"))~

WithTimeOut

WithTimeOut(f float64) HttpPoolConfigOption

perRequestTimeout 是一个 HTTP 连接池/批量请求配置选项,用于设置单个请求的超时时间(单位:秒)

参数

参数名类型说明
ffloat64超时时间,单位为秒,支持小数

返回值

序号类型说明
r1HttpPoolConfigOption一个连接池配置选项,作为可变参数传入 httpool.Pool / fuzz / fuzzx 等

示例

// 设置单请求超时 5 秒,依赖网络,无法本地验证(仅作示意)
res = httpool.Pool(reqs, httpool.perRequestTimeout(5))~

可变参数函数详情

HTTPRequest

HTTPRequest(i any, opts ...BuildFuzzHTTPRequestOption) (*FuzzHTTPRequest, error)

根据原始请求报文构造一个 HTTP Fuzz 请求对象,用于对请求各部分进行参数变形与发包

必填参数

参数名类型说明
iany原始 HTTP 请求报文(字符串、字节数组或 *http.Request)

可选参数

可作为可变参数 opts ...BuildFuzzHTTPRequestOption 传入选项;共 6 个可用选项,详见 BuildFuzzHTTPRequestOption 选项列表

返回值

序号类型说明
r1*FuzzHTTPRequest构造好的 HTTP Fuzz 请求对象
r2error错误信息,报文解析失败时返回非空

示例

raw = `GET /?a=1 HTTP/1.1
Host: www.example.com

`
freq = fuzz.HTTPRequest(raw)~
freq.Show()

MustHTTPRequest

MustHTTPRequest(i any, opts ...BuildFuzzHTTPRequestOption) *FuzzHTTPRequest

根据原始请求报文构造一个 HTTP Fuzz 请求对象,构造失败时不返回错误(仅记录日志),便于链式调用

必填参数

参数名类型说明
iany原始 HTTP 请求报文(字符串、字节数组或 *http.Request)

可选参数

可作为可变参数 opts ...BuildFuzzHTTPRequestOption 传入选项;共 6 个可用选项,详见 BuildFuzzHTTPRequestOption 选项列表

返回值

序号类型说明
r1*FuzzHTTPRequest构造好的 HTTP Fuzz 请求对象(失败时可能为 nil)

示例

raw = `GET / HTTP/1.1
Host: www.example.com

`
freq = fuzz.MustHTTPRequest(raw)
freq.Show()

StringsFunc

StringsFunc(i any, cb func(i *mutate.MutateResult), params ...any) error

使用 fuzztag 渲染模板,并为每个渲染结果回调一次,便于流式处理大量结果

必填参数

参数名类型说明
iany含 fuzztag 的模板字符串
cbfunc(i *mutate.MutateResult)针对每个渲染结果触发的回调函数,参数为单个变形结果

可选参数

参数名类型说明
params...any可选的额外参数表,参与模板渲染

返回值

序号类型说明
r1error错误信息,渲染失败时返回非空

示例

fuzz.StringsFunc("{{i(1-3)}}", func(result) {
println(result.Result)
})~

UrlsToHTTPRequests

UrlsToHTTPRequests(target ...any) (*FuzzHTTPRequestBatch, error)

将一个或多个 URL 转换成可批量变形发包的 HTTP Fuzz 请求批次对象

可选参数

参数名类型说明
target...any一个或多个 URL(字符串),支持 fuzztag 展开

返回值

序号类型说明
r1*FuzzHTTPRequestBatchHTTP Fuzz 请求批次对象,可对其统一做参数变形与批量发包
r2error错误信息,无有效请求时返回非空

示例

batch = fuzz.UrlsToHTTPRequests("https://www.example.com/", "https://www.example.com/login")~
batch.Show()

可变参数选项列表

以下按选项类型汇总全部可变参数选项(原先重复在各主函数下的选项表已收拢到此处):

1. 类型:BuildFuzzHTTPRequestOption

涉及到的函数有:fuzz.HTTPRequestfuzz.MustHTTPRequest

选项函数参数返回值说明
fuzz.contextctx context.ContextBuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于传入上下文以便外部取消变形与发包任务
fuzz.httpsi boolBuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于设置该请求是否以 HTTPS 协议发送
fuzz.noEncodei boolBuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于设置是否禁用对 fuzz 结果的自动编码
fuzz.noEscapeHTMLi boolBuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于设置是否禁用对内容的 HTML 转义
fuzz.proxyi stringBuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于设置发包时使用的代理地址
fuzz.showTag-BuildFuzzHTTPRequestOption是一个 HTTP Fuzz 请求构造选项,用于以更友好的方式展示 fuzztag(便于阅读与调试)