微信小程式安全測試
- 小程式安全淺析
一、小程式簡介
小程式滲透測試,歸根結底還是在做各種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)SSRF
(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
第四步:對小程式原始碼進行審計
使用微信開發者工具開啟反編譯後的檔案,成功得到小程式原始碼