前言
太多時間遇到微信小程序的滲透測試,而自身就對其不甚了解,借此梳理微信小程序的一些知識點。
開發(fā)流程
小程序可以理解成以后一種只能用微信打開和瀏覽的網(wǎng)站。
小程序開發(fā)首先需要去 微信公眾平臺 申請一個AppID。申請
之后,會得到一個AppID(小程序編號)和 AppSecret(小程序密鑰)。
再下載微信提供的小程序開發(fā)工具影钉,來運行和調(diào)試小程序源碼廉赔。
本地創(chuàng)建一個hello-world的項目劳曹,來導(dǎo)入運行蜕劝。
|- app.json # 記錄項目的一些靜態(tài)配置
|- app.js # 對整個小程序進(jìn)行初始化
|- pages
|- home
|- home.wxml
|- home.js
app.js 中只有App({});
代碼搭独,表示新建一個小程序?qū)嵗?br>
home.js 中只有Page({});
代碼互躬,表示用于初始化一個頁面實例。
home.wxml文件,WXML 是微信頁面的標(biāo)簽語言,類似于HTML 語言,用于描述小程序的頁面晨雳。代碼為
<view>
<text>hello world</text>
</view>
app.json 表示項目的配置文件洋魂,對所以頁面都有效豁翎。
{
"pages": [
"pages/home/home"
]
}
app.wxss 用于描述 WXML 的組件樣式,類似CSS樣式表熙卡。
sitemap.json 文件用于配置小程序及其頁面是否允許被微信索引 表窘。
再復(fù)雜一些昭娩,就是在home.js中加入javascript代碼,做出動態(tài)效果莱褒。更多的腳本編程參考https://www.ruanyifeng.com/blog/2020/10/wechat-miniprogram-tutorial-part-three.html
如點擊按鈕獲取個人信息蹦浦。
home.wxml
<view>
<text class="title">hello {{name}}</text>
<button open-type="getUserInfo" bind:getuserinfo="buttonHandler">
授權(quán)獲取用戶個人信息
</button>
</view>
open-type="getUserInfo" 指定按鈕用于獲取用戶信息顽照。再通過點擊按鈕觸發(fā)buttonHandler事件涎永。對應(yīng)home.js的事件為:
Page({
data: { name: '' },
buttonHandler(event) {
if (!event.detail.userInfo) return;
this.setData({
name: event.detail.userInfo.nickName
});
}
});
假如開發(fā)好了一個微信小程序,就可以點擊上傳到小程序開發(fā)管理叉跛。
如果沒有上傳按鈕莫换,檢查一下是否使用的是測試號撕瞧。
如果上傳顯示代碼包超過大小限制研儒,就需要分包遍膜。
小程序上傳后會在微信公眾平臺上信柿,再點擊提交審核霞幅,審核通過后即可上線。
登錄流程
先貼上微信登錄的流程圖
參考 http://www.reibang.com/p/4e4db943bfb3 文章韩容,服務(wù)端運行springboot的后端項目毅弧。
在微信小程序端開發(fā)微信登錄頁面蛾坯。
結(jié)合微信登錄的流程圖和源代碼分析登錄流程呈驶。
- 小程序首先
wx.login()
調(diào)用小程序接口獲取登錄憑證code
。
- 在java服務(wù)端配置好appid志鞍、appsecret墩邀,和小程序返回的code再向
https://api.weixin.qq.com/sns/jscode2session
接口地址發(fā)送請求孔飒,返回session_key缀棍、openid 給 java 服務(wù)端狱窘。
session_key 即會話秘鑰馁菜,作為數(shù)據(jù)的加解密和簽名的校驗。
openid 即用戶標(biāo)識泉坐。
-
wx.getUserInfo
獲取用戶信息,返回 userInfo 用戶信息對象,包括昵稱馒疹、頭像漓雅、性別等赵讯、rawData 原始數(shù)據(jù)、signature 校驗用戶簽名间雀、encryptedData 包含敏感信息在內(nèi)的完整數(shù)據(jù)夏伊、iv 加密初始向量。
一并提交給java服務(wù)端。
服務(wù)端接收到參數(shù)后,首先會校驗一下簽名是否一致羽圃。
即signature 值。由sha1(rawData + sessionkey)
加密而來宋梧。
根據(jù)session_key和openid等生成自定義的第三方session创夜,發(fā)送給客戶端用來建立會話杭跪。
建立會話后,將返回的原始信息rawData存入mysql數(shù)據(jù)庫中。如果是新的用戶就重新設(shè)置會話涧尿。在以后的用戶登錄中只需要去數(shù)據(jù)庫查找是否有合法的session_key系奉、openid值。
- 剩下的encryptedData 包含敏感信息在內(nèi)的完整數(shù)據(jù)姑廉。
即 encrypteData比rowData多了appid和openid
{"openId":"oJLX05Y5chjZBE1ChkES41H7Wmw","nickName":"CSeroad","gender":1,"language":"zh_CN","city":"jinan","province":"dong","country":"China","avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/ibScdziaQmbVKREzRSYOuxDl52x84frQMt9qtficVChpmB7jIGmUxkvOz47IgBPHTdmXdb5LTewxmt8ZpEY4ibqmvw/12","watermark":{"timestamp":1629442063,"appid":"wxc0f5b64c26ff5d"}}
如:獲取手機號也會加密在encryptedData里面缺亮。
反編譯流程
以安卓模擬器為例,使用RE文件管理器桥言,在路徑下/data/data/com.tencent.mm/MicroMsg/xxxxxxx(不同微信文件夾也不同)/appbrand/pkg/
找到小程序包萌踱。
注意windows上的小程序都做了加密混淆,無法解包
利用adb
工具号阿,將小程序包拉取到本地上并鸵。
首先在MAC終端上安裝adb,命令如下
1扔涧、安裝brew
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
2园担、安裝android tools
brew install android-platform-tools
3、運行adb
adb devices # 列出當(dāng)前Android設(shè)備
adb shell # 進(jìn)入終端
adb push <local> <remote> # 從本地復(fù)制文件到設(shè)備
adb pull <remote> <local> # 從設(shè)備復(fù)制文件到本地
將小程序拉取到本地枯夜。
adb pull /data/data/com.tencent.mm/MicroMsg/a9c2c1453c1f99e1b5ff0185c3640139/appbrand/pkg/_860149573_130.wxapkg
下面就可以使用wxappUnpacker
進(jìn)行反編譯了弯汰。需要提前安裝node.js及其他組件,參考https://blog.csdn.net/weixin_47168538/article/details/107843795 進(jìn)行安裝卤档。
安裝后直接使用"node wuWxapkg.js 小程序包名"命令蝙泼,即可一鍵解包。
推薦 https://github.com/xuedingmiaojun/wxappUnpacker 項目劝枣,支持解包子包汤踏。
解包完成后,使用微信開發(fā)者工具導(dǎo)入項目即可舔腾。
app.json
文件中溪胶,pages以內(nèi)的都是主包,subPackages以內(nèi)的為分包稳诚,每一個root都是一個分包哗脖。
AES 加密實例
如在一次反編譯獲取小程序源碼,查找到AES加密方法
iv偏移量是固定的扳还,秘鑰key由sessionKeyFromStore和sessionId運算而來才避。
抓取數(shù)據(jù)包獲取到的sessionKey結(jié)合該數(shù)據(jù)包的sessionId可運算出AES加密的手機號。
總結(jié)
學(xué)習(xí)了微信小程序的基礎(chǔ)開發(fā)氨距、會話建立過程桑逝、簡單反編譯查看源代碼。
想把微信小程序開發(fā)設(shè)計到的安全點都學(xué)習(xí)到確實很難俏让,但應(yīng)對日常測試應(yīng)該足夠了楞遏。
參考資料
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
https://www.hackinn.com/index.php/archives/672/
http://xuedingmiao.com/