Appearance
水平權限提升
什麼是水平權限提升
水平權限提升(Horizontal Privilege Escalation)是一種常見的網頁應用程式安全漏洞,它允許一個使用者獲得對屬於其他使用者的資源的存取權。與垂直權限提升不同,水平權限提升並不涉及獲得更高級別的權限,而是涉及繞過相同權限級別內的隔離。
在多使用者的系統中,每個使用者通常都有自己的資源集,如個人檔案、訊息、訂單歷史等。這些資源應該是與其他使用者隔離的,也就是說,一個使用者應該只能存取屬於自己的資源,而不能存取其他使用者的資源。水平權限提升發生在當這種隔離被打破時,一個使用者設法存取到了原本不屬於他的資源。
水平權限提升可能發生在各種情況下,以下是一些常見的原因:
不正確的存取控制:應用程式在驗證使用者對資源的存取權時存在缺陷。例如,使用者 A 請求查看自己的個人資料,應用程式正確地驗證了 A 的身分,但在返回資料時,卻錯誤地返回了使用者 B 的個人資料。
不安全的直接物件參考:類似於垂直權限提升,如果應用程式使用使用者提供的輸入來直接存取資源,而沒有適當的驗證,就可能導致水平權限提升。例如,使用者 A 訪問自己的訂單詳情頁面,URL 是
/orders/details?order_id=123。如果使用者 A 將order_id改為 456,就可能看到使用者 B 的訂單詳情。不安全的 Session 管理:如果應用程式的 Session 管理存在漏洞,如 Session ID 可預測或 Session 資料可篡改,攻擊者就可能劫持其他使用者的 Session,從而獲得對他們資源的存取權。
資料隔離不完善:在資料層面,如果應用程式沒有正確地隔離不同使用者的資料,一個使用者的查詢就可能返回其他使用者的資料。例如,使用者 A 請求查看自己的訊息,但由於資料庫查詢語句中沒有加入使用者 ID 的條件,查詢返回了所有使用者的訊息。
用戶端驗證不足:有些應用程式將存取控制的邏輯放在用戶端,如隱藏的表單欄位、客戶端 Script 等。但這些都是可以被使用者手動修改的。如果應用程式僅依賴用戶端的驗證,而沒有在伺服器端進行二次驗證,就很容易被繞過。
如何防止水平權限提升?
水平權限提升的影響可以很嚴重,取決於被非法存取的資源的敏感性。在有些情況下,它可能導致使用者隱私的洩露,如個人資料、財務資料、醫療記錄等。在其他情況下,它可能導致使用者的操作被篡改,如一個使用者可以以另一個使用者的名義發送訊息、進行交易等。
為了防止水平權限提升,應用程式開發者需要遵循以下安全最佳實踐:
總是在伺服器端進行存取控制的驗證,不要依賴用戶端的驗證。
使用間接的物件參考,如使用由伺服器生成的隨機 ID,而不是使用者提供的 ID。
實施嚴格的 Session 管理,使用隨機、唯一的 Session ID,並在使用者登出或閒置時銷毀 Session。
在資料層面實施嚴格的隔離,如在所有的資料庫查詢中加入使用者 ID 的條件。
對所有的使用者輸入進行驗證和過濾,防止 SQL 注入、XSS 等攻擊。
總之,水平權限提升是一種常見但危險的安全漏洞,它可能導致使用者隱私的洩露和非法操作。開發者需要在應用程式的設計和實作中始終考慮資料隔離和存取控制,並遵循安全的編碼實踐,才能有效地防範這種威脅。
一個水平權限提升的案例
水平權限提升攻擊可能使用與垂直權限提升類似的攻擊方法。例如,使用者可能使用以下網址存取他們自己的帳戶頁面:
https://insecure-website.com/myaccount?id=123如果攻擊者將 id 參數的值修改為另一個使用者的值,他們可能就能存取該使用者的帳戶頁面,以及相關的資料和功能。
TIP
這是一個不安全的直接物件引用(IDOR)漏洞的例子。這種類型的漏洞出現在由使用者控制的參數值被直接用於存取資源或功能的情況下。