告别盲猜!手把手教你用Burp插件jsEncrypter搞定前端自定义加密密码爆破

告别盲猜!手把手教你用Burp插件jsEncrypter搞定前端自定义加密密码爆破

实战指南:利用jsEncrypter突破前端自定义加密的密码爆破难题

当渗透测试遇到采用自定义加密算法的登录系统时,传统的爆破工具往往束手无策。本文将带你深入理解如何通过Burp Suite的jsEncrypter插件与PhantomJS配合,构建一套完整的自定义加密爆破解决方案。

1. 环境准备与工具链搭建

在开始实战前,需要确保以下工具已正确安装并配置:

  • Burp Suite Professional:确保版本在2023年之后,以兼容最新插件
  • jsEncrypter插件:从官方GitHub仓库获取最新release版本
  • PhantomJS 2.1.1:这是最稳定的兼容版本
  • 文本编辑器:推荐VS Code或Sublime Text用于JS代码调试

关键配置步骤

  1. 将PhantomJS的bin目录添加到系统PATH环境变量
  2. 在Burp的Extender中加载jsEncrypter的jar文件
  3. 创建专用工作目录存放加密相关的JS文件

注意:避免将工具安装在包含中文或空格的路径中,这可能导致后续脚本执行失败。

2. 逆向分析前端加密逻辑

面对自定义加密的前端代码,我们需要通过系统化的方法定位关键加密函数:

2.1 定位加密入口

使用Chrome开发者工具进行动态分析:

  1. 在登录页面打开开发者工具(F12)
  2. 切换到Sources面板,在提交事件上设置断点
  3. 单步执行直到发现密码字段被处理的代码段

常见加密库识别特征:

库名称典型调用模式常见文件名称
CryptoJSCryptoJS.AES.encrypt()crypto-js.js
sjclsjcl.encrypt()sjcl.js
forgeforge.md5.create()forge.min.js

2.2 提取加密算法

找到类似以下代码片段时,需要完整提取加密逻辑:

function encryptPassword(pwd) { var salt = CryptoJS.lib.WordArray.random(16); var key = CryptoJS.PBKDF2(pwd, salt, { keySize: 256/32, iterations: 1000 }); return key.toString(); }

关键操作

  • 保存完整的加密JS文件
  • 记录所有依赖的库文件
  • 确认是否有动态参数(如随机salt)

3. jsEncrypter与PhantomJS集成配置

3.1 服务端脚本定制

修改phantomjs_server.js以适配你的加密逻辑:

var page = require('webpage').create(); var fs = require('fs'); // 加载加密库 var cryptoJs = fs.read('crypto-js.js'); eval(cryptoJs); page.onCallback = function(data) { // 处理来自Burp的请求 var result = customEncrypt(data.payload); return result; }; function customEncrypt(input) { // 这里实现你的加密逻辑 var words = CryptoJS.enc.Utf8.parse(input); return CryptoJS.enc.Base64.stringify(words); } // 保持服务运行 phantom.exit();

3.2 常见连接问题排查

错误现象可能原因解决方案
Connection refusedPhantomJS未启动检查服务是否在6666端口监听
Empty response回调函数未正确返回验证onCallback函数逻辑
Algorithm mismatchJS环境差异确保PhantomJS版本兼容
Timeout加密函数执行过长优化算法性能或增加超时设置

提示:使用netstat -ano|findstr 6666命令验证端口占用情况

4. 实战爆破流程详解

4.1 Burp Suite配置步骤

  1. 在Proxy→Intercept捕获登录请求
  2. 右键发送到Intruder
  3. 在Positions标签设置爆破点:
password=§payload§
  1. 在Payloads标签选择字典文件
  2. 在Options→Request Engine调整线程数为5-10

4.2 结果分析与验证

爆破完成后,通过以下方法识别有效凭证:

  1. 按长度排序响应,异常长度可能表示成功登录
  2. 使用Grep-Match匹配成功登录的特征字符串
  3. 检查响应时间差异,成功登录通常耗时更长

高级技巧

  • 对结果应用过滤器排除常见错误响应
  • 使用Cluster bomb攻击类型测试多参数组合
  • 结合Turbo Intruder处理大规模字典

5. 复杂场景应对策略

当遇到更复杂的加密方案时,需要扩展我们的方法:

5.1 动态参数处理

如果加密需要服务器返回的动态值(如nonce):

page.onCallback = function(data) { var nonce = getNonceFromServer(); return encrypt(data.payload, nonce); };

5.2 多阶段加密方案

对于多次加密的情况,需要完整重现加密流程:

function complexEncrypt(input) { var stage1 = CryptoJS.MD5(input); var stage2 = CryptoJS.AES.encrypt(stage1, "secret"); return stage2.toString(); }

5.3 性能优化技巧

  • 预加载加密库减少每次调用开销
  • 使用Web Workers并行处理加密任务
  • 缓存中间结果避免重复计算

6. 安全防护与合规建议

在执行密码爆破测试时,务必注意:

  • 获取明确的书面授权
  • 控制在非生产环境测试
  • 设置合理的速率限制避免服务拒绝
  • 测试完成后及时清理生成的测试数据

最佳实践

  • 使用专用测试账户而非真实用户数据
  • 在非业务高峰期执行测试
  • 记录完整操作日志供审计复查

在实际项目中,我发现最耗时的环节往往是加密算法的逆向分析阶段。建议先通过静态分析缩小范围,再结合动态调试确认关键代码路径,这样可以显著提高效率。