什么是sign值?
可以理解为检验,每一个数据包中有sign值就意味着可以被检验,当我们一旦篡改数据,校验值不正确,则会失败。
0X01 体测APP
(资料图)
界面功能点如图:
手机装好https证书,挂好Burpsuite的代理,随后我们直接去抓取该APP上传校园跑步数据时的请求
将跑步距离0.000 修改为5.000时,直接提示认证失败,原因就是sign值的问题。
0X02 逆向破解Sign值的加密
首先判断sign是否有漏洞,看sign值是否采用了一些弱加密/编码方法(例如md5)
上一方法失败,随后我们尝试第二种方法,置空sign值,发现依然鉴权认证失败
0X03 逆向破解app
先查壳,运气不错,apk没加壳,省了不少功夫
全局搜素sign,在仔细挨个查看后,成功定位到了其sign生成的关键算法
其sign值的签名算法:创建一个链表, 将全部已有的参数加入进去, 然后再加上一些键值对(其中timestamp时间戳我们已知,
appID,appSecret两个键值对我们均未知),之后再将全部的键值对根据键的字母顺序进行排序, 之后使用 querystring 方式对键值对进行编码,最后再对编码后的字符串求 MD5 值
分析代码发现,appID获取:,如果请求的url是 https://m.xxxxx.com 则为move,否则调用getAppId方法,获取某接口openId的参数值,随后赋值给AppID。
appSceret获取:在jadx中提示appSecre键t对应的值来源于g.b,我们在import的包中成功找到了g.b(即appSecret)
现确定了所有参数的键值对,只需要写个脚本写出sign值即可
将原来的formatSportRange跑步距离改为了从0.000修改为5.003,并使用程序生成的sign值
大功告成,跑步记录保存成功,我们成功使用伪造的sign签名增加了一条5.003 km的跑步记录