JS逆向之某平台登录密码加密

JS逆向

分析登录的流量包,发现前端传入的txt_pwd被置空,真正传入密码的参数并不是txt_pwd:

image-20260614145052889

image-20260614144628198

点击F12进入了无限debugger

image-20260614145741047

这段代码会使反复执行debugger语句,进入断点调试模式,从而干扰正常的调试流程。

解决方法:

在此行打断点出,右击。选中“一律不在此暂停”

image-20260614150241486

全局搜索txt_pwd,定位JS文件:

image-20260614150630704

txt_pwd出现三处:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function CheckPwd() {
var lmode = $('input[name="rbDl"][checked]').val();
if (lmode == undefined) {
lmode = '0';
}
if ($('#txt_pwd').val().length == 0) {
var amsg = '';
//当lmode为0————账户密码登录模式时,检查账户密码是否为空
if (lmode == '0') {
amsg = en == 'en' ? 'The password is empty.' : '未输入密码';
}
else {
amsg = en == 'en' ? 'The name is empty.' : '未输入姓名'
}
alert(amsg);
return false;
}
//对密码进行RSA加密
//pbk是 RSA 公钥的模数。从服务端下发到页面
if ($('#pbk').length > 0 && lmode=='0'){
pbKey = $('#pbk').val();
ts = $('#ts').val();

if (pbKey.length > 0) {
try {
var rsa = new RSAKey();
#设置 RSA 公钥
#“10001"为公钥指数
rsa.setPublic(pbKey, '10001');
//txt_pwd拼接了一个ts后进行了rsa加密

var res = rsa.encrypt($('#txt_pwd').val() + ts);
if (res) {
//txt_pwd被置空
$('#txt_pwd').val('')
//密码传递给了p1
$('#p1').val(hex2b64(res));
}
}
finally { return true;}
}
}
}

image-20260614151807353

页面上并没有name为rbD1的标签,则lmode=0

通常表示:

含义
0 普通账号密码登录
1 手机验证码登录
2 统一身份认证
3 企业微信登录

image-20260614170420249

原本想要验证自己的js脚本是否正确,但是同一个密码,每次跑出的密文都不同

询问chatgpt:

“这是 RSA PKCS#1 v1.5 填充 的正常现象”

RSA PKCS#1 v1.5 填充(Padding)是一种在 RSA 加密前对明文进行格式化的方法,其主要目的是防止 RSA 的确定性加密带来的安全问题。

代码段:

image-20260614170958397

image-20260614170929134

分析加密调用的函数,很多,函数都在LoginSafe.js里面

image-20260614162330037

直接复制编写js脚本,使用burpcrypto插件实现参数加密:

image-20260614163012978

保存processor

在intruder模块添加payload proccessing

image-20260614163239865

image-20260614163407512

验证码识别

在爆破过程中,遇到了验证码识别问题

解决:

captcha-killer-modified插件

捕捉验证码请求接口发送插件中

image-20260614164320986

使用python3 codereg.py开启验证码识别模块,前提安装ddddocr

image-20260614164853163

在接口URL怕,右击选择模板库image-20260614165107573

点击获取–>识别,检查验证码是否识别正确.

然后点击是否使用插件

在intruder模块进行配置

image-20260614165442868

Payload类型选择:通过扩展生成,生成器选择captcha-kill-modified

必须使用单线程

image-20260614165706397

RSA加密

RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,使用一对密钥:

  • 公钥(Public Key):用于加密,可以公开。
  • 私钥(Private Key):用于解密,必须保密。
对称加密 RSA非对称加密
加密解密使用同一密钥 加密解密使用不同密钥
AES、DES、SM4 RSA、ECC
速度快 速度较慢
适合大量数据 适合密钥交换、登录认证

RSA数学原理

1. 生成密钥

第一步:选择两个不相等的质数p和q

1
2
p = 61
q = 53

第二步:计算p和q的乘积n(公钥的模数)

1
2
n = p × q
n = 3233

第三步:计算n的欧拉函数φ(n)

1
φ(n)=(p−1)(q−1)

第四步:随机选择一个公钥指数e,条件是1< e < φ(n),且e与φ(n) 互质。

1
e=17

第五步:计算私钥d

满足:使得e*d被φ(n)除的余数为1

1
2
e*d ≡ 1 (mod φ(n))
d = 2753
加解密

假设明文为m=123,密位为c

加密

公钥:(n,e)

image-20260614160029298

解密

私钥:(n,d)

image-20260614160119996

Previous postJWT 攻击Next postXSS-Labs靶场通关