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

0x00 项目背景

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

该系列首发github:https://github.com/J0o1ey/BountyHunterInChina
本项目由M78sec维护,未经授权,文章严禁私自修改版权转载。

0x01 前言

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

0x02 背景

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

0x03 初步测试

手机装好https证书,挂好Burpsuite的代理,随后我们直接去抓取该APP上传校园跑步数据时的请求在这里插入图片描述

请求如下
在这里插入图片描述

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

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

0x04 何为Sign签名校验?

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

0x05 sign值的安全对抗方法

针对有sign签名值的数据包,本人常用的测试手法有两个:
1.检测sign值是否为弱凭据
2.检测sign值是否可以置空

第一种类型通常有两种情况
①看sign值是否采用了一些弱加密/编码方法(例如base64),我们解码后可以直接看到sign的原始数据。
②测试sign值是否为时间戳/随机数加密后的密文值,在一些实战情况中,很多厂商安全开发意识不足,会将sign值的算法直接暴露在前端未加密的js中,或者直接将用户进行某操作的时间戳进行md5加密后作为sign凭据,导致sign凭据在一段时间内可以通过遍历时间戳进行猜解

第二种类型就比较好理解,我们直接将sign参数以及值删掉,看后端程序是否可以不校验sign直接执行我们传输的数据

上述概念可能看起来比较抽象,下面我们继续来看本案例

0x06 二次测试

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

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

随后我们尝试第二种方法,置空sign值
在这里插入图片描述

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

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

拿到程序apk直接查壳,运气不错,apk没加壳,省了不少功夫
在这里插入图片描述

直接将apk文件拖到jadx中,对其进行逆向分析
在这里插入图片描述

全局搜素sign,在仔细挨个查看后,成功定位到了其sign生成的关键算法代码过长,关键部分代码如下
在这里插入图片描述

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

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

在这里插入图片描述

0x09 Nodejs编写计算sign的Exploit

sign的算法已经有了,未知的键值对我们也拿到了,下面就是直接编写计算sign的exploit的时刻啦~ 我们选择用nodejs来还原整个sign的加密算法(注意,我们将formatSportRange跑步距离改为了5.003)
在这里插入图片描述

在这里插入图片描述

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

0x10测试

我们将原来的formatSportRange跑步距离改为了从0.000修改为5.003,并使用程序生成的sign值
在这里插入图片描述

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

nice!

在这里插入图片描述

0x11 后言

遇到可能的漏洞点莫要轻言放弃,再坚持一下,曙光就在前方~
大家如果对“重生之我是赏金猎人”专栏感兴趣,欢迎大家多多关注奇安信攻防社区以及vx公众号-M78 安全团队

在这里插入图片描述
本文作者: J0o1ey

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值