溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

發(fā)布時間:2021-12-02 09:54:44 來源:億速云 閱讀:242 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

數(shù)據(jù)庫訪問控制

規(guī)則描述

數(shù)據(jù)庫訪問控制是指程序未進行恰當?shù)脑L問控制,執(zhí)行了一個包含用戶控制主鍵的SQL語句,由于服務器端對客戶提出的數(shù)據(jù)操作請求過分信任,忽略了對該用戶操作權(quán)限的判定,導致修改相關(guān)參數(shù)就可以擁有了其他賬戶的增、刪、查、改功能。如果在一個應用中,用戶能夠訪問他本身無權(quán)訪問的功能或者資源,就說明該應用存在訪問控制缺陷,也就存在越權(quán)漏洞。

漏洞危害

數(shù)據(jù)庫訪問控制是利用用戶引入的參數(shù)生成由用戶控制主鍵的 SQL 語句,令攻擊者可以訪問到同級別用戶的資源或者訪問更高級別用戶的資源,會導致任意用戶敏感信息泄露、用戶信息被惡意修改或刪除。數(shù)據(jù)庫訪問控制類似于數(shù)據(jù)庫越權(quán)。例如某一頁面服務器端響應中返回登錄名、登錄密碼、手機號、身份證等敏感信息,如果存在數(shù)據(jù)庫訪問控制,通過對用戶 ID 的遍歷,就可以查看所有用戶的敏感信息,這也是一種變相的脫庫,而且很難被防火墻發(fā)現(xiàn),因為這和正常的訪問請求沒有什么區(qū)別,也不會包含特殊字符,具有十足的隱秘性。

整改方案

缺陷代碼

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

上述示例代碼31-56行,程序獲取用戶輸入的參數(shù) id,并將傳入?yún)?shù)轉(zhuǎn)成 int 類型,然后創(chuàng)建數(shù)據(jù)庫查詢,查詢 uid 為傳入?yún)?shù) id 的清單數(shù)據(jù)。顯然,程序中未對傳入?yún)?shù)做校驗及過濾,用戶可隨意獲得任何用戶的清單數(shù)據(jù)。

從跟蹤路徑中可以分析出數(shù)據(jù)的污染源以及數(shù)據(jù)流向,在代碼行第53行報出缺陷。

修復代碼:

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

在上述修復代碼中,在第34行從  session 中直接獲取到 id 的值構(gòu)造查詢語句,獲得當前用戶的清單數(shù)據(jù),避免用戶操控SQL語句的主鍵值。

  1. 補充完整的解決方案:

發(fā)生構(gòu)成該漏洞的兩個必要條件:

1、來自用戶或前端參數(shù)參與了后臺操作數(shù)據(jù)庫語句(數(shù)據(jù)從一個不可信賴的數(shù)據(jù)源進入程序)。

2、該參數(shù)做數(shù)據(jù)庫表主鍵使用(這個數(shù)據(jù)用來指定 SQL 查詢中主鍵的值。)

三種解決方案:

  1. 可不使用來自用戶或前端參數(shù)做相關(guān)SQL操作(例:讀取session里值構(gòu)建SQL(一般通過session取用戶id構(gòu)建用戶清單,但如果產(chǎn)生漏洞的id不為用戶id,例:orgid,roleId,店鋪id取機構(gòu)、店鋪信息時,則也需要保證該主鍵來自可信賴的數(shù)據(jù)源:后端或數(shù)據(jù)庫等地方))

  2. 該參數(shù)不做SQL相關(guān)操作的主鍵使用。(使用一個與主鍵不一致的副id做相關(guān)操作)

例:圖1的查詢SQL語句

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

圖1

在圖2中查詢的org_id并未做主鍵id,而是作為的副id使用

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

圖2

且在圖3中核對該主副id不一致

數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的

圖3

3、參照fortify官方解決方式。

附加了一個限制,以驗證清單是否屬于當前經(jīng)過身份驗證的用戶。

...

userName = ctx.getAuthenticatedUserName();

id = Integer.decode(request.getParameter("invoiceID"));

String query =

        "SELECT * FROM invoices WHERE id = ? AND user = ?";

PreparedStatement stmt = conn.prepareStatement(query);

stmt.setInt(1, id);

stmt.setString(2, userName);

ResultSet results = stmt.execute();

...

如上示例代碼:加入一個用戶名(不推薦使用用戶id)的查詢限制,匹配用戶對該條查詢是否有所有權(quán)。

上述三種解決方案:

方案1-->限制了構(gòu)成漏洞的條件1;

方案2-->限制了構(gòu)成漏洞的條件2;

方案3-->限制了操作越權(quán)的可能。

上述就是小編為大家分享的數(shù)據(jù)庫訪問控制的解析及解決方案是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI