Yakit WebFuzzer热加载实战:手把手教你用Yak代码自定义加密Payload(附Base64案例)

张开发
2026/5/8 10:16:54 15 分钟阅读

分享文章

Yakit WebFuzzer热加载实战:手把手教你用Yak代码自定义加密Payload(附Base64案例)
Yakit WebFuzzer热加载实战手把手教你用Yak代码自定义加密Payload附Base64案例在渗透测试的实际场景中我们经常会遇到需要自定义处理请求参数的情况。比如需要对密码进行特定的编码、哈希或者更复杂的加密逻辑而工具内置的标签功能往往无法满足这些个性化需求。这就是Yakit WebFuzzer的热加载功能大显身手的时候了。热加载就像给你的测试工具装上了一把瑞士军刀让你可以随时根据需求热插拔各种自定义处理逻辑。不同于那些需要重启工具才能生效的插件机制热加载让你在测试过程中就能即时编写、修改和调用自定义代码真正实现了随需应变的灵活测试。1. 热加载基础从Base64编码开始让我们从一个最基础的案例入手如何使用热加载对请求参数进行Base64编码。这个例子虽然简单但包含了热加载的核心概念和基本工作流程。1.1 准备工作首先确保你已经安装最新版Yakit建议1.1.0及以上版本熟悉WebFuzzer的基本操作了解Base64编码的基本概念1.2 创建热加载函数在WebFuzzer界面点击热加载按钮打开代码编辑器。我们将在这里编写第一个热加载函数// base64Encode 函数接收一个字符串参数返回其Base64编码结果 base64Encode func(param) { // 使用Yak内置的codec.EncodeBase64函数进行编码 encoded codec.EncodeBase64(param) return encoded }这个函数定义了几个关键要素函数名base64Encode这是我们调用时使用的名称参数param接收待处理的原始字符串返回值经过Base64编码后的字符串1.3 调用热加载函数编写完函数后点击保存。现在你可以在WebFuzzer的请求模板中使用这个函数了。调用格式为{{yak(base64Encode|待编码字符串)}}例如要对密码admin123进行编码{{yak(base64Encode|admin123)}}1.4 结合字典使用热加载的强大之处在于它可以与其他功能结合使用。比如配合字典进行批量测试{{yak(base64Encode|{{x(pass_top25)}})}}这行代码会从内置的pass_top25字典中取出密码对每个密码进行Base64编码将编码结果作为请求参数发送2. 进阶应用自定义加密算法Base64只是入门热加载的真正价值在于支持任意自定义加密算法。下面我们看几个实用案例。2.1 MD5哈希处理很多系统会对密码进行MD5哈希存储测试时需要模拟这种处理方式。我们可以这样实现import hash // md5Hash 生成字符串的MD5哈希值 md5Hash func(param) { // 创建MD5哈希对象 h hash.New(md5) // 写入待哈希数据 h.Write(param) // 返回16进制格式的哈希值 return h.Sum(hex) }调用方式与Base64类似{{yak(md5Hash|{{x(pass_top25)}})}}2.2 AES加密实现对于使用AES加密的接口我们可以这样处理import codec // aesEncrypt 使用AES-128-CBC加密字符串 aesEncrypt func(param) { // 设置密钥和IV实际使用时应替换为目标的密钥 key 1234567890123456 iv 1234567890123456 // 进行AES加密 encrypted, err codec.AESCBCEncrypt(key, param, iv) if err ! nil { return sprintf(加密失败: %v, err) } // 返回Base64编码的加密结果 return codec.EncodeBase64(encrypted) }注意实际测试时应使用目标系统真实的加密密钥和IV参数可以通过逆向分析或文档获取这些信息。2.3 时间戳签名很多API接口需要参数签名常见的是将参数拼接时间戳后做哈希。我们可以这样实现import time // timestampSign 生成带时间戳的签名 timestampSign func(param) { // 获取当前时间戳秒级 ts time.Now().Unix() // 拼接参数和时间戳 toSign sprintf(%s%d, param, ts) // 生成MD5签名 h hash.New(md5) h.Write(toSign) sign h.Sum(hex) // 返回参数、时间戳和签名组成的字符串 return sprintf(param%stimestamp%dsign%s, param, ts, sign) }调用这个函数后每个请求都会自动生成包含当前时间戳和有效签名的参数。3. 热加载高级技巧掌握了基础用法后让我们探索一些热加载的高级功能这些功能可以极大提升测试效率。3.1 魔术方法beforeRequest和afterRequest热加载提供了两个特殊的魔术方法可以在请求发送前和收到响应后对数据进行处理。3.1.1 beforeRequest示例自动添加请求头// beforeRequest 在每个请求发送前被调用 beforeRequest func(req) { // 将请求转换为字符串 reqStr string(req) // 添加自定义请求头 modifiedReq reqStr.Replace( POST /api/login HTTP/1.1, POST /api/login HTTP/1.1\r\nX-Custom-Header: myvalue ) return []byte(modifiedReq) }3.1.2 afterRequest示例提取响应Token// afterRequest 在每个响应收到后被调用 afterRequest func(rsp) { // 尝试从JSON响应中提取token rspStr string(rsp) token re.Extract(rspStr, token:([^])) // 如果找到token打印出来 if len(token) 0 { println(提取到token:, token[0]) } return rsp }3.2 多函数组合调用热加载支持在一个调用中组合多个函数实现复杂的数据处理流水线。例如{{yak(md5Hash|{{yak(base64Encode|{{x(pass_top25)}})}})}}这行代码会依次执行从字典获取密码进行Base64编码对编码结果进行MD5哈希3.3 调试技巧编写复杂的热加载函数时调试是必不可少的。Yakit提供了几种调试方式println输出在函数中使用println打印调试信息断点调试在关键位置添加debugger语句单元测试先在Yak独立脚本中测试函数逻辑例如// 调试示例 testFunc func(param) { println(输入参数:, param) // 中间处理 processed someOperation(param) println(处理结果:, processed) debugger // 这里会暂停执行 return finalOperation(processed) }4. 实战案例复杂加密算法实现让我们看一个真实场景中的复杂案例某电商网站的登录接口参数加密。4.1 分析加密逻辑通过逆向分析发现该网站的密码加密流程如下对原始密码进行SHA1哈希拼接固定盐值和时间戳对拼接结果进行HMAC-SHA256签名最后进行URL编码4.2 实现热加载函数import codec import hash import time // encryptPassword 实现目标的复杂加密逻辑 encryptPassword func(password) { // 第一步SHA1哈希 h1 hash.New(sha1) h1.Write(password) sha1Hash h1.Sum(hex) // 第二步拼接盐值和时间戳 salt fixed_salt_value ts time.Now().Unix() toSign sprintf(%s%s%d, sha1Hash, salt, ts) // 第三步HMAC-SHA256签名 key secret_hmac_key hmac hash.HmacSha256(key, toSign) hmacHex hmac.Sum(hex) // 第四步URL编码 final codec.EncodeUrl(hmacHex) return sprintf(password%stimestamp%d, final, ts) }4.3 使用技巧在实际测试时我们可以这样调用{{yak(encryptPassword|{{x(user_pass_dict)}})}}为了提高效率还可以缓存加密结果对相同密码避免重复计算并行处理利用Yak的并发特性加速加密过程错误重试添加错误处理逻辑优化后的版本import sync // 使用缓存避免重复计算 var passwordCache sync.Map{} optimizedEncrypt func(password) { // 检查缓存 if cached, ok : passwordCache.Load(password); ok { return cached } // 原始加密逻辑 result encryptPassword(password) // 存入缓存 passwordCache.Store(password, result) return result }热加载功能的灵活性让我们可以轻松应对各种复杂的加密场景而无需等待工具官方支持。掌握这项技术后你会发现WebFuzzer的潜力被完全释放能够适应几乎任何自定义的测试需求。

更多文章