手把手教你用Burp Suite插件jsEncrypter爆破自定义加密的登录密码(附PhantomJS配置)
实战指南:利用Burp Suite插件jsEncrypter破解前端自定义加密密码
在Web应用渗透测试中,密码字段的加密处理是常见的安全防护手段。当遇到前端使用自定义加密算法而非标准哈希时,传统的爆破工具往往束手无策。本文将详细介绍如何通过Burp Suite的jsEncrypter插件配合PhantomJS环境,实现对自定义加密算法的密码爆破。
1. 环境准备与工具链搭建
1.1 必备工具清单
- Burp Suite Professional:主流Web渗透测试平台
- jsEncrypter插件:Burp与本地JS加密算法的桥梁
- PhantomJS 2.1.1:无头浏览器执行JS环境
- 目标网站加密JS文件:通过浏览器开发者工具获取
注意:PhantomJS官方已停止维护,建议在隔离环境中使用以避免潜在安全风险
1.2 环境配置步骤
- 安装Java运行时环境(JRE 8+)
- 下载PhantomJS二进制包并解压
- 将PhantomJS的bin目录添加到系统PATH:
# Linux/macOS export PATH=$PATH:/path/to/phantomjs/bin # Windows 系统属性 → 高级 → 环境变量 → 编辑Path - 验证安装:
phantomjs --version
2. 加密算法逆向分析
2.1 定位前端加密逻辑
使用Chrome开发者工具(F12)进行调试:
- 在Network面板捕获登录请求
- 查看提交的加密密码参数
- 在Sources面板全局搜索加密参数名(如
en_password) - 通过断点调试追踪加密过程
典型加密代码结构示例:
// 常见于使用CryptoJS的加密实现 function encryptPassword(rawPass) { var key = CryptoJS.enc.Utf8.parse("自定义密钥"); var iv = CryptoJS.enc.Utf8.parse("初始化向量"); return CryptoJS.AES.encrypt(rawPass, key, {iv: iv}).toString(); }2.2 提取加密JS文件
- 在开发者工具的Sources面板找到加密函数所在JS文件
- 右键点击文件选择"Save as"保存到本地
- 同时保存所有依赖库(如crypto-js.js)
3. jsEncrypter插件配置
3.1 插件安装与基础设置
- 下载jsEncrypter.jar文件
- 在Burp Suite的Extender选项卡中加载插件
- 配置插件参数:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| Server Port | 1664 | PhantomJS服务端口 |
| JS File Path | /path/to/encrypt.js | 加密算法文件路径 |
| Timeout | 5000 | 超时毫秒数 |
3.2 PhantomJS服务启动
创建启动脚本phantomjs_server.js:
var system = require('system'); var server = require('webserver').create(); var service = server.listen(1664, function(request, response) { try { var payload = JSON.parse(request.post); var result = encryptPayload(payload.payload); response.statusCode = 200; response.write(result.toString()); } catch(e) { response.statusCode = 500; response.write(e.toString()); } response.close(); });启动服务:
phantomjs phantomjs_server.js4. 实战爆破流程
4.1 测试环境验证
- 在Burp的jsEncrypter界面点击"Test"
- 输入测试密码观察返回的加密结果
- 与浏览器实际加密结果比对验证一致性
常见问题排查:
- 连接失败:检查防火墙设置,确认端口1664开放
- 加密结果不符:检查JS文件是否包含所有依赖函数
- 超时错误:增加Timeout值或优化加密JS性能
4.2 配置Intruder攻击
- 捕获登录请求发送到Intruder
- 选择加密密码参数为攻击位置
- 在Payload Processing中添加jsEncrypter处理器
- 加载字典文件开始攻击
攻击结果分析方法:
- 通过响应长度/状态码筛选可能成功的尝试
- 在jsEncrypter日志中查找明文-密文对应关系
- 结合响应内容确认有效凭证
5. 高级技巧与优化方案
5.1 性能优化策略
- 使用Web Workers并行处理加密任务
- 预加载加密JS文件减少初始化开销
- 对常见密码进行本地缓存
优化后的加密函数示例:
// 缓存加密实例 var cachedCrypto = null; function getCryptoInstance() { if(!cachedCrypto) { var key = CryptoJS.enc.Utf8.parse("密钥"); cachedCrypto = { key: key }; } return cachedCrypto; } function optimizedEncrypt(pass) { var crypto = getCryptoInstance(); return CryptoJS.AES.encrypt(pass, crypto.key).toString(); }5.2 复杂加密场景处理
对于以下特殊情况需要额外处理:
- 动态密钥:通过Hook密钥生成函数获取实时值
- 随机盐值:在JS中固定随机种子保证可复现
- 多阶段加密:串联多个加密函数调用
5.3 替代方案对比
当PhantomJS不可用时,可考虑:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Node.js + Express | 性能更好 | 需要额外编码 |
| Selenium | 支持现代JS | 资源占用高 |
| PyExecJS | 易于集成 | 兼容性问题 |
6. 防御措施与检测方法
作为渗透测试者,了解防御手段同样重要:
- 服务端加密验证:不依赖前端加密
- 请求指纹校验:防止自动化工具重放
- 速率限制:阻止暴力破解尝试
- 多因素认证:增加破解难度
检测前端加密的简单方法:
// 在浏览器控制台检测常见加密库 if(window.CryptoJS || window.sjcl || window.asmCrypto) { console.log("检测到加密库存在"); }在实际测试项目中,发现最有效的防御是结合动态令牌和请求签名。即使攻击者能够破解前端加密,没有有效的会话令牌也无法完成认证流程。
