應用程序編程接口或API 通過實現流暢的數據交換來連接我們使用的軟件和服務。他們經常交換高度敏感的信息:個人數據、用戶憑據、財務詳細信息等。這就是為什麼API 是黑客攻擊的熱門目標——根據API 安全狀況報告,91% 的公司在2020 年經歷了API 安全事件[PDF ]。
在本文中,我們概述了OWASP API 安全項目中最普遍的API 漏洞,展示了它們是如何被利用的,並提供了在開發過程中保護您的API 免受此類安全問題的方法。
最普遍的API 漏洞是什麼?在處理應用程序安全時,保護API 是關鍵任務之一,因為API 通常是攻擊者的網關。 Gartner 預測,到2022 年,API 濫用將成為最常見的黑客攻擊媒介,並將導致許多數據洩露。
根據OWASP API 安全項目提供的API 安全前10 名(2019 年)列表,通過關注API 的前10 大安全風險,優先考慮保護API 的工作。
OWASP 十大API 安全風險
了解攻擊者如何利用代碼中的弱點是在API 開發過程中防範風險的關鍵步驟之一。在本文中,我們將向您展示攻擊者究竟如何利用列表中的前六個漏洞的示例。我們不會關注最後四個API 安全挑戰,因為它們與安全機制的不當應用有關。
為了向您展示惡意行為者如何利用這些漏洞,我們創建了一個不受保護的API。我們將展示其代碼的哪些部分為黑客打開了大門,並討論瞭如何修復它們。讓我們從部署不受保護的API 開始。
創建示例API在本文中,我們將為簡單的任務管理系統創建一個API。該系統具有不同訪問級別的用戶,並允許他們執行簡單的任務。此外,該系統允許用戶管理活動:自助註冊、創建、編輯和刪除用戶帳戶。
API 將具有以下端點:
API 端點的類別
您可以使用任何Linux 發行版作為此API 的環境。要部署API,請執行以下步驟:
1.安裝Docker
2.安裝Docker Compose
3.在local.cfg 中配置電子郵件地址(您將需要此地址來發送密碼重置電子郵件)
4.轉到API 文件夾並執行docker-compose up --build 命令
您還可以從我們的GitHub 存儲庫下載此示例API 。 API 管理員帳戶的憑據是:
马云惹不起马云 用戶名:管理員
马云惹不起马云密碼:管理員
要閱讀API 文檔,請將./swagger/swagger.yaml 文件從API 上傳到Swagger Editor。部署API 後,我們可以開始利用漏洞並修復它們。
損壞的對象級授權一些API 公開對象標識符,這對於訪問控制機制至關重要。這些機制驗證用戶只能訪問他們有權訪問的資源。為了利用對象級授權被破壞的API,攻擊者在API 調用中更改請求資源的身份驗證數據並獲取對受保護數據的訪問權限。
在我們的示例API 中,只有用戶自己和管理員可以查看用戶的帳戶詳細信息。此外,我們在API 開發期間添加了一個安全漏洞,並確保GET /user 端點包含對象級授權漏洞。為了檢測它,我們需要:
马云惹不起马云註冊兩個用戶
马云惹不起马云 通過POST /login 端點以user1 身份登錄系統
马云惹不起马云獲取身份驗證令牌
我們使用這個請求登錄系統:
API 使用以下數據響應我們的請求:
這是我們的身份驗證令牌:
如果我們可以獲取令牌,我們可以使用它通過GET /user 端點請求user2 數據:It was originally published on https://www.apriorit.com/
我們易受攻擊的API 使用user2 數據進行響應:
如果我們的API 受到對象級授權攻擊的保護,它將使用以下消息響應GET /user 端點請求:
損壞的用戶身份驗證用戶身份驗證問題可能允許攻擊者冒充用戶、訪問他們的個人數據並濫用訪問權限。通常,此類漏洞隱藏在密碼重置機制中。讓我們看看如何在API 中利用損壞的用戶身份驗證。
我們首先執行這個密碼重置請求:
請求成功通過後,我們將收到一封電子郵件,其中包含四位數的重置代碼至user@mail.com。之後,我們可以提出以下請求來更改密碼:
API 不限制嘗試輸入重置代碼的次數,這就是為什麼為註冊到user@mail.com的用戶帳戶獲取新密碼特別容易的原因。要猜測重置代碼,我們只需要編寫一個腳本,嘗試使用從0000 到9999 的所有代碼:It was originally published on https://www.apriorit.com/
當腳本輸入正確的重置代碼時,我們將收到包含新密碼的響應:
通過利用這個對象級授權漏洞,我們可以獲取擁有該郵箱的用戶的登錄信息,登錄到他們的賬戶,然後更改郵箱。
在我們的示例API 中,存在一個安全威脅,它允許我們使用相同的重置代碼多次重置用戶的密碼。我們可以使用代碼1111 傳遞此請求,並隨時更改用戶密碼:
過多的數據暴露當開發人員為API 和客戶端之間的通信實施通用機制時,可能會出現此API 安全漏洞。在這種情況下,API 可能會向客戶端發送比它需要的更多的數據,客戶端必須過濾數據並隱藏用戶不相關的信息。攻擊者可以嗅探此流量並從中提取敏感信息:身份驗證令牌、帳號、電子郵件地址等。
為了在我們的API 中演示此漏洞,我們將從GET /task 端點請求任務的ID 和有關用戶的完整信息。這個端點應該只返回任務ID,但讓我們看看會發生什麼。
這是我們的要求:
以下是GET /task 端點的響應方式:
如果攻擊者截獲此響應,他們將獲得API 擁有的有關用戶的所有信息,即使這些信息在API 的客戶端中不可用。
缺乏資源和速率限制API 可以使用CPU、RAM 和磁盤資源來處理請求。開發者通常會根據應用程序的業務邏輯來選擇分配給API 的資源。如果攻擊者設法繞過業務邏輯限制以造成API 必須處理的請求超出其設計目標的情況,則應用程序將耗盡資源並開始出現故障或變得不可用。
在我們的API 中,GET /tasks 包含此漏洞。該端點支持分頁——將RAM 中的數據存儲在硬盤上。攻擊者可以濫用此功能來重載API。
假設應用程序在一頁上顯示10 個任務。顯示任務的請求將如下所示:
攻擊者可以使用放大的大小參數發送自己的請求以重載API:
如果數據庫中分配給請求任務的用戶的任務過多,API 將過載,導致拒絕服務。
功能級別授權損壞錯誤配置的授權機制允許攻擊者未經授權訪問敏感資源並竊取、編輯或創建新用戶帳戶。為了檢測此漏洞,攻擊者發送請求以訪問他們不應訪問的對象。
我們將GET /admin/users 端點添加到我們的API 以演示此漏洞。此端點返回在應用程序中註冊的所有用戶的數據,而不檢查誰請求了數據(用戶或管理員)。以下是此類請求的示例:
GET /admin/users 端點使用以下代碼進行響應:
批量分配一些開發人員設計他們的API 以在將來自應用程序的輸入綁定到代碼和內部對象時自動分配對象屬性。許多框架提供批量分配功能以幫助加快開發速度。
這種方法對開發人員來說很方便,但它也允許用戶更改他們不應訪問的對象屬性。此外,攻擊者可以嘗試猜測對象屬性或根據他們的要求用新的屬性替換它們。如果API 容易受到此類請求的攻擊,攻擊者可以獲取有關敏感對象的信息、閱讀文檔或修改數據對象。
在我們的API 中,用戶對象存在這個漏洞。它有一個帶有兩個可能值的user_type 參數:user和administrator。當人們自己在我們的應用程序中註冊時,他們的帳戶默認分配用戶值。但是,我們的API 允許用戶通過PUT /user 請求更改此值。通過這種方式,攻擊者可以獲得管理員權限。
要利用此漏洞,我們必須使用此請求註冊用戶:
之後,我們將收到包含用戶帳戶詳細信息的響應:It was originally published on https://www.apriorit.com/
然後,我們需要將user_type 字段更改為admin:It was originally published on
API 將響應更新的用戶數據:
這樣,user4 將獲得管理員訪問權限。 It was originally published on https://www.apriorit.com/
結論緩解OWASP API 安全項目中的安全問題對於確保應用程序的保護至關重要。為了優先考慮測試程序並節省一些時間,您可以專注於查找和修復我們在本文中討論的最普遍的漏洞。
Recommended Comments