柳市做網站接推廣怎么收費
iOS內購欺詐漏洞
- 1.iOS內購欺詐漏洞概述
- 2.偽造的憑證
- 3.漏洞修復方案
1.iOS內購欺詐漏洞概述
黑產別的App上低價充值(比如1元)換取蘋果真實憑證,再在目標App上下單高價(648元)商品,傳入該憑證,如果目標App服務端蘋果憑證校驗接口存在漏洞,只校驗了憑證中商品和訂單信息,未校驗憑證中App來源(bundleID),則會驗證通過,進而發(fā)貨
對黑產來說,黑產實際只支付了1元,就能買到目標App的648元商品;對于目標App來說,他連這1元都沒得到(因為是在別的App上充的),完全被白嫖648元商品??芍^傷害極大
還原盜刷步驟:
- 黑產通過破解(比如抓網絡請求)目標App客戶端,獲得648元商品的蘋果商品id(product_id)值。
- 黑產自己上架一款App,在蘋果后臺添加一款1元的內購商品,設置蘋果商品id(product_id)值和目標App一致。
- 黑產在自己的App里真實付款1元商品,拿到蘋果返回的真實憑據(jù)(receipt)和蘋果交易id(transaction_id)。
- 黑產破解目標App客戶端后,直接調目標App的蘋果憑證校驗接口,把上面獲得的憑據(jù)(receipt)和蘋果交易id(transaction_id)作為參數(shù)傳進去。
- 目標App服務端拿著憑據(jù)去蘋果后臺校驗,由于憑據(jù)是真實的,蘋果驗證通過。目標App服務端解析憑證,校驗憑證內參數(shù),核對product_id正確、核對transaction_id唯一性通過,全部校驗通過,發(fā)貨。
漏洞的主要原因:
- 蘋果后臺,蘋果商品id(不同開發(fā)者賬號下)可以重復;
- 目標App服務端憑證校驗接口,未校驗憑證中App來源(bundleID)。
2.偽造的憑證
下面是被攻擊App服務端提供的一段日志,記錄了“偽造的”憑證樣式
- 最外層的bundle_id,并不是目標App的包名,而是一個不認識的App包名。這個就是黑產真實充值的App。
- in_app數(shù)組里面product_id,卻是目標App里有效的蘋果商品id,正是648元商品的product_id。
- 再看transaction_id。這里的transaction_id實際上是黑產App內充值產生的,并不是目標App內產生的。因為transaction_id只有在蘋果內購付款成功后才會生成,且只能由客戶端傳給服務端,所以服務端是沒法校驗transaction_id是否來源于自己的App。服務端能做的就是判斷transaction_id是否重復,防止重放攻擊。因為黑產每次充值都會真實的充一筆,所以transaction_id并不會重復,這也是目標App服務器驗證transaction_id通過的原因。
{"receipt_type": "Production","adam_id": 6441231333,"app_item_id": 6441231333,"bundle_id": "com.apps.slanCaizhuang", //這并不是目標App的bundleID,而是黑產自己的的App"application_version": "3","download_id": 502222222222222222,"version_external_identifier": 855304439,"receipt_creation_date": "2023-04-12 16:59:25 Etc/GMT","receipt_creation_date_ms": "1681318765000","receipt_creation_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","request_date": "2023-04-12 17:16:54 Etc/GMT","request_date_ms": "1681319814498","request_date_pst": "2023-04-12 10:16:54 America/Los_Angeles","original_purchase_date": "2023-03-11 05:00:05 Etc/GMT","original_purchase_date_ms": "1678510805000","original_purchase_date_pst": "2023-03-10 21:00:05 America/Los_Angeles","original_application_version": "3","in_app": [{"quantity": "1","product_id": "com.xiaomi.haha123", //這里卻是目標App的product_id"transaction_id": "210000000000000",//黑產自己App上支付產生的transaction_id"original_transaction_id": "210000000000000","purchase_date": "2023-04-12 16:59:25 Etc/GMT","purchase_date_ms": "1681318765000","purchase_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","original_purchase_date": "2023-04-12 16:59:25 Etc/GMT","original_purchase_date_ms": "1681318765000","original_purchase_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","is_trial_period": "false","in_app_ownership_type": "PURCHASED"}],"environment": "Production","status": 0
}
3.漏洞修復方案
1、服務端憑證校驗時,加上bundleID的校驗即可
即服務端去蘋果那邊校驗通過后,還需核對憑證內以下參數(shù):
- bundle_id,是否為你們自己的App(防止跨App充值);
- product_id,是否為下單時對應的商品id(防止App內部以小博大);
- transaction_id,是否已經發(fā)過貨(防止重放攻擊)
2、共享密鑰(推薦)
服務端請求蘋果憑證校驗接口時,除了傳receipt-data字段,再額外傳一個password參數(shù)(蘋果后臺生成的共享密鑰)。這樣蘋果那邊核對憑證時,除了驗證憑證是否有效,還會核對憑證和密鑰是否匹配。如果不匹配蘋果會返回錯誤信息
官方文檔地址:https://developer.apple.com/documentation/appstorereceipts/requestbody?language=objc