指点天下登录策略分析

应朋友请求,就指点天下为例写一篇逆向帖。这个帖子只针对登录策略,后续看情况出自动化教程。
看网上很多帖子都过时了,这里从头开始,分两个登录端介绍指点天下的登录及身份验证策略。

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加密策略如下:
图源https://cloud.tencent.com/developer/article/1873735

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完成所需操作


参考文献

1. python实现指点天下每日健康打卡
2. 疫情无小事,防控靠大家
3. 指点天下自动打卡及相关分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值