雷蛇支付(Razer Pay)在新加坡和馬來西亞被廣泛使用,在該篇Writeup中,作者透過APP逆向分析,利用Frida調試,發現了雷蛇支付電子錢包(Razer Pay Ewallet)中的用戶簽名(Signature)生成漏洞,由此可讀取雷蛇支付用戶的聊天記錄、刪除用戶綁定的銀行帳戶並竊取用戶個人敏感信息,漏洞最終獲得了雷蛇官方將近$6,000的獎勵。以下是作者的漏洞發現思路,僅當姿勢學習借鏡。
雷蛇(Razer Inc,RΛZΞR)是一家在新加坡創立的遊戲週邊設備公司,又被稱為“綠燈工廠”,近年來開始進軍電子消費業務。雷蛇的兩個總部分別設立在新加坡及美國聖地牙哥。 2017年11月在香港聯交所上市,產品面向遊戲玩家,其產品大多以肉食動物命名。 2018年推出電子皮夾Razer Pay。 2020年5月,開始生產外科口罩。
在雷蛇支付電子錢包(Razer Pay Ewallet)的請求防篡改機制中,除auth_token之外,還使用了參數signature對不同用戶的請求進行簽名驗證,每一個對服務端的GET和POST請求都會附帶一個經過編碼的signature參數值和用戶id,如下圖所示:
因此,試圖對任意請求參數的篡改重發都會無效,但經APK逆向分析發現,雷蛇支付電子錢包(Razer Pay Ewallet)存在用戶簽名(Signature)生成漏洞,結合Frida的分析利用可自動計算生成新的用戶簽名(Signature),由此可導致很多的越權(IDOR)問題。
我在使用Burp對雷蛇支付APP的網路請求進行抓包時發現,由於請求中用戶簽名(Signature)的保護,所以其中許多參數都是無法篡改的,因此,我第一時間想到了註冊另外一個雷蛇支付用戶來進行配合測試,但在兩個用戶的同一請求的場景下,經會話Payload的替換操作後,執行無效,原因還是出在有用戶簽名(Signature)的會話請求保護。
我決定切實分析一下使用者簽章(Signature)的產生機制,在apktool 和Jadx-Gui 的反編譯幫助下,我對其APP的運作有了程式碼層次的理解,發現其中存在一個名為「MD5Encode」的方法函數,從名字上就知道是用了MD5加密演算法。經過一些參數Payload的組合,我決定嘗試一下生成用戶簽名(Signature),但怎麼試也無法產生正確的用戶簽名,我猜想可能是參數次序錯誤,或者它是一種非常規的MD5加密。
不拋棄不放棄,我把其中涉及用戶簽名生成的所有相關代碼拷貝出來,然後用IDE調試工具IntelliJ IDEA進行嘗試生成,終於,在「MD5Encode」方法運用中,我組合對了正確的參數次序,不過由於有代碼混淆,還需要做一些微調,但還算不太難。最終,在先前產生的請求主體中,插入正確的參數值,用上述程式碼即能產生正確的使用者簽章(Signature)字串!
(小編分析,在以下多個用戶簽名的生成過程中,用到了用戶自己的token,其為參數之一,然後經MD5Encode方法,可以生成與多個用戶id對應的不同使用者簽名,也就是可以成功產生雷蛇服務端分配給多個使用者的各個使用者簽名Signature)
由此,我首先想到的就是測試越權漏洞(IDOR),我選擇了一個比較敏感的API介面/deleteBankAccount,也就是刪除使用者綁定的銀行帳戶操作,然後在兩個帳戶的測試場景下,竟然能成功刪除掉另一雷蛇支付(Razer Pay)用戶的綁定銀行帳戶!
到這步,我想肯定還有其它受Signature保護的API介面存在IDOR越權問題,於是我嘗試用上述方法去做了一波測試,但毫無發現。而且其它API介面使用了不同程式碼混淆方法,導致我花了很多時間去研究分析。沒有頭緒之時,那就用Frida來試試吧,Frida是一個非常好用的調試工具,我正好可以用它來識別一些可以hook利用的方法函數,結合上述的MD5Encode方法,找到正確的電子錢包程式碼包,同樣可以用這些方法函數產生新的正確的使用者簽章Signature。
如以下frida.js程式碼實現的功能是為目前使用者產生的新的使用者簽名,以加入其他使用者建立的聊天群組:
<br>
<code>// frida. js - Use this for recalculating signature for adding user to other people's chatgroup
<code>console.log("Starting...")
<code>#Java.perform(function () {
<code>#var MD5 = Java.use('com.mol.molwallet .view.MD5')
<code>MD5.MD5Encode.implementation = function (arg)
<code>{
<code>console.log("Hooking class MD5 - method MD5Encode")
<code>//Extra step - calculate new signature
<code>var ret_value = this.MD5Encode("groupId=1x9&userIds=95xxx7&token=b6fxxxd3-2xxc-4xxf-bxx7-4xxf-bxx7-4xxf 7fxxxxa6")
<code>console.log("[ ] signature= " ret_value)
<code> #//Call method with original arguments so app doesn't crash ..
<code>var ret_value = this.MD5Encode(arg) //original value
<code>#console.log("original ARG: " arg)
##return ret_value;<code>
}<code>
#})<code>
<br>
$ adb shell
# sudo su
# /data/local/tmp/frida-server
$ frida -l frida.js -U com.mol.molwallet
以上是如何進行電子錢包APP漏洞分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!