渗透测试之前端JS加密浅析
字数 1642 2025-08-10 23:41:50
前端JS加密分析与渗透测试指南
一、加密算法快速判断方法
1. 通过密文特征判断
散列算法特征:
- MD5: 32位十六进制 (如: e10adc3949ba59abbe56e057f20f883e)
- SHA1: 40位十六进制 (如: 7c4a8d09ca3762af61e59520943dc26494f8941b)
- SHA256: 64位十六进制 (如: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92)
- SHA512: 128位十六进制
编码特征:
- BASE64: 以"="结尾 (如: MTIzNDU2)
- BASE32: 以"======"结尾 (如: GEZDGNBVGY======)
- Unicode: 包含"\u"前缀 (如: \u0031\u0032\u0033\u0034\u0035\u0036)
加密算法特征:
- DES/AES/RSA: 密文无规律,常以Base64编码输出
- 对称和非对称加密通常以16进制形式表示(最大字母到F)
2. 通过开发者工具判断
- 查看Network加载资源,寻找加密库如:
- jsencrypt
- crypto-js
- 其他自定义加密库
二、加密JS代码定位方法
1. 关键字搜索法
-
常用搜索关键字:
- encrypt
- passwd/password
- MD5/AES/DES/RSA
- 加密参数名
-
搜索对象定义:
var object function object object: object =
2. XHR断点法
适用场景:XHR/fetch请求
操作步骤:
- 在开发者工具的XHR/fetch Breakpoints中添加固定路径(如:/adminlogin)
- 提交请求时会被断住
- 通过调用栈分析(从下往上)定位加密点
优点:距离加密函数较近
3. DOM事件断点法
操作步骤:
- 在开发者工具的Event Listeners中找到登录事件
- 定位到相关JS文件
- 在疑似加密处下断点
- 跟值分析
特点:定位位置靠前,需要跟值到加密点
三、加密算法特征与扣取方法
1. RSA加密
特征代码:
new JSEncrypt();
a.setPublicKey("key");
a.encrypt(passwd);
扣取步骤:
- 找到JSEncrypt对象定义
- 提取整个大函数(通常在2000行左右)
- 解决环境依赖:
navigator = {}; window = this; - 构造调用函数:
function rsaPass(passwd) { var e = new JSEncrypt(); e.setPublicKey("public_key_here"); return e.encrypt(passwd); }
注意:
- RSA加密同一字符串每次生成的密文不同
- 公钥通常隐藏在HTML元素中(如:$("#e").val())
2. DES加密
特征代码:
const keyBytes = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.DES.encrypt(message, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
关键参数:
- 密钥(key)
- 加密模式(ECB/CBC等)
- 填充方式(Pkcs7等)
3. AES加密
特征代码:
function Encrypt(xxx){
var xxx = CryptoJS.enc.Utf8.parse('key');
var xx = CryptoJS.enc.Utf8.parse(xxx);
var xxx = CryptoJS.AES.encrypt(xxx);
}
四、代码提取注意事项
-
作用域问题:
var _hex_md5; !(function(){ var j = { hex_md5: function(){ console.log("1"); } } _hex_md5 = j; //导出 })() -
完整提取:
- 不能只提取加密函数,需要包含其所属对象
- 从
var开始到最后一个}是一个完整单元
-
环境依赖:
- 注意
navigator、window等浏览器对象 - 可能需要补充依赖如
ASN1等
- 注意
五、测试脚本开发
1. 加密脚本
- DES/AES/RSA批量加密脚本
- 需要预先提取目标网站的key和加密参数
2. SQL注入辅助脚本
- AES/DES配合sqlmap的SQL注入脚本
- 示例项目:https://github.com/Small-ears/DES-AES_SQL_Scripts
六、常见问题解决
-
环境报错:
ASN1 is not defined:从加密库源码中补充相关定义- 浏览器环境对象缺失:补充
navigator、window等
-
密文不一致:
- 检查加密模式(ECB/CBC)和填充方式
- RSA加密同一字符串每次结果不同是正常现象
-
代码提取不全:
- 确保提取完整的函数作用域
- 注意闭包和自执行函数
七、实战建议
- 优先使用XHR断点法定位加密点
- 对于非XHR请求,使用DOM事件断点或关键字搜索
- 提取代码时注意环境依赖和作用域
- 测试时先验证单个加密结果是否匹配
- 开发自动化脚本时考虑参数化和批量处理
通过以上方法,可以有效地分析和处理前端JS加密,为渗透测试提供必要的技术支持。