微信API接口调用凭证+Access token泄露
字数 2128 2025-08-22 18:37:27
微信API接口调用凭证(Access Token)安全研究文档
1. 微信API接口调用凭证概述
1.1 Access Token基本概念
- 定义:Access Token是微信小程序/公众号的全局唯一后台接口调用凭据
- 有效期:7200秒(2小时),过期后需要重新获取
- 重要性:相当于打开微信服务的钥匙,几乎所有API调用都需要使用Access Token
1.2 官方建议的最佳实践
-
中控服务器架构:
- 使用统一的中控服务器获取和刷新Access Token
- 避免各业务服务器自行刷新导致Token冲突
- 中控服务器应提前刷新Token(基于expire_in值)
-
平滑过渡机制:
- 微信保证新旧Token有5分钟的重叠有效期
- 确保业务在Token刷新时不会中断
-
容错机制:
- 提供被动刷新接口,应对Token超时情况
- 适应未来可能的有效期调整
2. Access Token获取方式
2.1 获取接口
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET]
2.2 请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| grant_type | string | 是 | 固定值"client_credential" |
| appid | string | 是 | 小程序/公众号的唯一凭证 |
| secret | string | 是 | 小程序/公众号的唯一凭证密钥 |
2.3 返回参数
成功响应:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 7200
}
错误响应示例:
{
"errcode": 40013,
"errmsg": "invalid appid"
}
2.4 常见错误码
| 错误码 | 描述 | 解决方案 |
|---|---|---|
| -1 | 系统繁忙 | 稍候再试 |
| 40001 | 无效的access_token | 检查AppSecret或Token有效性 |
| 40013 | 无效的AppID | 检查AppID的正确性 |
| 40164 | IP不在白名单中 | 配置IP白名单 |
| 41004 | 缺少secret参数 | 检查请求参数 |
| 50004 | 禁止使用token接口 | 检查账号权限 |
3. 相关API接口
3.1 获取微信服务器IP地址
接口:
GET https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN
返回示例:
{
"ip_list": ["IP1", "IP2", "IP3"]
}
3.2 获取微信callback IP地址
接口:
GET https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
4. 安全风险与防护
4.1 常见泄露场景
-
源代码泄露:
- AppID和AppSecret硬编码在前端代码中
- 通过查看网页源代码可获取敏感凭证
-
接口响应泄露:
- 未加密的API响应中包含Access Token
- 调试信息中泄露敏感凭证
-
配置错误:
- 开发/测试环境的配置信息泄露到生产环境
- 版本控制系统中提交了包含凭证的配置文件
4.2 防护措施
-
凭证管理:
- 严格遵循中控服务器架构
- 避免在前端代码中存储AppSecret
- 使用微信云开发/云托管服务自动管理Token
-
访问控制:
- 配置IP白名单限制访问
- 实施最小权限原则
-
监控与审计:
- 监控Token获取频率
- 记录所有Token使用情况
-
代码安全:
- 避免硬编码敏感信息
- 使用环境变量管理凭证
- 定期扫描代码库中的敏感信息
5. 实战案例研究
5.1 信息收集方法
-
FOFA搜索语法:
(body="appId" && body="appSecret") && body="access_token" -
源代码审计:
- 检查网页源代码中的AppID和AppSecret
- 搜索常见参数名:appid、appsecret、access_token等
5.2 渗透测试流程
- 通过源代码分析或接口响应获取AppID和AppSecret
- 尝试调用Token获取接口:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[APPID]&secret=[APPSECRET] - 根据返回结果判断凭证有效性:
- 成功获取Token则存在泄露风险
- 返回IP限制错误(40164)说明有基本防护
- 获取Token后可进一步调用其他API:
- 获取微信服务器IP地址
- 调用其他需要Token的微信接口
5.3 小程序接口泄露案例
- 通过微信小程序查找目标学校的相关小程序
- 分析小程序接口调用,寻找配置信息接口(如
/mobile/serve/wechat/getConfig) - 从接口响应中提取AppID和AppSecret
- 验证凭证有效性并获取Access Token
6. 开发实践
6.1 代码示例(C#)
List<KeyValuePair<string, object>> parmeters = new List<KeyValuePair<string, object>> {
new KeyValuePair<string, object>(WeixinOfficialAccountTable.FieldDeleteMark, 0)
};
var listOfficialAccount = BaseEntity.GetList<WeixinOfficialAccountEntity>(
RDIFrameworkService.Instance.WeixinBasicService.GetOfficialAccountDTByValues(parmeters));
if (listOfficialAccount != null && listOfficialAccount.Count() > 0) {
foreach (WeixinOfficialAccountEntity entity in listOfficialAccount) {
try {
if (entity.Category == (int)WeChatSubscriberEnum.EnterpriseSubscriber) {
if (!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret)) {
// 方法一: 使用Senparc.WeiXin SDK的方法
entity.AccessToken = Senparc.Weixin.QY.CommonAPIs.CommonApi.GetToken(
entity.AppId, entity.AppSecret).access_token;
// 方式二: 直接调用微信的接口方法
// var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}",
// "client_credential".AsUrlData(), entity.AppId.AsUrlData(), entity.AppSecret.AsUrlData());
// AccessTokenResult result = Get.GetJson<AccessTokenResult>(url);
// entity.AccessToken = result.access_token;
entity.ModifiedOn = DateTime.Now;
returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
}
} else {
if (!string.IsNullOrEmpty(entity.AppId) && !string.IsNullOrEmpty(entity.AppSecret)) {
// 方法一: 使用Senparc.WeiXin SDK的方法
entity.AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(
entity.AppId, entity.AppSecret).access_token;
entity.ModifiedOn = DateTime.Now;
returnValue += RDIFrameworkService.Instance.WeixinBasicService.UpdateOfficialAccount(entity);
}
}
} catch (Exception ex) {
// 异常处理
}
}
}
7. 在线测试工具
微信官方提供的在线测试接口:
https://mp.weixin.qq.com/debug
使用说明:
- 可用于测试各种微信API接口
- 相比直接调用URL更方便,功能更全面
- 可验证AppID和AppSecret的有效性
8. 总结与建议
8.1 关键要点总结
- Access Token是微信生态中关键的接口调用凭证
- 凭证泄露可能导致严重的业务风险和安全问题
- 遵循官方推荐的中控服务器架构至关重要
- 避免在前端代码或客户端存储敏感凭证
- 定期审计和监控Token使用情况
8.2 安全建议
-
开发阶段:
- 使用环境变量管理敏感凭证
- 实施代码审查防止硬编码凭证
- 区分开发、测试和生产环境的配置
-
运维阶段:
- 配置严格的IP白名单
- 监控异常Token获取行为
- 定期轮换AppSecret
-
应急响应:
- 发现凭证泄露立即重置AppSecret
- 检查是否有异常API调用
- 更新所有依赖该凭证的系统
通过遵循这些安全实践,可以显著降低微信API接口调用凭证泄露的风险,保障业务安全稳定运行。