書名: API安全技術與實戰作者名: 錢君生 楊明 韋巍編著本章字數: 1343字更新時間: 2021-07-08 11:51:12
3.2 PayPal委托授權漏洞
在漏洞賞金平臺上,高賞金的漏洞每年都有。2019年73月,國外漏洞賞金平臺HackerOne上報告了一個PayPal用戶API相關的漏洞。
3.2.1 委托授權漏洞基本信息
委托授權漏洞與用戶的委托授權場景相關,平臺截圖與漏洞描述如圖3-3所示。

●圖3-3 HackerOne平臺PayPal漏洞記錄
關于這個漏洞的細節,在這里帶領讀者一起近距離地分析看看。
漏洞類型:API1-失效的對象級授權。
漏洞難度:高。
報告日期:2019-7-30。
信息來源:https://hackerone.com/reports/415081。
漏洞發生在paypal.com站點,在PayPal的業務中,其賬號可分以下兩類。
■ 企業賬號(Business Account),也叫商業賬號,具有PayPal高級賬號的所有功能權限,主要面向企業管理用戶。
■ 子賬號(Secondary Account),也叫輔助賬號,主要是方便企業賬號管理下屬員工,方便設置不同的管理功能,比如只能查看余額、只能退款、只能提現等。
企業賬號通過委托授權子賬號來管理賬號上的資金,比如企業內的出納和會計,在PayPal平臺對應于不同的子賬號,具備不同權限和功能,出納可以轉賬和提現,會計可以查詢和稽核。反之,則無法操作。
3.2.2 委托授權漏洞利用過程
從上文的背景描述可以了解到,在PayPal的在線電子支付系統中,存在企業賬號A下可以設置子賬號A1的情況。在此案例中攻擊者通過對“查看子賬號”功能進行分析,得出URL為https://www.paypal.com/businessmanage/users/1657893467745278998的參數id值1657893467745278998表示子賬號所綁定的企業賬號。當用戶操作此子賬號查看操作時,產生了一個HTTP PUT請求,報文內容如下所示:


通過測試驗證,上述PUT請求中第一個id字段值,即1657893467745278998可以替換為任意隨機數值;第二個id字段值,即5994224506代表了其子賬號id號。
而這第二個id字段只是簡單的數值類型,其值是可以枚舉的,它的數值是可遞增或遞減的。攻擊者只需要篡改id值,比如修改為53994224507,再次訪問/businessmanage/users時,即可以查看到企業賬號下關聯的另一子賬號的信息。
因為權限控制存在設計缺陷,攻擊者只需按照上述操作方式,把相應子賬號的密碼進行修改,就可以實現完美的賬號接管,進行任意未授權的轉賬操作。
此漏洞上報后,PayPal官方及時地進行了修復,并給予賞金獵人了10500美元的獎勵。
3.2.3 委托授權漏洞啟示
現在再來回顧一下整個攻擊過程,如圖3-4所示。

●圖3-4 委托授權攻擊過程
從過程中可以看出,整個攻擊鏈上有關鍵性的兩步。
■ 子賬號id值的可枚舉,導致從當前企業賬號可以切換到被攻擊對象的企業賬號下的子賬號。
■ 權限的擴大,從查看被攻擊對象的企業賬號下的子賬號的功能,權限擴展到子賬號密碼修改功能。
在OWASP API安全Top 10中,這屬于典型的失效的對象級授權問題。作為系統開發者,除了要增強id值的隨機性(防止簡單的數字值被枚舉)外,在對象的權限訪問控制上,也要校驗企業賬號與子賬號的綁定關系,這種綁定關系的校驗,不僅是信息查看、賬號綁定之類的功能,還要包含密碼修改等相關操作。
對于此類場景下相關聯性的校驗和身份鑒別,在金融業務中非常常見。比如對于用戶身份的鑒別,當用戶在ATM機或網銀轉賬時,每次轉賬都需要重新輸入轉賬密碼,這就是一種保護性設計。而不像其他電子商務網站中的業務辦理,登錄后就不再需要輸入密碼。網銀的每一筆轉賬都需要密碼,是因為密碼的保管具有私密性,只有銀行賬號的所有者才知道密碼,每次驗證密碼的過程其實是對用戶身份的一次確認過程。比如在銀行系統中,同一個自然人賬號下會有多個銀行賬戶,比如借記卡賬戶、儲蓄卡賬戶,當某人在網銀自己給自己賬戶轉賬時,需要校驗自然人的身份是否一致,這也是使用關聯關系來驗證的一種保護性設計。