解密微信小程序漏洞:可下载任意小游戏源代码,“跳一跳”可改分

文章目录

20180102110814868

文 | 李勤

来自雷锋网(leiphone-sz)的报道

雷锋网消息,据 IT 之家 1 月 2 日消息称,“跳一跳”居然可以利用漏洞自己改分数,甚至连微信小程序、小游戏的源代码都可以直接下载,只需要知道appid和版本号,就可以直接构造URL下载后缀为wxapkg的源码包,不需要任何验证。1 月 2 日下午,著名安全团队“盘古”的安全专家向雷锋网宅客频道证实,微信小游戏“跳一跳”改分漏洞仍在,此前流传的“微信已补漏洞”是指已经修补了微信小游戏“跳一跳”的源代码下载漏洞。这意味着,改分依然可行。

到底怎么回事?雷锋网从盘古旗下的 Janus 威胁情报平台了解到了详情。

一、复现

一个为该平台投稿的独立开发者朱鹏飞称“我看完文章之后立马根据他的思路方法测试了一下,然后下载了十几个微信官方的小游戏源码单纯研究学习,截止我目前推送文章的时候( 2018年1月1日23:50分 ),微信官方已经修复了这个漏洞,但是我感觉文章还是可以分享出来给诸位开发者,安全问题真的不容忽视呢。”

雷锋网还注意到,朱表示,有些老版本的微信还是可以抓包,获取包地址。

朱称,一大早起来刷 V2EX,看到一个帖子《微信跳一跳 可以直接更改分数, POST 请求没有校验…》好奇点进去看了。

20180102110408347

发现不但跳一跳小游戏可以直接改分数,甚至连微信小程序、小游戏的源代码都可以直接下载,只需要知道 appid 和 版本号,就可以直接构造 URL 下载后缀为 wxapkg 的源码包,不需要任何验证。

20180102110408223

虽然下载来的源码包是加密的,但是解密方法已经被 V2EXer 发现,并且写了一个解密的 Python 脚本,运行即可把源码包解开为文件夹。

20180102110408803

第一步,我先试着用帖子作者拼接好的跳一跳源码包地址测试,发现能够下载,不需要任何验证,只需要知道这个地址,直接任意浏览器或者下载工具打开都可以下载。

20180102110409158

第二步,再用帖子中的解包 Python 脚本把源码包解压成源代码。

20180102110409291

20180102110409812

20180102110409678

第三步,在本地微信开发者工具中新建一个空白的小程序或小游戏的项目,不要选择快速启动模板。

20180102110409414

第四步,把刚才解压出来的源代码复制到刚刚创建的项目目录中,开发者工具会提示编译出错,这个只需要新建一个game.JSON文件即可。

20180102110409868

文件内容不能为空,写一对大括号进去,或者加上deviceOrientation的配置,这句话的意思是游戏竖屏玩。

20180102110409750

保存后你发现游戏还是编译不通过,还需要修改最后一项,点击开发者工具右上角详情按钮,把调试基础库改成game。

20180102110410890

好了,运行起来了:

20180102110410392

此外, Janus 为雷锋网出具了一份最新改分攻略:

二、改分关键步骤

电脑安装抓包软件,手机设置https代理到电脑

通过抓包软件,抓包拿到微信的sesseion_id

将sesseion_id写入改分脚本,提交改分请求

以下为详细教程

(1)部署代理环境(mac环境)

mac下选用charles作为抓包代理软件(https://www.charlesproxy.com/),windows用户可以用 fiddler(https://www.telerik.com/fiddler)。

安装好后运行起来,查看本机IP地址,以及软件提供的远程代理端口号:

charles 的顶部菜单 Proxy->Proxy settings

20180102110410482

将手机接入与电脑同一个局域网的wifi,然后在wifi的代理设置中,选择手动指定代理,代理服务器为电脑的ip及代理软件提供的端口号(如图中的8888)。

电脑端会提示是否运行远程接入,点allow即可。

20180102110410110

设置好了以后可以尝试浏览器打开baidu.com,如果可以正常打开,并且在抓包软件中可以看到请求记录就完成了手机的代理设置。

由于是https的请求,需要在手机端安装证书才可以解密请求,charles的证书可通过手机浏览器安装,手机浏览器访问http://chls.pro/ssl,点继续访问此网站,会提示安装证书。

20180102110410769

ios 10.3以上的系统版本,需要在 设置→通用→关于本机→证书信任设置 里面启用完全信任Charles证书。

配置好证书后可以打开https://baidu.com看看是否能解开百度的首页源代码。

(2)获取session id

https配置完毕后,打开微信的跳一跳小程序,就可以看到抓包历史有一个带有session id的请求:https://mp.weixin.qq.com/wxagame/wxagame_init

201801021104108901

在request部分就可以复制到session_id了。

(3)将sesseion_id写入改分脚本,提交改分请求

目前开源的脚本是nodejs写的,git地址:https://gist.github.com/feix/6dd1f62a54c5efa10f1e1c24f8efc417

具体的步骤:

新建个目录,比如:wxt1t,然后将脚本源码保存到这里,比如hack.js。

然后安装nodejs,可以通过官网下载安装包安装:https://nodejs.org/en/

然后在命令行cd到当前项目文件夹(wct1t),运行:

npm init --y

npm install crypto-js request-promise

然后用文本编辑器打开hack.js,修改里面的score(分数)和session_id变量的值即可。

命令行运行node hack.js,出现2018! Happy new year! 就代表成功了。

上述盘古专家还提醒:“虽然‘跳一跳’的下载代码漏洞已经修补,但是之前官方的源代码已经传播开了,别人拿去改一改,就可以出个自己的‘跳一跳’了,比如,可以拿‘跳一跳’的代码改一个游戏,叫‘跳跳跳’,然后夹带一些私货,发布个新游戏。”

如果这样,类似的新游戏是否有夹带恶意代码的风险?

专家对雷锋网称:“小程序有审核机制,如果夹带了恶意代码,躲避审核后才能实现。现在小程序审核比较严格,尚不清楚其对恶意代码的审计力度。”