热加载
在聊热加载之前,我们首先需要对其进行了解:什么是热加载?
广义上来说,热加载是一种允许在不停止或重启应用程序的情况下,动态加载或更新特定组件或模块的功能。这种技术常用于开发过程中,提高开发效率和用户体验。
在Yakit 的Web Fuzzer中,热加载是一种高级技术,让 Yak 成为 Web Fuzzer 和用户自定义代码中的桥梁,它允许我们编写一段 Yak 函数,在 Web Fuzzer 过程中使用,从而实现自定义 fuzztag 或更多功能。
#
调用热加载 fuzztag实际上,我们调用热加载中编写的函数也使用 fuzztag 。我们也可以理解为热加载是一种特殊的 fuzztag ,它的格式为:
{{yak(funcname)}}
当我们需要传入参数时,则格式为
{{yak(funcname|param)}}
需要注意的是,我们传入的参数可以是 fuzztag ,也就是可以编写形如:{{yak(funcname|{{x(pass_top25)}})}}
的格式。
#
热加载函数定义我们可以在热加载页面中编写热加载函数,其函数定义如下:
// 函数名为funcname,参数只有一个,为param,类型是字符串funcname = func(param) { // 返回值可以是字符串或数组 return param}
#
使用热加载实现大写转换点击图片中的热加载按钮,打开热加载页面:
如图来看一下热加载页面的功能:
接下来我们来编写一个简单的热加载内容,使用 Yak 代码来将传入的字符串转换为大写,代码如下:
upper = func(s) { // 传入的参数,类型为字符串,返回值可以是字符串或数组 return s.Upper()}
然后我们点击保存按钮,保存热加载内容,这时候我们就可以在 Web Fuzzer 中使用这个热加载 fuzztag 了,如图所示,可以看到字符串中的英文字母都变为大写了:
#
使用热加载实现更灵活的 fuzztag上文中有提到,热加载函数可以返回一个数组,当我们返回一个数组时, Web Fuzzer 会将数组中的每一个元素都作为值去发包,所以当我们数组有5个元素时, Web Fuzzer 会发出5个包,这样我们就可以实现更灵活的fuzztag了。
以下是一个简单的例子,我们返回一个数组,其原始值为list = ["1", "2", "3"]
, 然后将数组中的每个元素进行base64编码后再url编码:
handle = func(param) { list = ["1", "2", "3"] for i, v = range list { list[i] = codec.EncodeBase64Url(v) } return list}
然后我们点击保存按钮,保存热加载内容,这时候我们就可以在 Web Fuzzer 中使用这个热加载 fuzztag 了,如图所示,可以看到数字1,2,3都被base64编码后再url编码了:
#
热加载中的"魔术方法"在热加载代码区中,实际上存在两个特殊的魔术方法:beforeRequest
和afterRequest
,它函数的定义如下:
// beforeRequest 允许发送数据包前再做一次处理,定义为 func(origin []byte) []bytebeforeRequest = func(req) { return []byte(req)}
// afterRequest 允许对每一个请求的响应做处理,定义为 func(origin []byte) []byteafterRequest = func(rsp) { return []byte(rsp)}
这两个魔术方法分别在每次请求之前和每次请求拿到响应之后调用,它们可以用于修改我们 Web Fuzzer 的请求与响应。通过这两个魔术方法配合 Yak代码,我们实际上可以实现许多有用的功能。
以下是一个简单的例子,我们将请求包中的__TIMESTAMP__
替换为当前的时间戳:
如果我们只是使用这两个魔术方法,我们实际上不需要在 Web Fuzzer 中使用热加载 fuzztag ,它就会自动执行。