指点天下登录策略分析
应朋友请求,就指点天下为例写一篇逆向帖。这个帖子只针对登录策略,后续看情况出自动化教程。
看网上很多帖子都过时了,这里从头开始,分两个登录端介绍指点天下的登录及身份验证策略。
1.1 身份识别机制——JWT
JWT(JSON Web Token)是一种用于在网络应用环境中安全地传递声明信息的开放标准,常被用于身份验证和授权机制中,尤其在前后端分离的项目和分布式系统。后续我们会发现,指点天下采用的正是这种策略。

1.2 web前端登录
如上图所示,先打开F12开发者模式中的网络(network)窗口,然后通过校园网或者学校webvpn登录指点天下,点击智慧学工等按钮后会显示认证请求。我们在预览和响应中可以看到axy-tokenaxy-token字段,这个即为身份识别token。
注:每次退出登录或者时间太长超时后都会导致token失效
实现代码如下:
"""
网页端登录,需要vpn内网
"""
import requests
phone_number = 'xxxxxxxxxxx' # 手机号
md5_date= 'axy_' + '密码' # 密码
password = hashlib.md5(md5_date.encode('utf-8')).hexdigest()
# jwt_token = 'eyJhbGciOiJIxxxx.xxxxxxxxxxxx' # jwt
host = 'http://xxx.xxx.xxx/'
search_url = host + 'applets/signin/record?page=0&size=20'
search_headers = {
'Host': host,
'Connection': 'keep-alive',
'Accept': 'gzip',
'axy-phone': phone_number,
'axy-token': jwt_token,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0' # 自己浏览器的的user-agent
}
# search_response = requests.get(search_url, headers=search_headers)
# print(search_response.text)
login_url = host + '/admin/login'
login_headers = {
'Host': host,
'Connection': 'keep-alive',
'Content-Length': '78',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'Origin': host,
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Referer': host + 'admin/login',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
}
login_data = {
'username': phone_number,
'password': password ,
'site': 'xxx', # 学校缩写
'type': '2',
}
login_response = requests.post(login_url, data=login_data, headers=login_headers, allow_redirects=False)
# login_response = requests.post(login_url, data=login_data, headers=login_headers)
print(login_response.headers)
print(login_response.text)
print(login_response.cookies)
print(login_response.cookies.values()[0]) # 获取JSESSIONID值
print('***************************************************')
其中password加密策略如下:

1.3app端登录
这个方法不推荐,需要参数很多且限制设备。这里可以使用fidder或者wireshark抓包,先获取以下参数:
phone = 'xxxxxxxxx=='
mobileSystem = '9'
mobileVersion = 'xxxxx'
appVersion = '1.9.4'
deviceToken = 'xxxxxxxxxxxxxxx'
phone_number = '手机号'
password = "加密后的密码" # 加密策略可参考网页端登录
获取jwt:
"""
app登录
"""
import requests
session = requests.Session()
phone = 'your phone'
mobileSystem = 'your System version'
mobileVersion = 'your mobile'
appVersion = '1.9.4' # app version
deviceToken = 'your device'
phone_number = 'your number'
password = "password"
host = 'http://xxx.xxx.xxx/'
test_url = host + f'api/Login/check-device?phone={phone}&deviceToken={deviceToken}'
app_url = host + 'api/Login/pwd'
test_headers = {
'axy-app-version': appVersion,
'Host': host ,
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'User-Agent': 'okhttp/3.10.0',
}
app_headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'axy-app-version': appVersion,
# 'Content-Type': 'application/json;charset=UTF-8',
'Content-Length': '196',
'Host': host ,
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'User-Agent': 'okhttp/3.10.0',
}
app_data = {
'phone': phone,
'mobileSystem': mobileSystem,
'appVersion': appVersion,
'mobileVersion': mobileVersion,
'deviceToken': deviceToken,
'pushToken': phone_number,
'romInfo': 'your phone brand',
'password': password,
}
# login
app_response = requests.post(app_url, headers=app_headers, data=app_data, allow_redirects=False)
json_data = app_response.json()
token = json_data.get("data")
print(token)
至此已成功获取身份识别码(jwt),后续可利用jwt完成所需操作

383

被折叠的 条评论
为什么被折叠?



