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

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

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

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

  2. Android逆向-APP破解练习(一)

    0x00 前言 0x01 环境 练习APP 使用工具 0x02 积累学习 破解点 破解积累 0x00 前言 为了可以更好的提高自己的逆向水平,所以决定记录一下每天破解的APP以及破解思路. 0x01 ...

  3. 重生之我是赏金猎人-番外篇-记一次层层突破的攻防演练

    0x00 前言 本文简单记述了一下本人在某攻防演练过程中一次层层突破的有趣经历 技术性一般,但是层层突破属实艰难,并用到了比较多的思路,还望各位大佬多多指教 0x01 SSO账号获取 由于目标是某大学 ...

  4. 重生之我是赏金猎人-漏洞挖掘(十一)-某SRC储存XSS多次BypassWAF挖掘

    0x01:利用编辑器的超链接组件导致存储XSS 作者:画风@m78sec https://github.com/J0o1ey/BountyHunterInChina 欢迎大家点个star 鄙人太菜了, ...

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

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

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

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

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

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

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

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

  9. 重生之我是赏金猎人(三)-无脑挖掘某SRC getshell

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

最新文章

  1. [31期] 第一个项目结束之际--俺很高调但很真诚地感谢一个人--涛爷
  2. 安装Ubuntu18.04遇到的问题
  3. new arraylist内存_如何避免内部类中的内存泄漏
  4. SEO之网站内链优化策略
  5. D-News|英特尔首推融合现实,亚马逊云服务市场占比超3成
  6. linux中波浪线是根目录吗,linux 波浪线 ~ 使用方法
  7. 1053 Path of Equal Weight (30 分)一般树的遍历 DFS+vector容器+sort排序
  8. Tyvj - 1305 单调队列优化dp
  9. MySQL入门教程:SQL语言入门
  10. Andorid-ViewPage2 左右滑动
  11. C语言四种swap函数
  12. 微软招 HR 了!看来是招聘需求太旺盛,忙不过来了
  13. ipa在线安装搭建_在线安装IPA 文件和视频下载
  14. linux服务器cpu/负载占用率100%怎么办?
  15. 5s的app显示无法连接服务器,苹果手机无法连接到app store怎么办
  16. 从LeNet-5 CNN模型入门PyTorch
  17. ImageLoader(UIL)自定义HTTP Header信息
  18. 什么品牌的蓝牙耳机音质好?四款高音质蓝牙耳机推荐
  19. [内附完整源码和文档] 基于ThinkPhp框架的高校图书馆藏书借阅系统
  20. 社招转行进腾讯了(自学经验 + 面试心得)

热门文章

  1. 抖音运营技巧分享(全程干货无废话)
  2. php 验证码文件,php生成验证码文件的方法
  3. 计算机网络原理历年试题,自考计算机网络原理第一章历年试题汇总
  4. 雪落时,为什么每一片雪花都不一样?
  5. 机器学习一般用来解决哪些方面的问题?
  6. office2016 资源
  7. 简单介绍Python 中的迭代器和生成器
  8. Thread 模拟营业大厅叫号程序
  9. Android应用资源文件替换方法
  10. 计算机趣味知识竞赛题库,2019年趣味知识竞赛试题题库及答案