背景
受人之托,分析了一下i至诚app(是由树维公司出的一款套壳app)的打卡流程,并实现了自动化,app版本是v1.1.2,记录一下
开始
app下载地址
http://www.fdzcxy.edu.cn/ueditor/asp/upload/file/20200305/zcxy_v1_1_2.apk
抓包
我使用的工具是fiddler
,这个app
本质上是一个weex
构建的基于vue
的套壳app
项目,登陆时使用的是okhttp框架 并有一定程度的证书校验
,因此抓包时用老办法(hook okhttp
)绕过一下,然后局域网下设置好代理之后,就可以抓包了,过程不再赘述
报文分析
登陆
i至诚使用的是jwt token
认证
请求报文如下
1 | POST https://superapp.fdzcxy.edu.cn/auth-server/jwt/token/login?username=用户名&password=密码 HTTP/1.1 |
响应报文如下,登陆成功会返回jwt token
,失败会直接403
1 | HTTP/1.1 200 |
这里简单介绍一下jwt
(是一种基于token
的鉴权机制),jwt token
通常由三部分构成,格式是这样的:header.payload.signature
所以上面的响应可以直接解析为:
header:声明类型和加密的算法
1 | {"alg":"RS512"} |
payload:存放有效信息
1 | { |
signature:可以理解为签名
1 | 是一串RSA私钥加密之后的密文,由于泄露个人信息,已打码处理 |
分析登陆时其实可以不用抓包处理,因为树维公司其实提供了文档,链接:https://superapp.fdzcxy.edu.cn/auth-server/doc/index#%E7%99%BB%E5%BD%95
然后文档中还顺带把公钥给我们了,基于此,顺带写了一个验签工具,并把之前抓包的jwt token
解密出来了
该工具需要的maven依赖
1 | <dependency> |
工具源代码
1 |
|
解密出来的明文如下:其实就是把payload加密了一下
1 | {sub=学号, ROLES=ROLE_ADMIN,administrator,user, created=1626696055932, exp=1629288055} |
每日健康上报
在i至诚app中,除了登陆,几乎其他所有的功能都是用webview
加载的vue
项目,每日健康上报功能也是这样,而在这些应用中,几乎都没有证书验证,因此可以直接抓包,或者在浏览器中访问,所以这里最简单的方式,当然是无脑的使用自动化测试框架啦(虽然慢是慢点,因为浏览器渲染是一个比较耗时的操作),我并没有采用这种方式,我选择的是直接分析整个流程,然后模拟提交,不依赖浏览器的渲染
大体上有这么几个过程:请求每日健康上报
-> 重定向并获取sessionID
-> 激活sessionid
-> 获取打卡信息,jsConfId和callbackConfId
-> 提交打卡信息
自动化
经过上面的分析,最终的成品如下:
1 | # -*- coding: utf-8 -*- |
依赖
1 | certifi==2021.5.30 |
挂云函数配置触发器定时执行或者放云服务器设置定时执行就好了
配置触发器参考文档:https://cloud.tencent.com/document/product/583/9708
其他,比如打卡成功后发封邮件提示之类的,就自己发挥了(我懒