利用Yakit实现前端加密数据的透明化拦截与自动化密文转换
1. 前端加密场景下的渗透测试痛点现代Web应用普遍采用前端加密技术保护敏感数据比如登录密码、支付信息等。这种机制虽然提升了安全性却给安全测试人员带来了新挑战。我最近在测试一个金融类应用时就遇到了典型场景前端用AES加密所有表单数据导致BurpSuite抓到的全是密文根本看不出原始内容是什么。这种情况就像戴着墨镜看彩色图画——你知道画面存在但无法分辨细节。传统做法是先逆向前端加密逻辑再手动解密/加密效率极低。有次我为了测试一个登录接口花了三小时分析JavaScript代码最后发现只是标准AES-CBC模式这种重复劳动实在让人头疼。更麻烦的是历史记录管理。测试过程中往往需要反复查看之前的请求如果保存的都是密文每次都要手动解密。有次审计时漏看了一个加密参数导致后续测试跑偏白白浪费两天时间。这些痛点催生了对透明化处理工具的需求——既能实时看到明文又能自动维持加密传输。2. Yakit的中间人热加载机制Yakit的MITM热加载模块就像给数据流装上了X光机。其工作原理可以类比快递中转站当数据包快递经过Yakit中转站时我们可以拆开包裹查看内容解密修改后再重新打包加密发往目的地。整个过程对收发双方完全透明他们感知不到中间发生的变换。具体到代码层面关键有三个拦截点hijackHTTPRequest相当于快递刚进中转站大门此时可以决定是否放行或修改beforeRequest相当于快递即将出站前的最后检查点确保包装符合要求hijackSaveHTTPFlow相当于快递记录存档环节决定留存什么形式的信息我特别喜欢这种热加载设计不用重启服务就能生效修改。有次在客户现场演示时发现加密模式突然变更现场改了几行代码就立即适应客户直呼这比我们开发调试还快。3. 实战AES加密拦截与转换假设遇到使用AES-CBC模式的前端加密key和iv固定为1234567812345678和1234567812345678。先在Yakit的Codec模块创建两个处理器// 解密处理器 decode_base64_AES input base64Decode AESDecrypt( key: 1234567812345678, iv: 1234567812345678, mode: CBC, output: raw ) // 加密处理器 encode_AES_base64 input AESEncrypt( key: 1234567812345678, iv: 1234567812345678, mode: CBC ) base64Encode接下来配置热加载脚本。先处理历史记录明文保存dec_base64_aes func(data){ aa {{codecflow(decode_base64_AES| data )}} return fuzz.Strings(aa)[0] } hijackSaveHTTPFlow func(flow, modify, drop) { // 处理请求 req codec.StrconvUnquote(flow.Request)~ if str.Contains(req, encryptedData){ postParams poc.ExtractPostParams(req)~ postParams[encryptedData] dec_base64_aes(postParams[encryptedData]) flow.Request codec.StrconvQuote(poc.ReplaceHTTPPacketJsonBody(req, postParams)) } // 处理响应可选 rsp codec.StrconvUnquote(flow.Response)~ if str.Contains(rsp, encryptedResponse){ // 类似请求的处理逻辑 } modify(flow) }这个配置让我在测试某电商平台时效率提升惊人。原本需要手动解密的200多个API请求现在历史记录直接显示明文还能用CtrlF全局搜索关键参数。4. 实现实时明文修改与自动加密要实现明文修改-自动加密的工作流需要组合使用hijackHTTPRequest和beforeRequest// 解密入口 hijackHTTPRequest func(isHttps, url, req, forward, drop) { if poc.GetHTTPRequestMethod(req) POST { postParams poc.ExtractPostParams(req)~ if encryptedData in postParams { // 转换为明文供修改 postParams[encryptedData] dec_base64_aes(postParams[encryptedData]) forward(poc.ReplaceHTTPPacketJsonBody(req, postParams)) return } } forward(req) } // 加密出口 enc_base64_aes func(data){ aa {{codecflow(encode_AES_base64| data )}} return fuzz.Strings(aa)[0] } beforeRequest func(ishttps, oreq, req){ if poc.GetHTTPRequestMethod(req) POST { postParams poc.ExtractPostParams(req)~ if encryptedData in postParams !str.HasPrefix(postParams[encryptedData], eyJ) { // 重新加密修改后的内容 postParams[encryptedData] enc_base64_aes(postParams[encryptedData]) return poc.ReplaceHTTPPacketJsonBody(req, postParams) } } return req }在测试某OA系统时我用这个方案发现了越权漏洞。虽然前端对权限参数做了加密但通过Yakit实时修改明文参数最终发现后端完全没有校验权限标识。这种漏洞用传统测试方法极难发现因为加密后的参数值根本看不出含义。5. 调试技巧与常见问题排查热加载脚本调试有个小窍门先在Yak Runner中测试单次执行。比如准备一个加密请求样本sampleReq POST /login HTTP/1.1 Content-Type: application/json {encryptedData:U2FsdGVkX18v7s5z7Xw3G9RtDk7J6q9T8Z7vC1Y2E} // 测试解密 decrypted dec_base64_aes(U2FsdGVkX18v7s5z7Xw3G9RtDk7J6q9T8Z7vC1Y2E) println(decrypted) // 应输出明文如admin123 // 测试加密闭环 println(enc_base64_aes(decrypted)) // 应能还原原始密文常见问题及解决方案乱码问题检查AES输出格式通常选raw而非hexPadding错误确认前端使用的padding模式常见PKCS#7历史记录不更新检查hijackSaveHTTPFlow是否调用了modify(flow)加密失效在beforeRequest中用println输出中间值查看加密链路有次客户现场遇到RSAAES混合加密前端先用RSA加密AES的key。通过Yakit的调试模式发现他们实际用的是RSA_ECB模式而非文档写的RSA_OAEP这个小细节让测试进度快了整整一天。6. 扩展应用场景这套方法不仅适用于AES通过修改Codec处理器可以适配各种加密RSA加密添加decode_rsa处理器注意处理分段加密情况自定义加密用JavaScript实现编解码逻辑后嵌入Codec组合加密像乐高积木一样串联多个Codec处理器在某次物联网设备测试中遇到先用MD5哈希再AES加密的场景。通过组合处理器轻松应对// 自定义解密流程 input base64Decode AESDecrypt md5Verify(prefix:salt_)对于动态密钥的场景可以通过hook密钥生成函数来固定密钥。曾有个项目每次登录生成新key通过定位CryptoJS.key的生成位置替换为固定值后测试效率提升10倍不止。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417298.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!