网络安全----小程序渗透测试反编译审计漏洞

小程序 0

一、什么是反编译审计漏洞

微信小程序反编译渗透测试是一种针对微信小程序的安全测试方法,是在通过对小程序源代码的反编译和分析,发现潜在的安全漏洞,并对其进行渗透测试以验证其安全性的一种方法。

二、测试流程及其步骤

  • 反编译小程序:使用适当的工具对微信小程序进行反编译,将其源代码还原成可读的形式,以便进行后续分析和测试。
  • 源代码审查:仔细审查小程序的源代码,查找潜在的安全漏洞,例如代码中的XSS漏洞、未经授权的访问点、不安全的数据处理等。
  • 逻辑分析:分析小程序的业务逻辑,了解其工作原理和数据流动,找出可能存在的逻辑漏洞和不当授权等问题。
  • 渗透测试:基于发现的漏洞和问题,对微信小程序进行渗透测试,尝试利用这些漏洞进行攻击,例如尝试执行XSS攻击、SQL注入、CSRF攻击等,以验证漏洞的存在性和影响程度。
     

三、小程序渗透测试详细步骤

1.小程序的发现

在日常生活中,利用微信自带的小程序搜索功能可以轻松地找到我们需要的小程序。微信会根据用户输入的关键字,依次搜索小程序的名称、简介以及开发者信息,并返回与关键字匹配度较高的相关小程序。下图展示了用户搜索含有“微信”关键字的小程序时客户端返回的搜索结果:

在渗透测试工作中,单独通过逐个搜索的方式来寻找目标小程序显然效率太低,且无法搜集到所有相关的小程序。因此,我们需要一种更为方便、高效的方法来获取小程序搜索结果。

一种可能的解决方案是尝试修改微信搜索请求的数据包,以便一次性返回大量的搜索结果,或者多次获取足够数量的搜索结果。当然,这需要我们通过抓包工具捕获到相关的网络数据包。下图是抓取到的数据包的简化版本,已删除其他非关键参数。

可以看到这是一个向“https://mp.weixin.qq.com/wxa-cgi/innersearch/subsearch” POST数据的请求包,POST的内容中含有“query”、“cookie”、“subsys_type”、“offset_buf”这四个参数。“query”内容为用户搜索的内容,可以为任意值;“cookie”参数是当前微信用户的校验信息,具有一定的有效期,但能保持在很长一段时间内不会过期;“subsys_type”则为一个固定值,恒等于“1”;“offset_buf”参数较为关键,控制具体搜索多少个小程序、返回多少小程序信息。我来带大家分析一下“offset_buf”参数为什么我认为比较关键:参数内容是一串JSON数据,我们可以把他拆分成“server”、“index”、“client”三组来分析。第一组“server_offset”表示服务器从第几个小程序中开始搜索,我们将参数保持不变为“0”即可;“server_limit”表示服务器最多查询多少个小程序,在普通用户的搜索中恒为“120”,这也就解释了为什么我们在搜索一些小程序关键字时总是搜索不全,并不是没有更多的相关小程序了,而是服务器不会继续搜索了。第二组“index_step”表示每一次查询多少个值,这个值肯定是越大越好,以便于我们能一次查完;“index_offset”可以理解为用户目前已经查询了多少个小程序,我们将他设置为恒为“0”即可。第三组“client_offset”表示微信客户端上已经显示了多少个微信小程序,我们无需去理会,也直接设置为恒为“0”即可,“client_offset”则是每次查询返回多少个小程序结果,这里我们设置为实际想查询的数量。

我们便可构造参数来编写自定义微信小程序搜索的脚本,其Python程序源码如下:

#!/usr/bin/env python# -*- encoding: utf-8 -*-import requestsimport jsondef Get_Apps(query, number, cookie):    headers = {        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.11(0x17000b21) NetType/WIFI Language/fr"    }    url = "https://mp.weixin.qq.com/wxa-cgi/innersearch/subsearch"    params = {        "query": query,        "cookie": cookie,        "subsys_type": 1,        "offset_buf": json.dumps({            "page_param": [                {                    "subsys_type": 1,                    "server_offset": 0,                    "server_limit": int(number) + 30,                    "index_step": number,                    "index_offset": 0                }            ],            "client_offset": 0,            "client_limit": int(number)        })    }    response = requests.post(url=url, params=params, headers=headers).json()    App_Id_List = []    App_Name_List = []    try:        App_Items = response['respBody']['items']        for App_Item in App_Items:            App_Id = App_Item['appid']            App_Name = App_Item['nickName']            App_Id_List.append(App_Id)            App_Name_List.append(App_Name)    except KeyError:        print("无法获取小程序信息,请检查参数是否正确。")        return [], []    return App_Id_List, App_Name_Listif __name__ == '__main__':    query = input("请输入要搜索的微信小程序名称: ")    number = input("请输入要返回的小程序数量: ")    cookie = input("请输入你获取到的Cookie信息: ")    App_Id_List, App_Name_List = Get_Apps(query, number, cookie)    if App_Id_List and App_Name_List:        print("返回的小程序名: {}".format(",".join(App_Name_List)))        print("返回的小程序ID: {}".format(",".join(App_Id_List)))    else:        print("信息获取失败,请检查!")

2.获取小程序源码

打开文件夹

返回上一级目录

这些wx开头的就是小程序文件

获取其小程序源码

3.反编译小程序

反编译需要工具:unveilr  (工具链接会放在文末)

将unveilr 解压,然后在当前目录打开cmd

复制小程序路径,运行反编译文件

成功会在刚才的小程序文件夹目录下生成一个__APP__的文件夹,这里面的就是小程序的源码

3、审查源代码

这里需要用到微信开发者工具(直接百度搜索微信开发者工具,选择对应版本就可以)

安装好之后,打开微信开发者工具,选择小程序——>导入

选择刚才的__APP__文件夹

导入时候,选择不使用云服务, AppID 自动获取,项目名称自己起一个

我这里是之前已经打开过了,所以会提示

点击确定,就可以进行调试了

现在就可以审查源代码了

4、渗透测试

一般我们会看app.js文件和app.json文件,js文件包含小程序调用的JS文件。 json文件包含小程序的路径,一般可以用来测试未授权访问。

到这里前期的准备工作就算结束了,大家就可以利用反编译出来的源码进行渗透了,其实就类似web渗透过程中,找前端源码一样。

也许您对下面的内容还感兴趣: