繞過接口參數(shù)簽名驗(yàn)證
在一些關(guān)鍵業(yè)務(wù)接口,系統(tǒng)通常會(huì)對(duì)請(qǐng)求參數(shù)進(jìn)行簽名驗(yàn)證,一旦篡改參數(shù)服務(wù)端就會(huì)提示簽名校驗(yàn)失敗。在黑盒滲透過程中,如果沒辦法繞過簽名校驗(yàn),那么就無法進(jìn)一步深入。
微信小程序的前端代碼很容易被反編譯,一旦簽名加密算法和密鑰暴漏,找到參數(shù)的排序規(guī)則,那么就可以篡改任意數(shù)據(jù)并根據(jù)算法偽造簽名。下面我們將通過兩個(gè)簡(jiǎn)單的小程序參數(shù)簽名繞過的案例,來理解簽名逆向的過程。
01、常見簽名算法
首先呢,我們需要理解的是,加密和簽名是兩回事,加密是為了防止信息泄露,而簽名的目的是防止數(shù)據(jù)被篡改。
哈希算法的不可逆,以及非對(duì)稱算法(私鑰簽名,公鑰驗(yàn)簽),為簽名的實(shí)現(xiàn)提供了必要的前提。常見的簽名算法,如:
MD5、SHA1、SHA256、HMAC-SHA1、HMAC-SHA256、MD5WithRSA、SHA1WithRSA 、SHA256WithRSA等。各種簽名示例如下:

可以看到常見的HASH簽名算法輸出長(zhǎng)度是固定的,RSA簽名長(zhǎng)度取決于密鑰大小,輸出相對(duì)較長(zhǎng)。那么,通過簽名的字符長(zhǎng)度,我們可以簡(jiǎn)單的判斷出系統(tǒng)所使用的簽名算法。
02、MD5簽名繞過
業(yè)務(wù)場(chǎng)景:在一些營(yíng)銷推廣的抽獎(jiǎng)活動(dòng)里,關(guān)鍵接口有簽名,但沒有對(duì)單個(gè)用戶的抽獎(jiǎng)次數(shù)進(jìn)行限制。那么,一旦簽名算法暴露,將導(dǎo)致用戶可以任意構(gòu)造請(qǐng)求偽造簽名,進(jìn)而在從大量抽獎(jiǎng)?wù)埱笾校岣咧歇?jiǎng)概率,從而獲取到額外的獎(jiǎng)品。
(1)通過模擬器獲取小程序的.wxapkg包

(2)使用反編譯腳本解包,獲取小程序前端源碼。

(3)全局搜索關(guān)鍵字sign,獲取簽名算法,session+timestamp計(jì)算md5,然后md5+nonce重新生成簽名。

(4)編寫Python腳本,仿寫簽名機(jī)制,模擬進(jìn)行大批量的抽獎(jiǎng)?wù)埱螅糠执a如下:
#部分代碼timestamp =int(round((time.time()) * 1000))nonce = ''.join(random.sample('ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16))hash1=hashlib.md5((session3rd+str(timestamp)).encode('utf8')).hexdigest()sign=hashlib.md5((hash1+nonce).encode('utf8')).hexdigest()headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0','content-type': 'application/x-www-form-urlencoded','timestamp':str(timestamp),'nonce':nonce,'sign':sign,}r = requests.post(url,data=payload,headers=headers,verify=False,allow_redirects=False)
(5)從批量的抽獎(jiǎng)?wù)埱笾校@取優(yōu)惠券或?qū)嵨铼?jiǎng)品。

03、RSA簽名繞過
業(yè)務(wù)場(chǎng)景:在一些微信小程序游戲的場(chǎng)景里,用戶在游戲結(jié)束的時(shí)候,需要將游戲成績(jī)發(fā)送到后端,以此來記錄玩家的分?jǐn)?shù)。
因調(diào)用API時(shí)對(duì)請(qǐng)求參數(shù)進(jìn)行簽名驗(yàn)證,服務(wù)器會(huì)對(duì)該請(qǐng)求參數(shù)進(jìn)行驗(yàn)證是否合法,所以當(dāng)我們嘗試去篡改游戲成績(jī)的時(shí)候,就會(huì)提示簽名異常。那么,該如何破局呢?

(1)微信小程序反編譯解包
使用模擬器獲取微信小程序的.wxapkg包

使用反編譯腳本解包,獲取小程序前端源碼。

(2)逆向破解小程序參數(shù)簽名
將小程序的前端代碼復(fù)制到本地,Sign值比較長(zhǎng),盲猜RSA簽名算法,全局搜索關(guān)鍵字,因關(guān)鍵js代碼未作混淆加密,很容易就獲取到了RSA簽名算法和私鑰。

最常見的是根據(jù)參數(shù)名稱將所有請(qǐng)求參數(shù)按ASCII碼排序,而在這里我們很容易地就可以從前端代碼里獲取到參數(shù)順序。

(3)基于jsrsasign的rsa簽名驗(yàn)簽,嘗試篡改請(qǐng)求參數(shù),構(gòu)建簽名計(jì)算Sign值。
構(gòu)建http數(shù)據(jù)包,成功偽造簽名篡改游戲成績(jī)。


