溫馨提示×

溫馨提示×

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

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

數(shù)據(jù)庫安全知識介紹

發(fā)布時間:2020-08-19 06:56:21 來源:ITPUB博客 閱讀:162 作者:數(shù)據(jù)庫安全專家 欄目:數(shù)據(jù)庫

數(shù)據(jù)庫系統(tǒng)是在操作系統(tǒng)平臺之上的最重要的系統(tǒng)軟件,數(shù)據(jù)庫系統(tǒng)的安全可以說是十分重要的。曾經(jīng)有句話這樣說:如果網(wǎng)絡遍地是金錢,那么金錢就在數(shù)據(jù)庫服務器中。隨著無紙化業(yè)務環(huán)境的不斷擴大,人們在數(shù)據(jù)庫中存儲著越來越多的敏感信息:銀行賬戶、醫(yī)療記錄、政府文件、軍事機密等等,數(shù)據(jù)庫系統(tǒng)就成為越來越有價值的攻擊目標,因此確保數(shù)據(jù)庫系統(tǒng)的安全也越來越重要。

  作為一種大型的系統(tǒng)軟件,數(shù)據(jù)庫系統(tǒng)中也存在著各種各樣的安全漏洞,其中危害性較大的有緩沖區(qū)溢出、堆溢出和SQL注入等。

  1.緩沖區(qū)溢出

  緩沖區(qū)溢出是一種很常見也很古老的安全漏洞。早在上個世紀80年代,緩沖區(qū)溢出就已經(jīng)為人所知,但時至今日,大量的緩沖區(qū)溢出漏洞仍被發(fā)現(xiàn)。最著名的Morris蠕蟲就是利用Unix系統(tǒng)上fingerd程序的緩沖區(qū)溢出漏洞。在Oracle 9i發(fā)布之初,Oarcle公司曾宣稱他的數(shù)據(jù)庫是“ unbreakable ”的,但不到幾個月的時間,就暴出Oracle 9i中oracle.exe、XDB等程序存在多個緩沖區(qū)溢出漏洞。

  在C語言中最常見的緩沖區(qū)就是字符數(shù)組,而操縱字符數(shù)組的函數(shù)有gets、strcpy、sprintf等。這些函數(shù)在執(zhí)行字符串拷貝的過程中沒有對字符串進行長度檢查,這樣就很容易發(fā)生超長的字符串溢出緩沖區(qū)的情況。當初這樣設計是出于效率的考慮,但現(xiàn)在看來,這些函數(shù)的使用已成為C語言軟件脆弱的一個重要因素。如果程序員沒有良好的編程習慣,時刻注意函數(shù)調(diào)用過程中是否拷貝了超過緩沖區(qū)長度的字符串,那么緩沖區(qū)溢出就不可避免。對于一個有緩沖區(qū)溢出漏洞的程序,當普通用戶輸入超長字符串時,通常只會使該程序崩潰。例如對于下面一小段代碼:

  以下是引用片段:

  

        /* vulprog */

  #include

  int main(int argc , char * argv[])

  {

  char buff[8];

  strcpy(buff, argv[1]);

  }

  如果用戶執(zhí)行 ./vulprog AAAAAAAAAAAAAAAA,在Linux上會出現(xiàn)段錯誤,因為用戶輸入了超長的字符串,除了填滿了緩沖區(qū),還覆蓋了其他一些程序正常退出所需要的數(shù)據(jù)。為了研究這個問題,就需要了解Linux系統(tǒng)中進程的內(nèi)存空間。

  進行函數(shù)調(diào)用時系統(tǒng)所作的“序幕”工作就是將函數(shù)的返回地址和EBP壓棧,再將ESP賦給EBP使其成為局部基指針,最后ESP減去一定的值為局部變量留出空間。這樣當程序?qū)⑦^長的字符串拷貝到緩沖區(qū)時就會依次覆蓋EBP和返回地址。當用AAAA覆蓋返回地址,函數(shù)退棧時系統(tǒng)就將0x41414141(A的16進制ASCII碼)賦給EIP去執(zhí)行,由于是一個非法的內(nèi)存地址,故程序崩潰。但如果用一個實際存在的地址覆蓋返回地址,那么程序就轉(zhuǎn)而去執(zhí)行該地址處的指令,通常黑客會在這個地址植入所謂的shellcode,由shellcode產(chǎn)生一個shell,如果被攻擊程序設置了suid位,那么產(chǎn)生的shell就是root shell,黑客也就獲得了系統(tǒng)的最高控制權,這一過程就是基本的緩沖區(qū)溢出攻擊。

  覆蓋函數(shù)的返回地址是比較常見的攻擊方式,但緩沖區(qū)溢出攻擊的手法是靈活多樣的,往往在編程中的一個小小紕漏就可能導致被攻擊,下面簡單介紹一下幾種較為高級的攻擊方式。

  (1)通過覆蓋函數(shù)指針進行攻擊:

  以下是引用片段:

  

        /* vulprog */

  int main(int argc , char * argv[])

  {

  void (* fp)(char *) = (void (*)(char *))&puts;

  char buff[256];

  strcpy(buff,argc[1]);

  fp(argc[2]);

  exit(1);

  }

  上面這個程序在執(zhí)行拷貝時沒有檢查邊界,這樣用戶數(shù)據(jù)就有可能覆蓋函數(shù)指針fp,如果用shllcode的地址去覆蓋fp,那么函數(shù)指針調(diào)用時就會去執(zhí)行shellcode。

  這種覆蓋函數(shù)指針的方式是一種較直接的覆蓋方式(因為函數(shù)指針就在緩沖區(qū)上面),還有一種間接的覆蓋方式,就是當函數(shù)指針不直接在緩沖區(qū)上面時,通過覆蓋另外一個指針來覆蓋函數(shù)指針,再將shellcode的地址填充函數(shù)指針。

  (2)通過覆蓋 .dtors區(qū)地址進行攻擊:

  以下是引用片段:

  

        /* vulprog */

  int main(int argc ,char * argv[])

  {

  char * pbuf = malloc(strlen(argv[2])+1);

  char buff[256];

  strcpy(buff,argv[1]);

  strcpy(pbuf,argv[2]);

  exit(1);

  }

  雖然這個程序沒有函數(shù)指針,但在執(zhí)行第二個拷貝時,可以將任意的數(shù)據(jù)拷貝到任意的地址中(這個地址由第一個拷貝指定),這時就可以選擇用 .dtors區(qū)的地址覆蓋指針pbuf,在執(zhí)行第二個拷貝時將shellcode的地址拷貝至.dtors區(qū),那么在函數(shù)退出時shellcode就會被執(zhí)行。

  其實針對這個程序,攻擊者不僅可以覆蓋.dtors區(qū)的地址,還可以覆蓋GOT(全局偏移表)中exit的地址,或__deregister_frame_info的地址。

  從上面的這些例子可以看出,如果編程中不注意緩沖區(qū)邊界的檢查,就很可能導致被溢出攻擊。

  由于緩沖區(qū)溢出攻擊的頻繁爆發(fā),迫使很多操作系統(tǒng)廠商推出了不可執(zhí)行堆棧、更新C庫函數(shù)等措施。這些措施一定程度上遏制了普通的緩沖區(qū)溢出,但道高一尺,魔高一丈,黑客們很快就將注意力轉(zhuǎn)移到新的溢出攻擊上,如堆溢出。從最初的溢出重要變量(如函數(shù)指針、文件指針)到dlmalloc中malloc-free類型的堆溢出到ptmalloc中的堆溢出,層出不窮。其實不管這些手法有多高明,最終的根源只有一個:利用程序中未對緩沖區(qū)邊界進行有效檢查。

  2.SQL注入

  數(shù)據(jù)庫系統(tǒng)除了可能受到緩沖區(qū)溢出的攻擊外,近幾年又出現(xiàn)了SQL注入的攻擊方式,這種攻擊方式被稱為 “ SYSDBA的惡夢”。SQL注入可能導致數(shù)據(jù)庫系統(tǒng)中的普通用戶竊取機密數(shù)據(jù)(如獲得SYSDBA密碼)、進行權限提升(如獲得SYSDBA特權)等,而這種攻擊方式又不需要太多計算機方面的知識,一般只要能熟練使用SQL語言即可,因此對數(shù)據(jù)庫的安全構成了很大的威脅。

  SQL注入的攻擊方式比較簡單,一般是將一些特權語句注入到有漏洞的存儲過程或觸發(fā)器中導致這些語句被非法執(zhí)行。例如在Oracle中由SYS創(chuàng)建如下存儲過程并將執(zhí)行權限授予普通用戶:

  以下是引用片段:

  

        CREATE OR REPLACE PROCEDURE PROC1 ( INPUT VARCHAR2) AS

  ... ...

  STMT:='SELECT TITLES FROM BOOKS WHERE AUTHOR =''' || INPUT || '''';

  EXECUTE IMMEDIATE STMT;

  ... ...

  正常情況下用戶可以通過執(zhí)行:EXEC SYS.PROC1('DICKENS')來查詢DICKENS的著作,但如果惡意用戶這樣執(zhí)行該存儲過程:

  EXEC SYS.PROC1( 'DICKENS'' UNION SELECT PASSWORD FROM USERS_TABLE WHERE ''A'' = ''A'),那么他就非法地查出了所有用戶的密碼。

  雖然這只是一個簡單的例子,但它表明在編寫系統(tǒng)存儲過程、函數(shù)和觸發(fā)器時一定要注意防止SQL注入的可能。

  數(shù)據(jù)庫是信息系統(tǒng)的基石,一旦被黑客入侵,后果將不堪設想。而抵抗黑客入侵的好辦法就是克服軟件編程中存在的各種漏洞,讓黑客無機可乘。通過源碼審計、漏洞跟蹤等方式可以較好的修正現(xiàn)存系統(tǒng)中的各種安全隱患。目前我們正在達夢數(shù)據(jù)庫中積極開展漏洞發(fā)掘的相關工作,努力使達夢數(shù)據(jù)庫成為真正牢不可破的數(shù)據(jù)庫,為國家的信息安全構筑堅強的基石。

  


向AI問一下細節(jié)

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

AI