当密码不是MD5:手把手教你用Burp+jsEncrypter搞定前端自定义加密爆破
当密码不是MD5:手把手教你用Burp+jsEncrypter搞定前端自定义加密爆破
渗透测试中遇到前端自定义加密的场景越来越普遍。许多开发者为了提升安全性,会采用非标准的加密算法组合,比如CryptoJS的多层嵌套加密。这种情况下,传统的爆破工具往往束手无策。本文将带你完整走通从加密分析到成功爆破的全流程。
1. 问题定位:识别前端加密特征
当你抓包发现密码字段不是常见的MD5或Base64,而是一串看似随机的字符时,很可能遇到了自定义加密。这时需要:
- 确认加密位置:通过浏览器开发者工具查看网络请求,确认加密发生在客户端
- 分析加密特征:观察密文长度、字符集等特征,初步判断可能的加密方式
- 定位加密代码:在Sources面板搜索关键词如"encrypt"、"password"等
常见加密库特征:
- CryptoJS:通常会出现
CryptoJS.AES等字样 - WebCrypto API:使用
window.crypto.subtle对象 - 自定义实现:可能包含复杂的位运算和字符串处理
2. 逆向分析:提取加密逻辑
找到加密代码后,需要提取出核心加密逻辑。以CryptoJS为例:
// 典型CryptoJS加密示例 function encryptPassword(pwd) { var key = CryptoJS.enc.Utf8.parse('my-secret-key'); var iv = CryptoJS.enc.Utf8.parse('1234567890123456'); var encrypted = CryptoJS.AES.encrypt( CryptoJS.enc.Utf8.parse(pwd), key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return encrypted.toString(); }关键提取步骤:
- 确认加密算法类型(AES、DES等)
- 提取密钥和IV(如果有)
- 记录加密模式和填充方式
- 注意是否有额外的编码处理(如Base64)
3. 环境搭建:配置jsEncrypter+PhantomJS
3.1 安装必要组件
| 组件 | 作用 | 下载来源 |
|---|---|---|
| jsEncrypter | Burp插件,桥接JS加密逻辑 | GitHub |
| PhantomJS | 无头浏览器,执行JS代码 | 官网 |
| CryptoJS | 加密库(如需) | CDN或本地 |
安装步骤:
- 将PhantomJS添加到系统PATH
- 将jsEncrypter插件jar文件放入Burp的extender目录
- 准备加密JS文件(包含提取的加密逻辑)
3.2 配置jsEncrypter
创建自定义JS文件custom_encrypt.js:
// 引入必要的加密库 var CryptoJS = require('./crypto-js.js'); function process(payload) { // 这里放入提取的加密逻辑 var encrypted = yourEncryptFunction(payload); return encrypted; }4. 实战爆破:从配置到结果分析
4.1 启动加密服务
phantomjs phantomjs_server.js确保服务正常启动后,在Burp中:
- 打开jsEncrypter插件界面
- 点击"Connect"测试连接
- 使用"Test"功能验证加密是否正确
4.2 配置Intruder攻击
- 设置攻击类型为"Sniper"或"Cluster bomb"
- 在Payload位置选择"Payload Processing"
- 添加处理规则:选择"Invoke Burp extension"→"jsEncrypter"
注意:爆破前建议先测试单个payload的加密结果是否正确
4.3 结果分析与优化
成功爆破后,可以通过以下方式优化结果:
- 过滤响应长度异常的请求
- 设置Grep匹配规则识别成功响应
- 使用Logger++插件记录完整交互过程
5. 进阶技巧与问题排查
5.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接失败 | PhantomJS未启动 | 检查服务端口和防火墙 |
| 加密结果不符 | 逻辑不一致 | 确保JS代码与前端完全一致 |
| 性能低下 | 复杂加密算法 | 优化JS代码或升级硬件 |
5.2 性能优化建议
- 精简加密逻辑:移除不必要的代码和依赖
- 缓存加密结果:对重复payload直接返回缓存
- 多线程处理:调整PhantomJS的worker数量
// 示例:简单缓存实现 var cache = {}; function process(payload) { if(cache[payload]) return cache[payload]; var result = encrypt(payload); cache[payload] = result; return result; }6. 安全防护建议
对于开发者而言,防范此类攻击可以考虑:
- 实施服务端加密方案
- 添加请求频率限制
- 使用动态密钥或时间戳
- 增加验证码等二次验证
在实际测试中,我发现最耗时的部分往往是逆向分析加密逻辑。有时开发者会故意混淆代码,这时需要耐心调试。一个实用技巧是使用浏览器控制台逐步执行加密函数,观察中间变量的变化。
