记某次常规js前端逆向
字数 962 2025-08-24 16:48:15
JS前端逆向实战教学:RSA加密密码的逆向分析与批量生成
1. 前言
在渗透测试或安全研究中,经常会遇到前端加密的情况,特别是密码字段的加密。本文将通过一个实际案例,详细讲解如何逆向分析前端JS加密逻辑,并使用Python实现批量加密。
2. 加密发现与初步分析
2.1 发现加密现象
在登录抓包时发现密码被加密,表现为:
- 原始密码:
123456 - 加密后:
a1b2c3...(长字符串)
2.2 定位加密点
- F12开发者工具:打开浏览器开发者工具
- 全文搜索:在Sources面板中全局搜索
password字段 - 找到加密点:发现
encryptedPassword函数
3. 深入逆向分析
3.1 设置断点调试
- 在加密函数的关键行设置断点(案例中为194行和203行)
- 重新触发登录操作,观察断点处的变量值
3.2 分析加密函数
function encryptedPassword(password){
// 老的加密算法有问题,使用新的实现方法
var key = '10001&94dd2a8675fb779e6b9f7103698634cd400f27a154afa67af6166a43fc26417222a79506d34cacc7641946abda1785b7acf9910ad6a0978c91ec84d40b71d2891379af19ffb333e7517e390bd26ac312fe940c340466b4a5d4af1d65c3b5944078f96a1a51a5a53e4bc302818b7c9f63c4a1b07bd7d874cef1c3d4b2f5eb7871'
var split = key.split("&");
var publicKeyExponent = split[0];
var publicKeyModulus = split[1];
RSAUtils.setMaxDigits(200);
var key = new RSAUtils.getKeyPair(publicKeyExponent, "", publicKeyModulus);
var passwordEncry = RSAUtils.encryptedString(key,password.split("").reverse().join(""));
// 这里要对字符串进行反转,否则解密的密码是反的
return passwordEncry;
}
关键点:
- 使用RSA非对称加密
- 公钥由两部分组成:
10001(指数)和长字符串(模数) - 密码在加密前进行了反转操作
3.3 查找RSAUtils实现
- 在开发者工具中搜索
RSAUtils - 找到相关JS代码并复制出来
- 注意需要去除
$w和})(window);等浏览器环境相关代码
4. Python实现批量加密
4.1 使用PyExecJS
安装:
pip install pyexecjs
4.2 示例代码结构
- JS文件(s.js):
function f(x,y) {
return x+y
}
- Python调用:
import execjs
with open('s.js', 'r', encoding='utf-8') as f:
jstext = f.read()
ctx = execjs.compile(jstext) # 加载js
x = 1
y = 2
result = ctx.call('f', x, y) # 调用js里面的函数
print(result)
4.3 实际加密实现
- 将
RSAUtils代码和encryptedPassword函数整合到一个JS文件中 - Python调用:
import execjs
# 加载JS加密代码
with open('encrypt.js', 'r', encoding='utf-8') as f:
jstext = f.read()
ctx = execjs.compile(jstext)
# 批量加密密码
passwords = ['123456', 'password', 'admin123']
for pwd in passwords:
encrypted = ctx.call('encryptedPassword', pwd)
print(f"原始密码: {pwd} -> 加密后: {encrypted}")
5. 关键注意事项
- 环境差异:Node.js与浏览器环境可能有差异,需要适当调整JS代码
- 加密前处理:注意密码反转等预处理操作
- 密钥获取:案例中密钥从返回包中获取,实际场景可能需要动态获取
- 调试验证:确保Python生成的密文与浏览器一致
6. 完整流程总结
- 发现加密现象 → 2. 定位加密函数 → 3. 分析加密逻辑 → 4. 提取关键代码 → 5. 验证加密结果 → 6. 实现批量加密
7. 扩展思考
- 如何应对动态密钥的情况?
- 如何处理更复杂的加密算法(如AES、自定义加密)?
- 如何自动化整个逆向过程?
通过这个案例,我们掌握了前端JS加密逆向的基本方法和工具使用,可以应对类似的前端加密场景。