微信小程序渗透测试与常见漏洞

前言:挖洞和渗透测试中经常会碰到小程序,学习一下小程序中常见的鉴权方面以及信息加密方面的漏洞。

小程序抓包

我这里是用的Fiddler+Burp,用的微信PC版,现在的微信PC版可以直接在PC端使用小程序,抓包还是比较方便的,具体为以下几点。

一、正常设置PC端微信代理(微信登录的时候右上角按钮),过Fiddler默认的8888端口,然后Fiddler设置上游代理为Burp的8080端口。

二、设置Fiddler解密HTTPS数据,需要安装证书,安装证书就不再记录了。

我的具体配置如下:



疑难杂症:之前我微信小程序还可以正常抓包,后来还是一样的操作发现抓不到了,网上搜了一圈最终解决,如下。

任意打开一个小程序,打开任务管理器,找到对应的进程。右键打开文件位置。

看到WechatApp.exe变成了WechatAppex.exe了,应该是升级了。

在这里插入图片描述

退出电脑微信,右键结束小程序进程。

找到这个目录,将这个文件夹清空。

在这里插入图片描述

重启电脑微信,打开fiddler抓包小程序

微信小程序登录

先看一下微信官方提供的开发文档

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

登录流程时序

img

说明

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意事项

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  2. 临时登录凭证 code 只能使用一次

session__key泄露

从上面的登录流程时序图我们可以大概知道session_key是一个非常重要的加密密钥, 那么如果这个关键信息泄露了,就会有很大的危害,例如任意手机号登录小程序,微信官方甚至给我们提供了session__key泄露之后的利用demo,如下:

为进一步提升小程序的安全性和用户体验,目前平台对提审的小程序均需进行安全检测,在检测过程中发现仍有许多小程序存在安全漏洞,其中涉及session_key泄露漏洞,希望通过以下相关的漏洞介绍、案例分析和修复建议,开发者能更加了解如何对该漏洞进行防御。

一、漏洞介绍

为了保证数据安全,微信会对用户数据进行加密传输处理,所以小程序在获取微信侧提供的用户数据(如手机号)时,就需要进行相应的解密,这就会涉及到session_key,具体流程可参考开放数据校验与解密开发文档。

session_key指的是会话密钥,可以简单理解为微信开放数据AES加密的密钥,它是微信服务器给开发者服务器颁发的身份凭证,这个数据正常来说是不能通过任何方式泄露出去的。小程序若存在session_key泄露漏洞的情况,则代表微信侧传递的用户数据有被泄露、篡改等风险,开发者应及时发现该漏洞并快速修复相应问题。

img

二、漏洞案例

某小程序因为session_key泄露,导致该小程序可以使用任意手机号进行登录,造成了极大的安全风险。

我们可以很明显地看到,下列请求中的session_key已经被泄露:

img

通过获取该session_key,我们可以结合iv解密出密文:

img

只需如下脚本即可进行解密,所以攻击者也可利用同样的信息去篡改用户数据,然后加密后返回给服务器,从而达到使用任意手机号进行登录的目的。

img

三、漏洞修复

通过上述案例,我们了解到session_key泄露会对小程序造成的危害,若小程序存在相应的session_key泄露漏洞问题,请开发者尽快根据以下修复指引进行调整:请尽快在网络请求中,去除请求和响应中的session_key字段及其对应值,后续也不应该将session_key传到小程序客户端等服务器外的环境,以便消除风险。

通过该案例,可以知道,当服务端的session_key泄露时,客户端可以使用脚本解密数据,修改其中的手机号字段,再加密后返回给服务器,即可以使用任意手机号进行小程序登录。

快捷登录截图如下:

image-20220607134402229

解密脚本

使用之前需要有wxdc库,pip安装一下即可。

from wxdc.WXBizDataCrypt import WXBizDataCrypt  

def main():
    appId = ''
    sessionKey = ''
    encryptedData = ''
    iv = ''
    pc = WXBizDataCrypt(appId,sessionKey)

    print pc.decrypt(encryptedData,iv)

if __name__ = '__main__':
    main()

AppSecret密钥泄露

还是看官方给出的案例,清晰明了

某小程序因为AppSecret泄露,导致攻击者可以通过调用API获取该小程序敏感数据,如接口调用凭证、用户信息、用户使用数据等,造成了极大的安全风险。

通过以下展示我们可以明晰该小程序敏感数据外泄的原因,测试者先对小程序网络请求进行抓包,发现请求响应中包含了appid和AppSecret敏感信息:

img

通过上述获取的appid和AppSecret敏感信息,可以利用接口获取到相应的access_token:

img

img

最后可以实现使用access_token调用该小程序所有后台接口的目的,后台服务端接口已涵盖数据、运维、消息等多方面场景能力。

下面我们再具体举几个利用access_token调用小程序后台接口的例子:

1.获取小程序用户评论

img

2.获取小程序用户访问数据

img

3.冒用小程序身份给用户发送消息

img

img

AppSecret密钥泄露漏洞其他的危害包括但不限于:冒用小程序身份给用户发送客服消息/模板消息、获取小程序session_key(用于解密微信侧提供的用户敏感数据)、获取小程序运维信息、日志等敏感信息、更改小程序相关的配置等。

简单概括,通过AppSecret+AppId可以获取到小程序的access_token(个人理解和github的token类似),而access_token是操作小程序后台接口的钥匙,也就基本相当于拥有了小程序的后台管理权限。

小程序漏洞挖掘

一、正常Web渗透测试类似

二、通过HAE等插件,检测流量中是否存在session_key、AppSecret、access_token等关键字