0x00前言

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

本人在一些漏洞挖掘实战中经常发现在破解sign值后,在测试各类越权,重放等漏洞时一马平川

今天特此为大家带来这样一个精彩的实战案例。

0x01 背景

学校每学期的体育成绩中会有10%来源于某跑步APP的打卡数据,本人作为一个体测只能勉强及格的废物,自然得想办法拿到这10分,以防挂科

无奈这个app后台设置的是每学期男生总共要求跑120公里才能完整地拿到10分,非常恶心。

一学期跑120公里,你还不如鲨了我,于是便有了此文对于其app的crack

0x02 初步测试

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

请求如下

我们发现单次跑步距离对应的POST参数为FormatSportRange,自然二话不说对其进行修改,将0.000修改为5.000

此时悲剧发生了,直接提示认证失败~

定神细看,发现POST数据末尾有sign签名…

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

0x03 何为Sign签名校验?

Sign签名校验法本质上是对客户端传输数据合法性的一种校验手段

其常用手法为,在用户客户端传输的数据中额外加上时间戳以及特殊字符,随后一起得出整体数据的加密值(常用MD5,SHA1等加密算法)

这就导致了用户在不知晓程序的原始数据生成sign值的方法情况下,若对传输到服务端的数据进行篡改,在后端都会鉴权失败,导致用户篡改后的数据无效。

0x04 sign值的安全对抗方法

针对有sign签名值的数据包,本人常用的测试手法有两个:

1.检测sign值是否为弱凭据

2.检测sign值是否可以置空

第一种类型通常有两种情况

①看sign值是否采用了一些弱加密/编码方法(例如base64),我们解码后可以直接看到sign的原始数据。

②测试sign值是否为时间戳/随机数加密后的密文值,在一些实战情况中,很多厂商安全开发意识不足,会将sign值的算法直接暴露在前端未加密的js中,或者直接将用户进行某操作的时间戳进行md5加密后作为sign凭据,导致sign凭据在一段时间内可以通过遍历时间戳进行猜解

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

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

0x05 二次测试

我们先尝试第一种方法,上方添加跑步记录获取到的sign值为5ded7f11f080fb5a9d403c9d0963ebaa

拿眼一看,大概率sign值是使用md5加密的,我们随后对其进行解密

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

随后我们尝试第二种方法,置空sign值

发现依然鉴权认证失败,gg了。

看样两种常规的对抗sign的方法已经废了,我们只能从app下手了,逆向尝试去寻找其sign的算法

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

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

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

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

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

可以看到,其sign值的签名算法为

创建一个链表, 将全部已有的参数加入进去, 然后再加上一些键值对(其中timestamp时间戳我们已知,appID,appSecret两个键值对我们均未知)

之后再将全部的键值对根据键的字母顺序进行排序, 之后使用 querystring 方式对键值对进行编码.

最后再对编码后的字符串求 MD5 值, 就是最终的签名了, 麻烦的一比

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

0x08 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值

0x09 测试

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

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

返回app查看~

nice!

