- 小程序安全浅析
一、小程序简介
小程序渗透测试,归根结底还是在做各种WEB的测试,只是将图形化界面从浏览器移动至微信中。小程序的web后端一般有三种情况:
(1)与H5、手机APP、网页使用同一套API系统
(2)与手机APP使用同一套API系统
(3)单独使用一套API系统
可以对后端系统的安全性从高至低做如下排序:网页版>手机APP>H5≥小程序,微信小程序在这套产品中往往是最为脆弱的。在许多渗透测试中,网页不行、APP不行,往往通过微信小程序可以作为突破口。
二、小程序登录过程
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系,登录流程时序如下图:
- 小程序端通过wx.login()获取到code后发送给后台服务器
- 后台服务器使用小程序的appid、appsecret和code,调用微信接口服务换取session_key和openid(openid可以理解为是每个用户在该小程序的唯一识别号)
- 后台服务器自定义生成一个3rd_session,用作openid和session_key的key值,后者作为value值,保存一份在后台服务器或者redis或者mysql,同时向小程序端传递3rd_session
- 小程序端收到3rd_session后将其保存到本地缓存,如wx.setStorageSync(KEY,DATA)
- 后续小程序端发送请求至后台服务器时均携带3rd_session,可将其放在header头部或者body里
- 后台服务器以3rd_session为key,在保证3rd_session未过期的情况下读取出value值(即openid和session_key的组合值),通过openid判断是哪个用户发送的请求,再和发送过来的body值做对比(如有),无误后调用后台逻辑处理
- 返回业务数据至小程序端
在此流程中,”session_key”起到了至关重要的作用,只要能获取此key的内容,便可以控制回调凭证内容,使整套登录安全体系遭到破坏。session_key加解密如下图所示:
微信同时也考虑到这个问题,所以给出如下提醒:
1、开发者服务器可以根据用户标记来生成自定义登录状态,用于后续业务逻辑中的前后端交互时识别用户身份;
2、会话密钥session_key是对用户数据进行加密签名的密钥。为了应用自身的数据安全,开发者服务器不应该把会话下发到小程序,也不应该对外提供这个密钥。
总结:从微信接口服务获取的”session_key”不可以直接返回给用户,建议将自己生成的key在数据库中与”session_key”做关联,使用自己生成的key进行用户身份校验。
- 小程序漏洞分类
由于微信小程序中的特性是不能执行动态脚本的,所以不会存在XSS、CSRF、JSON劫持、CORS劫持等需要用户交互才能触发的漏洞,因为这类攻击都是基于浏览器对用户的信任,而小程序内用户的一切操作都是在微信沙盒内完成的,攻击者无法通过浏览器利用用户在小程序内的身份凭据来完成攻击。此外类似于URL跳转、CRLF注入、目录遍历等由于后端API特性的漏洞也不复存在。
微信小程序后端主要存在的漏洞大类有:
(1)各类逻辑漏洞
(2)信息泄露
(3)弱口令
(4)越权
(5)SQL注入
(6)任意文件上传
(7)文件读取/包含
(8)命令执行
(9)第三方组件漏洞
(10)s-s-rF
(11)反序列化
- 小程序抓包方法
一、准备工具
PC端微信、burp、Fiddler
二、配置抓包
第一步:安装fiddler证书到本地
第二步:导出的证书安装到“受信任的根证书颁发机构”
第三步:配置fiddler,开启解密https流量
监听8888端口
配置网关为burp监听的IP及端口
第四步:配置burp监听端口8080,安装burp证书
第五步:打开微信,设置微信代理为fiddler监听的IP和端口
成功抓到小程序数据包
- 小程序信息收集
一、收集域名接口
查看小程序信息
由于微信小程序服务器的域名白名单机制,小程序只能跟指定的域名进行通信,只要涉及到微信小程序GET、POST的数据请求的域名都必须配置在小程序后台的“服务器域名-request合法域名”中,这一栏数据正是“更多资料”中“服务及数据由以下网站提供”一栏的数据,通过微信这一机制,我们可以快速的收集到小程序的域名接口资产。
二、小程序源码还原
准备工具
微信小程序开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
Node:https://nodejs.org/zh-cn/
wxappUnpacker:https://github.com/xuedingmiaojun/wxappUnpacker
夜神模拟器:https://www.yeshen.com/
第一步:安装环境
安装完成后执行以下命令:
npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen
如果编译一直出错,就是依赖没装完整,按报错信息来安装即可
比如Error: Cannot find module ‘js-beautify’,就执行npm install js-beautify
第二步:获取小程序.wxapkg文件
使用模拟器中微信访问一个小程序时,会默认把小程序相关文件下载到本地,目录地址为:/data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg/xxxxxxxxx.wxapkg,User为一串很长的字符串,访问小程序后该目录下会出现两个.wxapkg文件,将较小.wxapkg的文件导出到本地。
第三步:使用wxappUnpacker反编译小程序
下载wxappUnpacker后对.wxapkg数据包进行反编译,执行命令:
bingo.bat xxxxx.wxapkg
第四步:对小程序源码进行审计
使用微信开发者工具打开反编译后的文件,成功得到小程序源码
请发表评论