渗透测试JS前端加密浅谈
字数 1043 2025-08-07 08:22:15
渗透测试中JS前端加密分析与利用方法
0x00 前言
在渗透测试过程中,经常会遇到登录页面密码字段被前端加密传输的情况。本文详细分析几种常见的前端加密场景,并提供具体的利用方法,包括如何定位加密函数、构造加密脚本以及生成密文字典进行爆破。
0x01 案例一:通达OA RSA加密分析
1.1 加密现象分析
- 抓包发现密码字段为长字符串密文
- 明文"123456"被加密为325aa8b667...的长字符串
1.2 定位加密函数
- 使用浏览器开发者工具(F12)
- 全局搜索关键词"PASSWORD"
- 在(index)文件中发现
rsa.encrypt()函数
1.3 调试分析
- 在获取表单PASSWORD语句和加密函数调用处设置断点
- 输入测试密码触发断点
- 观察明文密码变量(psw)和加密过程
1.4 构造加密脚本(Python)
import rsa
# 构造公钥
def rsa_ne_key(modulus, exponent):
rsaModulus = int(modulus, 16)
rsaExponent = int(exponent, 16)
return rsa.PublicKey(rsaModulus, rsaExponent)
# RSA加密函数
def rsa_encrypt(text, public_key):
cipher_text = rsa.encrypt(text, public_key)
return cipher_text.hex()
# 使用示例
if __name__ == '__main__':
exponent = "10001" # 公钥指数
modulus = "B87A3BE2184FED0973FFB0B02A862DCAD15A1A29172EC8FF67E841FE26749A6AA04E48E9B02D963ED81DCE2B0086C034F7D47CCBACF8539C36B9445ABA5EF484F3CA32593762641B4C9683C79801D087198370D5719BB4E422FADAA4D883D13874DE67D8B6E883EBAACC53A8480F41EE8BE70D2F70BECF3CB7F1023D2C901CC3" # 模数
key = rsa_ne_key(modulus, exponent)
result = rsa_encrypt("Admin123456".encode(), key)
print(result)
1.5 利用方法
- 修改脚本读取明文字典文件
- 批量生成密文字典
- 在BurpSuite中使用密文字典进行爆破
0x02 案例二:常见登录加密分析
2.1 加密现象
- 密码字段loginPwd被加密
- 明文"123456"被加密为特定格式密文
2.2 定位加密点
- 全局搜索"loginPwd"
- 在JS文件中找到加密赋值语句
- 发现通过
Object(v.a)函数进行加密
2.3 控制台验证
// 在浏览器控制台测试加密函数
Object(v.a)("123456")
// 输出结果应与抓包密文一致
0x03 案例三:RSA公钥直接暴露
3.1 加密现象
- JS文件中直接暴露RSA公钥
- 使用标准RSA加密算法
3.2 Python加密脚本
import rsa
import base64
public_key = b'''
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD
2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==
-----END PUBLIC KEY-----
'''
def rsa_encrypt(text):
rsa_key = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
info = rsa.encrypt(text, rsa_key)
return base64.b64encode(info)
result = rsa_encrypt("admin888".encode())
print(result)
0x04 通用分析方法总结
- 抓包分析:确认密码字段是否被加密
- 定位加密点:
- 全局搜索关键词(PASSWORD/loginPwd等)
- 搜索加密相关关键词(encrypt/crypto等)
- 调试分析:
- 在关键位置设置断点
- 跟踪明文到密文的转换过程
- 验证加密:
- 在控制台测试加密函数
- 确保输出与抓包密文一致
- 构造脚本:
- 提取加密参数(模数、指数、公钥等)
- 编写加密函数
- 生成字典:
- 批量加密明文字典
- 准备用于爆破的密文字典
0x05 注意事项
-
加密方式可能包括:
- RSA非对称加密
- AES对称加密
- 自定义加密算法
- Base64编码(非加密但常见)
-
调试技巧:
- 所有密码相关赋值语句都设置断点
- 关注网络请求发起前的最后加密步骤
- 注意加密前的可能存在的编码处理(如UTF-8)
-
常见加密库:
- CryptoJS
- forge
- jsencrypt
- 自定义实现
通过系统性地分析前端加密逻辑,可以有效地绕过加密限制,进行后续的渗透测试工作。