在移动互联的时代,手机端业务越来越多,最普遍的就是微信小程序。最近项目测试的时候发现现在的程序员的安全意识越来越好,很多业务都采用了签名来校验数据包,这样,如果不知道sign算法的话对于安全测试人员来说就无法修改数据,也就无法得知漏洞是否存在了。
本次以一个微信小游戏为例,第一次尝试,发现后面水很深,要学的好多,先学习个简单的,走个流程先。
微信小游戏:消灭病毒
0x01 抓包
打开游戏->抓包
手机抓包就不再详细说了,如果抓不到数据包,网上搜下方法。
按照常规操作,修改个数据,发现返回错误代码
|
|
还原原始数据,发现正常返回
|
|
后续试了下,发现不论哪个字段,只要数据包被篡改就返回错误。
看到最后的sign字段,然后也没有session、cookie等身份校验的字段,基本上就是因为sign校验不通过导致的。
所以,只要知道了sign算法,应该就可以直接篡改数据了
0x02 获取wxapkg文件
使用模拟器(ROOT)打开微信,搜索小程序。
可能会有打不开、闪退的情况,但是不要紧,因为资源已经被下载下来了。
之前不知道,一直没办法获取源码,后来网上搜到个神器,使用“RE管理器”可以读取到对应的文件目录。
安装完之后,打开小程序,然后在“RE管理器”里面打开目录:/data/data/com.tencent.mm/MicroMsg/
这一大串随机字符串就是微信目录了,打开目录:/appbrand/pkg
这里面就是我们安装的小程序的源码包
0x03 反编译wxapkg获取源文件
Github上已经有大神写的node.js版本的,当然也有其它版本的,例如python版本,不用管什么版本的,能用就行了。
GitHub地址:
进入到下载好的反编译脚本目录下,在node命令窗口中依次安装需要的依赖。
项目中列出来的需要安装的依赖不全,如果报错,看下issues就行了,下面是在我能运行状态下安装的依赖。
|
|
然后运行运行脚本
|
|
这样就成功获取到该小程序的源代码了
0x04 源码分析
因为开始我们已经知道上传的接口是:api/archive/upload
一个文件中都有四5万行代码,一行一行分析的话,太浪费时间了(主要是我也看不懂,2333…)
所以,我是根据特征直接在源码中搜的
定位到具体位置
可以看到数据包都经过了sign处理
然后搜索关键字:sign
可以看到t中包含的所有的字段属性和我们抓包时候的一样,基本上可以确认就是这个了。同时,在传输数据的时候,将wx_appid、wx_secret删除了
搜索关键字:zn,定位具体函数
可以看到就是使用了md5进行了加密。
0x05 脚本编写
根据源码看到,sign是将post的所有字段和wx_appid、wx_secret一起进行了md5加密,这样,sign的算法已经知道了。
但是,死活没有在源码中找到两个变量,网上搜索,发现新版本是动态加载的,然后我在“微信开发者工具”中导入源码之后一直卡在85%,没办法运行,也就导致没办法动态调试获取到wx_appid、wx_secret的变量值了。
随后网上搜了下这个游戏的破解文章,发现早期版本的代码中是直接硬编码这两个变量的,后面试了下,没想到还能用。
这样就全部都有了,写个脚本,根据修改后的数据生成对应的sign即可。
|
|
看下效果图:
至此,我们就可以达到任意篡改数据的目的了。
当然,看到那些排行榜的用户不爽的话,直接将他们的数据改到解放前(openid在源码中能找到),哈哈哈…
PS:以上想法纯属意淫,请勿当真!!!
谨以此文献给我那位“为了升级打怪天天看广告”的兄弟.