由於小程序的便捷性,越來越多的應用遷移到了了小程序上,由此伴隨著小程序上線前的日常滲透測試工作也開始增加。但小程序的測試中經常會遇到數據包被加密了,導致無法進行改包測試。和測試網頁數據包加密一樣,就需要找到小程序前端相應的加解密方法進行加解密數據包改包測試。
2.小程序前端源碼提取不同於網頁f12查看網頁源碼即可查看搜索相應加解密函數,小程序雖然也是三大組件但其前端源碼存放在微信安裝包的wxapkg包中,我們需要使用一個root設備提取處相應的wxapkg包,並還原出前端源碼。文件一般位於 /data/data/com.tenc ent.mm/MicroMsg/appbrand/pkg/(安卓系統,以下測試都在安卓機下進行)目錄下。
提取的時候需要準備一臺root手機或使用夜神等模擬器均可,然後使用adb進入/data/data/com .tencent.mm/MicroMsg/appbrand/pkg/,提取相應的文件。由於wxapkg的命名時隨機的,可以使用ls -al 命令根據你所安裝小程序時間來判斷提取相應小程序的wxapkg包。.wxapkg是一個二進位文件,有其自己的一套結構,具體可以參考該連結。
接下來就需要對wxapkg文件進行反編譯提取相應的前端源碼,一般是搭建nodejs環境進行反編譯還原。我比較懶不太想搭喜歡用傻瓜式操作,這邊推薦一個小程序反編譯工具CrackMinApp,具有圖形化的操作界面及所需依賴環境。界面長這樣:
下載和操作指南可以參考它的github項目,還原後的前端源碼就這樣:
第一步就是要找到前端源碼中的加解密的方法,一行行代碼去找肯定不現實太費時間,一般都全局搜 encrypt、decrypt、AES、DES、RSA這些關鍵詞。一般來說基本都用對稱加密且AES出現的頻率最高,如下所示直接找到相應的加解密方法和密碼。
用的還是ECB模式這這這。之後就好辦了開始測試發現兩個高危,中低危就不描述了,說實話加密的數據包解密後一般漏洞較多。
在忘記密碼處輸入手機號點擊發送驗證碼,如下所示:
在驗證碼輸入框內輸入任意6位數字,如下所示:
點擊下一步,攔截伺服器返回數據包,如下所示:
數據包內容解密結果如下:
將返回數據包改成如下形式{"code":200},加密後數據包發至客戶端,欺騙成功跳轉至設置密碼處如下所示:
設置任意密碼提交後即可成功修改密碼,如下所示:
利用修改完的密碼可成功登錄,從而實現任意用戶密碼修改。
在發現處搜索項目抓取相應的數據包,重放返回如下數據信息:
解密後為項目數據信息,如下所示:
修改POST參數值itemName為』,發現伺服器返回500錯誤如下所示:
由於服務端返回的數據項目名稱為例如某某公司,POST數據輸入搜索參數為該公司名稱有數據返回,輸入搜索關鍵詞為"公司「時無數據返回,故猜測sql語句邏輯為模糊查詢為如下所示:
'select * from table where clo like '+canshu+'%'
故構造payload首先猜測資料庫用戶名長度如下所示:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when length(user)>=3 then '1' else '0' end),'%')='1","bondName":""}
加密後在POST包中發送如下所示當長度大於等於3時返回正常,大於等於4時無數據返回,故判斷得到資料庫用戶名長度為3,如下所示:
同理構造如下payload猜測資料庫用戶名,如下所示:
{"pageNum":1,"pageSize":10,"itemName":"%' and concat((case when ascii(substr(user,3,1))>=67 then '1' else '0' end),'%')='1","bondName":""}
之後就不深入了,測完收工。