告别盲猜!手把手教你用Burp插件jsEncrypter搞定前端自定义加密密码爆破
实战指南:利用jsEncrypter突破前端自定义加密的密码爆破难题
当渗透测试遇到采用自定义加密算法的登录系统时,传统的爆破工具往往束手无策。本文将带你深入理解如何通过Burp Suite的jsEncrypter插件与PhantomJS配合,构建一套完整的自定义加密爆破解决方案。
1. 环境准备与工具链搭建
在开始实战前,需要确保以下工具已正确安装并配置:
- Burp Suite Professional:确保版本在2023年之后,以兼容最新插件
- jsEncrypter插件:从官方GitHub仓库获取最新release版本
- PhantomJS 2.1.1:这是最稳定的兼容版本
- 文本编辑器:推荐VS Code或Sublime Text用于JS代码调试
关键配置步骤:
- 将PhantomJS的bin目录添加到系统PATH环境变量
- 在Burp的Extender中加载jsEncrypter的jar文件
- 创建专用工作目录存放加密相关的JS文件
注意:避免将工具安装在包含中文或空格的路径中,这可能导致后续脚本执行失败。
2. 逆向分析前端加密逻辑
面对自定义加密的前端代码,我们需要通过系统化的方法定位关键加密函数:
2.1 定位加密入口
使用Chrome开发者工具进行动态分析:
- 在登录页面打开开发者工具(F12)
- 切换到Sources面板,在提交事件上设置断点
- 单步执行直到发现密码字段被处理的代码段
常见加密库识别特征:
| 库名称 | 典型调用模式 | 常见文件名称 |
|---|---|---|
| CryptoJS | CryptoJS.AES.encrypt() | crypto-js.js |
| sjcl | sjcl.encrypt() | sjcl.js |
| forge | forge.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 refused | PhantomJS未启动 | 检查服务是否在6666端口监听 |
| Empty response | 回调函数未正确返回 | 验证onCallback函数逻辑 |
| Algorithm mismatch | JS环境差异 | 确保PhantomJS版本兼容 |
| Timeout | 加密函数执行过长 | 优化算法性能或增加超时设置 |
提示:使用
netstat -ano|findstr 6666命令验证端口占用情况
4. 实战爆破流程详解
4.1 Burp Suite配置步骤
- 在Proxy→Intercept捕获登录请求
- 右键发送到Intruder
- 在Positions标签设置爆破点:
password=§payload§- 在Payloads标签选择字典文件
- 在Options→Request Engine调整线程数为5-10
4.2 结果分析与验证
爆破完成后,通过以下方法识别有效凭证:
- 按长度排序响应,异常长度可能表示成功登录
- 使用Grep-Match匹配成功登录的特征字符串
- 检查响应时间差异,成功登录通常耗时更长
高级技巧:
- 对结果应用过滤器排除常见错误响应
- 使用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. 安全防护与合规建议
在执行密码爆破测试时,务必注意:
- 获取明确的书面授权
- 控制在非生产环境测试
- 设置合理的速率限制避免服务拒绝
- 测试完成后及时清理生成的测试数据
最佳实践:
- 使用专用测试账户而非真实用户数据
- 在非业务高峰期执行测试
- 记录完整操作日志供审计复查
在实际项目中,我发现最耗时的环节往往是加密算法的逆向分析阶段。建议先通过静态分析缩小范围,再结合动态调试确认关键代码路径,这样可以显著提高效率。