0x10 后言

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

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

  1. 重生之我是赏金猎人-SRC漏洞挖掘(五)-轻松GET某src soap注入

    0x01 挖掘 在对某SRC测试时,本人根据其证书信息收集到了部分深度子域,并找到了其对应的业务IP段 写了个shell脚本+ffuf批量fuzz某src c段资产目录 发现了xxSRC c段的一个提 ...

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

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

  3. 重生之我是赏金猎人-SRC漏洞挖掘(一)-某SRC测试系统无脑Getshell

    0x01 前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎大佬们点个star 0x02 资产收集到脆弱系统 在某src挖掘过程中,本人通过ssl证 ...

  4. 重生之我是赏金猎人-SRC漏洞挖掘(十三)-攻防对抗/梦中绝杀X脖代理商

    0x00 前言 前两天在国企实验室的朋友遇到了一个棘手的目标,听说之前没人能打点进去,只能靠xxxxx取证 我一听来了兴趣,在梦中臆造了一个靶场进行渗透,并且已获得相关授权 还请各位看官请勿对号入座, ...

  5. 绝对干货!src漏洞挖掘经验分享

    公粽号:黒掌 一个专注于分享渗透测试.黑客圈热点.黑客工具技术区博主! src漏洞挖掘经验分享 – 掌控安全以恒 一.公益src 公益src是一个白帽子提交随机发现的漏洞的品台,我们可以把我们随机发现 ...

  6. 重生之我是赏金猎人(九)-从本无法触发的xss到梦幻联动挖掘多个致命接口下的XSS触发点

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

  7. 干货|SRC漏洞挖掘经验

    先谈个人经历,我虽然很早前就像挖掘SRC来锻炼自己,但真正实现起来大概也是2月初的时候.一开始在几大SRC平台,如顺丰SRC,小米SRC等装了两下,真的不知道从何入手.而且,SRC提交这事从来都是前人 ...

  8. SRC漏洞挖掘之偏门资产收集篇

    写这篇文章的目得,就是跟大家分享一下平时我挖src漏洞的一些经验,当自己挖到某个站点的漏洞时,往往就会欣喜若狂的往src平台上提交,得到的结果却是 "漏洞已重复,感谢提交" ,其实 ...

  9. SRC漏洞挖掘--CNVD国家信息安全漏洞共享平台

    目录 0x00 简介 0x01 过程中使用的工具 0x02 详细过程 一.  寻找挖洞目标 1.1 工具介绍 1.2 目标检索过程 二. 趁手的挖洞工具 2.1 工具介绍 2.2 工具下载链接 2.3 ...

最新文章

  1. 【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘
  2. iterator and iterable
  3. 包r语言_R语言交互式可视化包CanvasXpress
  4. proxy_pool开源项目攻克学习
  5. 寿险的精算现值(EPV)
  6. 考试全程指导读书笔记1 -Chap1 信息系统基础
  7. python深度复制_Python直接赋值、浅拷贝和深度拷贝解析
  8. id nfc模拟_模拟门禁卡: NFC卡模拟 v3.1.5 清爽版
  9. SVN汉化包安装后无效果(已解决)
  10. gephi java教程_gephi生成图(java版)
  11. python蓝屏代码_死机、卡顿、蓝屏,Python部门的老江湖告诉我的一些超级变态代码...
  12. PyCharm小技巧分享—主菜单消失再显示
  13. pentaho server 9.2 配置mysql数据源
  14. 一次追踪h5游戏中google广告的经历
  15. python计算三角形面积_利用python计算三角形的面积
  16. 获取综合教务系统(URP)的数据包
  17. SecureCRT标签显示IP地址
  18. Java【有哪些适合新手练手的Java项目?】
  19. No connection could be made because the target machine actively refused it [::1]:808
  20. Java项目:基于jsp+mysql+Spring+mybatis的SSM业务代办帮跑腿管理系统

热门文章

  1. Kali密码攻击之——离线攻击工具
  2. 二说 拷贝构造函数 拷贝赋值函数
  3. 1.4 浅层神经网络
  4. 安徽农商行计算机类考点,考生必看!安徽农商行笔试考点分析!
  5. 技嘉 H310M S2 i3-8100电脑 Hackintosh 黑苹果efi引导文件
  6. 平淡生活:喜羊羊和灰太郎获奖了
  7. W ndows10如何清理使用痕迹,Win10 C盘突然爆满,怎么清理?史上较全的C盘清理方案,推荐收藏...
  8. 【集美大学1411_助教博客】2017软件工程开跑啦。。。。
  9. WebP格式介绍(附python版本代码用于对图像进行WebP编码和解码)
  10. 【CSDN下载】第七期:微信小程序跳一跳游戏破解源码、Modbus TCP和TCP通信测试