背景
最近收到一个SRC提交的漏洞,泄露了微信小程序的appkey和appSecret;于是乎为了搞清楚影响,漏洞风险和利用方式,便有了这篇文章;
在了解漏洞风险之前先来了解一下微信的几个平台;
微信公众号平台
微信公众平台开发概述 | 微信开放文档 (qq.com)
微信公众平台接口调试工具 (qq.com)
这个界面是微信公众号平台提供的在线接口调试工具,可以看到功能挺丰富的,公众号后台的大部分功能都可以通过接口的方式调用,第一个接口就是通过appid和secret兑换access_token,然后后面的接口都是通过access_token来请求数据;
我这边登录自己的公众号后台,在APPSecret这里可以看到官方对于这个APPSecret的描述,也就是=密码;
但是我们配置到后面,可以看到需要配置ip白名单,才可以成功调用,下面的调用情况对比,就是把当前ip配置到白名单前后的对比;也就是说即使拿到了公众号的id和secret,但是不是白名单中的请求ip也是无法成功调用;
我这里是重置后必须要配置白名单才可以调用成功,但是我以前也遇到过拿到了id和secret确实可以调用成功的,不过这个不晓得对应公众号后台是怎么配置的;
然后自己以前也是跟这个白帽子类似,弄了个脚本拿到数据测试一下,能换token,哦吼,也就是数据有效存在风险,但是自己其实没有使用过,也不清楚具体风险是啥;然后关于白帽子提到的2000次调用限制,这个也确实有的,我自己测试了之后调用一次使用次数就少一次了;但是这里是公众号的id、secret;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-shJOjc9w-1687338883860)(%E5%BE%AE%E4%BF%A1%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95%E6%8B%93%E5%B1%95%2017e828cb60d74f65aa8147f6869dfb0f/Untitled%207.png)]
微信开放平台
微信调试工具 (qq.com)
微信登录
白忙活,注册了半天结果要花300才给用;
微信登录
具体还是看这篇指导文章;可以看到创建应用或者其他程序以调用微信开放平台提供的能力;能力包含了微信登录、分享、发朋友圈等,具体可以参考官方文档或者接口调试工具;
这里的Android证书和包名以及iOS的Bundile ID,会成为id和secret调用时候的凭据,应用配置完成后会生成对应的id和secret,不知道这里会不会提示这个数据的重要,目前在官方文档和后台都没有看到对于此数据的重要性描述;看接口文档也是直接写到代码里,没有提示需要额外处理;
通过获取的应用id和secret直接调用对应的接口,会提示如下;
微信auth2认证流程
准备工作 | 微信开放文档
漏洞影响
通过以上分析,因为泄露的是开发平台的应用id、secret,可以确定漏洞风险影响有限,然后涉及的应用为公版老版本,现存量活跃用户很少;然后漏洞实际可能造成的影响很小,或者说无法利用;然后目前github已经删除敏感信息,但是微信开发平台不支持重置。
测试脚本
下面为文章中使用的测试脚本;也是以前测试时候用的脚本。。。
# /usr/bin/env python3
# author:samli
# date:20220107
# -*- coding: utf-8 -*
import os
import sys
import re
import requests
import json
def main(appId, appSecret):
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (appId, appSecret)
r = requests.get(url, timeout=10)
#print (r.json())
token = r.json().get('access_token')
print (type(token))
url = "https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=%s" % (token)
api_domain_ip = requests.get(url, timeout=10)
print("Domain ip:\n")
print( api_domain_ip.json())
url = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=%s" % (token)
get_current_selfmenu_inf = requests.get(url, timeout=10)
print("Current menu:\n")
print(get_current_selfmenu_inf.json())
if __name__ == '__main__':
print ("Usage:checkWXSDK.py AppId AppSecret \n")
appId = sys.argv[1]
appSecret = sys.argv[2]
print ("You AppId:" + appId)
print ("You AppSecret:" + appSecret)
main(appId , appSecret)