什么是訪問控制?
訪問控制(或授權)是對誰(或什么)可以執行已嘗試的操作或訪問他們請求的資源的限制的應用。
在 Web 應用程序的上下文中,訪問控制依賴於身份驗證和會話管理:
- 身份驗證識別用戶並確認他們就是他們所說的人。
- 會話管理識別同一用戶正在發出哪些后續 HTTP 請求。
訪問控制確定是否允許用戶執行他們試圖執行的操作。 損壞的訪問控制是一個常見且通常是嚴重的安全漏洞。訪問控制的設計和管理是一個復雜且動態的問題,它將業務、組織和法律約束應用於技術實現。訪問控制設計決策必須由人類而非技術做出,並且出錯的可能性很高。
從用戶的角度來看,訪問控制可以分為以下幾類:
- 垂直訪問控制
- 水平訪問控制
- 上下文相關的訪問控制
垂直訪問控制
垂直訪問控制是限制對其他類型用戶不可用的敏感功能的訪問的機制。
通過垂直訪問控制,不同類型的用戶可以訪問不同的應用程序功能。例如,管理員可能能夠修改或刪除任何用戶的帳戶,而普通用戶無權訪問這些操作。
垂直訪問控制可以是安全模型的更細粒度的實現,旨在強制執行業務策略,例如職責分離和最小權限。
水平訪問控制
水平訪問控制是將資源訪問權限限制為明確允許訪問這些資源的用戶的機制。
通過水平訪問控制,不同的用戶可以訪問同一類型資源的子集。例如,銀行應用程序將允許用戶查看交易並從他們自己的賬戶進行支付,但不允許任何其他用戶的賬戶。
上下文相關的訪問控制
上下文相關的訪問控制根據應用程序的狀態或用戶與其交互來限制對功能和資源的訪問。
上下文相關的訪問控制可防止用戶以錯誤的順序執行操作。例如,零售網站可能會阻止用戶在付款后修改其購物車的內容。
損壞的訪問控制示例
當用戶實際上可以訪問某些資源或執行他們不應該訪問的某些操作時,就會存在破壞的訪問控制漏洞。
垂直提權
如果用戶可以訪問他們不被允許訪問的功能,那么這就是垂直權限提升。
例如,如果非管理用戶實際上可以訪問他們可以刪除用戶帳戶的管理頁面,那么這就是垂直權限提升。
未受保護的功能
在最基本的情況下,垂直特權升級出現在應用程序不對敏感功能實施任何保護的情況下。例如,管理功能可能是從管理員的歡迎頁面鏈接的,而不是從用戶的歡迎頁面鏈接的。但是,用戶可以通過直接瀏覽到相關的管理 URL 來訪問管理功能。
例如,網站可能在以下 URL 托管敏感功能:
https://insecure-website.com/admin
這實際上可由任何用戶訪問,而不僅僅是在其用戶界面中具有指向該功能的鏈接的管理用戶。在某些情況下,管理 URL 可能會在其他位置公開,例如robots.txt文件:
https://insecure-website.com/robots.txt
即使 URL 未在任何地方公開,攻擊者也可以使用詞表來暴力破解敏感功能的位置。
在某些情況下,敏感功能沒有得到強有力的保護,而是通過給它一個不太可預測的 URL 來隱藏:所謂的默默無聞的安全。僅僅隱藏敏感功能並不能提供有效的訪問控制,因為用戶仍然可能以各種方式發現混淆的 URL。
例如,考慮在以下 URL 托管管理功能的應用程序:
https://insecure-website.com/administrator-panel-yb556
這可能無法被攻擊者直接猜測。但是,應用程序可能仍會將 URL 泄露給用戶。例如,URL 可能會在 JavaScript 中公開,它根據用戶的角色構建用戶界面:
<script>
var isAdmin = false;
if (isAdmin) {
...
var adminPanelTag = document.createElement('a');
adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
adminPanelTag.innerText = 'Admin panel';
...
}
</script>
如果用戶是管理員用戶,此腳本會添加指向用戶 UI 的鏈接。但是,包含 URL 的腳本對所有用戶都是可見的,無論其角色如何。
基於參數的訪問控制方法
一些應用程序在登錄時確定用戶的訪問權限或角色,然后將此信息存儲在用戶可控制的位置,例如隱藏字段、cookie 或預設的查詢字符串參數。應用程序根據提交的值做出后續的訪問控制決策。例如:
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
這種方法從根本上來說是不安全的,因為用戶可以簡單地修改值並獲得對他們未授權的功能(例如管理功能)的訪問權限。
平台配置錯誤導致訪問控制中斷
某些應用程序通過基於用戶角色限制對特定 URL 和 HTTP 方法的訪問來強制執行平台層的訪問控制。例如,應用程序可能會配置如下規則:
DENY: POST, /admin/deleteUser, managers
對於 manager 組中的用戶, 此規則拒絕訪問POSTURL 上的方法/admin/deleteUser。在這種情況下,各種事情可能會出錯,從而導致訪問控制繞過。
一些應用程序框架支持各種非標准的 HTTP 標頭,這些標頭可用於覆蓋原始請求中的 URL,例如X-Original-URL和X-Rewrite-URL。如果網站使用嚴格的前端控制來限制基於 URL 的訪問,但應用程序允許通過請求標頭覆蓋 URL,則可能可以使用如下請求繞過訪問控制:
POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...
與請求中使用的 HTTP 方法相關的替代攻擊可能會出現。上述前端控件根據 URL 和 HTTP 方法限制訪問。某些網站在執行操作時可以容忍其他 HTTP 請求方法。如果攻擊者可以使用GET(或其他)方法對受限 URL 執行操作,則他們可以繞過在平台層實現的訪問控制。
橫向提權
當用戶能夠訪問屬於另一個用戶的資源而不是他們自己的那種類型的資源時,就會出現水平權限提升。例如,如果一個員工應該只能訪問自己的就業和工資記錄,但實際上也可以訪問其他員工的記錄,那么這就是橫向提權。
橫向提權攻擊可能使用與縱向提權類似的漏洞利用方法。例如,用戶通常可能使用如下所示的 URL 訪問他們自己的帳戶頁面:
https://insecure-website.com/myaccount?id=123
現在,如果攻擊者將id參數值修改為另一個用戶的參數值,那么攻擊者可能會訪問另一個用戶的帳戶頁面,以及相關的數據和功能。
在某些應用中,可利用參數沒有可預測的值。例如,應用程序可能會使用全局唯一標識符 (GUID) 來標識用戶,而不是使用遞增的數字。在這里,攻擊者可能無法猜測或預測另一個用戶的標識符。但是,屬於其他用戶的 GUID 可能會在引用用戶的應用程序中的其他地方公開,例如用戶消息或評論。
在某些情況下,應用程序會檢測何時不允許用戶訪問資源,並返回到登錄頁面的重定向。但是,包含重定向的響應可能仍然包含一些屬於目標用戶的敏感數據,因此攻擊仍然成功。
橫向到縱向提權
通常,通過危害更高特權的用戶,橫向提權攻擊可以轉變為縱向提權。例如,橫向升級可能允許攻擊者重置或捕獲屬於另一個用戶的密碼。如果攻擊者以管理用戶為目標並破壞其帳戶,則他們可以獲得管理訪問權限,從而執行垂直權限提升。
例如,攻擊者可能能夠使用已經描述的用於水平提權的參數篡改技術來訪問另一個用戶的帳戶頁面:
https://insecure-website.com/myaccount?id=456
如果目標用戶是應用程序管理員,則攻擊者將獲得對管理帳戶頁面的訪問權限。此頁面可能會泄露管理員密碼或提供更改密碼的方法,或者可能提供對特權功能的直接訪問。
不安全的直接對象引用
不安全的直接對象引用 (IDOR) 是訪問控制漏洞的一個子類別。當應用程序使用用戶提供的輸入直接訪問對象並且攻擊者可以修改輸入以獲得未經授權的訪問時,就會出現 IDOR。它因出現在 OWASP 2007 前十名而廣受歡迎,盡管它只是許多可能導致訪問控制被規避的實施錯誤的一個例子。
多步驟流程中的訪問控制漏洞
許多網站通過一系列步驟實現重要功能。當需要捕獲各種輸入或選項時,或者當用戶需要在執行操作之前查看和確認詳細信息時,通常會執行此操作。例如,更新用戶詳細信息的管理功能可能涉及以下步驟:
加載包含特定用戶詳細信息的表單。
提交更改。
查看更改並確認。
有時,網站會對其中一些步驟實施嚴格的訪問控制,但忽略其他步驟。例如,假設訪問控制正確應用於第一步和第二步,但沒有應用於第三步。實際上,該網站假定用戶只有在已經完成正確控制的第一步后才會到達第 3 步。在這里,攻擊者可以通過跳過前兩步並直接提交帶有所需參數的第三步請求來未經授權訪問該函數。
基於Referer的訪問控制
一些網站基於RefererHTTP 請求中提交的標頭進行訪問控制。的Referer報頭由瀏覽器一般加入請求,以指示從其中請求被發起的網頁。
例如,假設一個應用程序在 處對主管理頁面嚴格執行訪問控制/admin,但對於子頁面(例如/admin/deleteUser僅檢查Referer標題)。如果Referer標頭包含主/adminURL,則允許請求。
在這種情況下,由於Referer攻擊者可以完全控制標頭,因此他們可以偽造對敏感子頁面的直接請求,提供所需的Referer標頭,從而獲得未經授權的訪問。
基於位置的訪問控制
一些網站根據用戶的地理位置對資源實施訪問控制。例如,這可以適用於適用州立法或業務限制的銀行應用程序或媒體服務。這些訪問控制通常可以通過使用網絡代理、VPN 或操縱客戶端地理定位機制來規避。
如何防止訪問控制漏洞
通常可以通過采用深度防御方法並應用以下原則來防止訪問控制漏洞:
永遠不要僅僅依靠混淆來進行訪問控制。
除非資源旨在公開訪問,否則默認拒絕訪問。
在可能的情況下,使用單一的應用程序范圍的機制來實施訪問控制。
在代碼層面,強制要求開發者聲明每個資源允許的訪問權限,默認拒絕訪問。
徹底審核和測試訪問控制,以確保它們按設計工作。