记某次常规js前端逆向
字数 962 2025-08-24 16:48:15

JS前端逆向实战教学:RSA加密密码的逆向分析与批量生成

1. 前言

在渗透测试或安全研究中,经常会遇到前端加密的情况,特别是密码字段的加密。本文将通过一个实际案例,详细讲解如何逆向分析前端JS加密逻辑,并使用Python实现批量加密。

2. 加密发现与初步分析

2.1 发现加密现象

在登录抓包时发现密码被加密,表现为:

  • 原始密码:123456
  • 加密后:a1b2c3...(长字符串)

2.2 定位加密点

  1. F12开发者工具:打开浏览器开发者工具
  2. 全文搜索:在Sources面板中全局搜索password字段
  3. 找到加密点:发现encryptedPassword函数

3. 深入逆向分析

3.1 设置断点调试

  1. 在加密函数的关键行设置断点(案例中为194行和203行)
  2. 重新触发登录操作,观察断点处的变量值

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实现

  1. 在开发者工具中搜索RSAUtils
  2. 找到相关JS代码并复制出来
  3. 注意需要去除$w})(window);等浏览器环境相关代码

4. Python实现批量加密

4.1 使用PyExecJS

安装:

pip install pyexecjs

4.2 示例代码结构

  1. JS文件(s.js):
function f(x,y) {
    return x+y
}
  1. 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 实际加密实现

  1. RSAUtils代码和encryptedPassword函数整合到一个JS文件中
  2. 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. 关键注意事项

  1. 环境差异:Node.js与浏览器环境可能有差异,需要适当调整JS代码
  2. 加密前处理:注意密码反转等预处理操作
  3. 密钥获取:案例中密钥从返回包中获取,实际场景可能需要动态获取
  4. 调试验证:确保Python生成的密文与浏览器一致

6. 完整流程总结

  1. 发现加密现象 → 2. 定位加密函数 → 3. 分析加密逻辑 → 4. 提取关键代码 → 5. 验证加密结果 → 6. 实现批量加密

7. 扩展思考

  • 如何应对动态密钥的情况?
  • 如何处理更复杂的加密算法(如AES、自定义加密)?
  • 如何自动化整个逆向过程?

通过这个案例,我们掌握了前端JS加密逆向的基本方法和工具使用,可以应对类似的前端加密场景。

JS前端逆向实战教学:RSA加密密码的逆向分析与批量生成 1. 前言 在渗透测试或安全研究中,经常会遇到前端加密的情况,特别是密码字段的加密。本文将通过一个实际案例,详细讲解如何逆向分析前端JS加密逻辑,并使用Python实现批量加密。 2. 加密发现与初步分析 2.1 发现加密现象 在登录抓包时发现密码被加密,表现为: 原始密码: 123456 加密后: a1b2c3... (长字符串) 2.2 定位加密点 F12开发者工具 :打开浏览器开发者工具 全文搜索 :在Sources面板中全局搜索 password 字段 找到加密点 :发现 encryptedPassword 函数 3. 深入逆向分析 3.1 设置断点调试 在加密函数的关键行设置断点(案例中为194行和203行) 重新触发登录操作,观察断点处的变量值 3.2 分析加密函数 关键点: 使用RSA非对称加密 公钥由两部分组成: 10001 (指数)和长字符串(模数) 密码在加密前进行了反转操作 3.3 查找RSAUtils实现 在开发者工具中搜索 RSAUtils 找到相关JS代码并复制出来 注意需要去除 $w 和 })(window); 等浏览器环境相关代码 4. Python实现批量加密 4.1 使用PyExecJS 安装: 4.2 示例代码结构 JS文件 (s.js): Python调用 : 4.3 实际加密实现 将 RSAUtils 代码和 encryptedPassword 函数整合到一个JS文件中 Python调用: 5. 关键注意事项 环境差异 :Node.js与浏览器环境可能有差异,需要适当调整JS代码 加密前处理 :注意密码反转等预处理操作 密钥获取 :案例中密钥从返回包中获取,实际场景可能需要动态获取 调试验证 :确保Python生成的密文与浏览器一致 6. 完整流程总结 发现加密现象 → 2. 定位加密函数 → 3. 分析加密逻辑 → 4. 提取关键代码 → 5. 验证加密结果 → 6. 实现批量加密 7. 扩展思考 如何应对动态密钥的情况? 如何处理更复杂的加密算法(如AES、自定义加密)? 如何自动化整个逆向过程? 通过这个案例,我们掌握了前端JS加密逆向的基本方法和工具使用,可以应对类似的前端加密场景。