筆者在N年前曾經參與一個第三方支付平臺的設計開發工作,這過程中研究了某個國內著名的第三方支付平臺,就是因為該平臺的設計者輕易
的相信外部傳入的數據,不進行校驗,導致被我發現了一個致命的漏洞,從而測試性的盜取了2分錢,這個事情一直到2個月后,該平臺通過
與網銀對賬才發現,由于不知道這個致命的漏洞是否已經修復,避免有惡意的人使用該方式去做違法的事情,我在這里只簡單描述該漏洞,
而不公開該支付平臺的真實身份。
該漏洞出現在充值業務上,實現邏輯請看下面的Sequence diagram:
描述一下流程:
1.客戶打開第三方支付平臺的充值頁面,選擇一個銀行,填入充值數據(充值虛擬賬戶、充值金額等),提交表單。
2.充值頁面把數據(包括充值數據,第三方支付平臺在該銀行注冊的商戶標識)使用銀行提供的加密工具進行加密,傳遞給指定銀行的網銀系統前臺。
3.網銀系統前臺產生一張轉賬訂單,并要求用戶輸入賬號、密碼,然后提交。
4.網銀系統后端校驗賬號和密碼,然后根據用戶賬號,充值金額,第三方支付平臺商戶標識,把金額從用戶賬號轉賬到第三方支付平臺賬號。
5.網銀系統把確認數據(充值虛擬賬戶、充值金額、充值結果、轉入商戶標識等)加密后重定向到第三方支付平臺結果頁面。
6.頁面把確認數據提交給后臺,并向客戶顯示充值成功。
7.第三方支付平臺后臺接收到確認數據,把虛擬金額充入虛擬賬戶,完成整個流程。
漏洞描述:
我們可以看到,用戶在第三方支付平臺充值頁面提交數據,和網銀向第三方支付平臺發送確認數據,都需要對數據進行非對稱加密,但在當
時,我發現某一銀行,竟然不提供發送充值數據時的加密工具,這意味著,選擇這家銀行,用戶必須以明文的格式提交充值數據,好了,這
下我可以嘗試進行man in the middle attack了,在我提交表單一刻,我把頁面的HTML腳本修改了,把提交時由第三方支付平臺指定的在所
選銀行注冊的商戶標識修改為另外一個商戶的標識(假設是我自己注冊的商戶),OK,這意味著我的充值金額從我的賬號轉到我修改后的注
冊商戶賬號,這時,該網銀把確認數據(注意,包括轉入商戶標識,這時的商戶標識是我修改后的標識)發送回第三方支付平臺,其實,如
果第三方支付平臺如果能進一步校驗確認數據中的注冊商戶標識,就能發現注冊商戶標識被惡意篡改,從而導致充值失敗,但該平臺的設計
人員卻假設之前的充值頁面已經自動填入了自己的注冊商戶標識,這里并不作校驗,從而導致這個致命的漏洞,錢沒有轉到自己的賬號上,
而自己卻把等額的虛擬資金充值到了第三方虛擬賬戶中。
特別聲明:本文內容純屬用于技術研討,任何人嘗試使用本文的信息實施非法行為而導致的任何損失和責任,本人概不負責。