一、什么是反编译审计漏洞
微信小程序反编译渗透测试是一种针对微信小程序的安全测试方法,是在通过对小程序源代码的反编译和分析,发现潜在的安全漏洞,并对其进行渗透测试以验证其安全性的一种方法。
二、测试流程及其步骤
- 反编译小程序:使用适当的工具对微信小程序进行反编译,将其源代码还原成可读的形式,以便进行后续分析和测试。
- 源代码审查:仔细审查小程序的源代码,查找潜在的安全漏洞,例如代码中的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 requests
import json
def 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_List
if __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渗透过程中,找前端源码一样。