資料庫安全知識介紹

資料庫安全專家發表於2019-04-01

資料庫系統是在作業系統平臺之上的最重要的系統軟體,資料庫系統的安全可以說是十分重要的。曾經有句話這樣說:如果網路遍地是金錢,那麼金錢就在資料庫伺服器中。隨著無紙化業務環境的不斷擴大,人們在資料庫中儲存著越來越多的敏感資訊:銀行賬戶、醫療記錄、政府檔案、軍事機密等等,資料庫系統就成為越來越有價值的攻擊目標,因此確保資料庫系統的安全也越來越重要。

  作為一種大型的系統軟體,資料庫系統中也存在著各種各樣的安全漏洞,其中危害性較大的有緩衝區溢位、堆溢位和SQL隱碼攻擊等。

  1.緩衝區溢位

  緩衝區溢位是一種很常見也很古老的安全漏洞。早在上個世紀80年代,緩衝區溢位就已經為人所知,但時至今日,大量的緩衝區溢位漏洞仍被發現。最著名的Morris蠕蟲就是利用Unix系統上fingerd程式的緩衝區溢位漏洞。在Oracle 9i釋出之初,Oarcle公司曾宣稱他的資料庫是“ unbreakable ”的,但不到幾個月的時間,就暴出Oracle 9i中oracle.exe、XDB等程式存在多個緩衝區溢位漏洞。

  在C語言中最常見的緩衝區就是字元陣列,而操縱字元陣列的函式有gets、strcpy、sprintf等。這些函式在執行字串複製的過程中沒有對字串進行長度檢查,這樣就很容易發生超長的字串溢位緩衝區的情況。當初這樣設計是出於效率的考慮,但現在看來,這些函式的使用已成為C語言軟體脆弱的一個重要因素。如果程式設計師沒有良好的程式設計習慣,時刻注意函式呼叫過程中是否複製了超過緩衝區長度的字串,那麼緩衝區溢位就不可避免。對於一個有緩衝區溢位漏洞的程式,當普通使用者輸入超長字串時,通常只會使該程式崩潰。例如對於下面一小段程式碼:

  以下是引用片段:

  

        /* vulprog */

  #include

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

  {

  char buff[8];

  strcpy(buff, argv[1]);

  }

  如果使用者執行 ./vulprog AAAAAAAAAAAAAAAA,在Linux上會出現段錯誤,因為使用者輸入了超長的字串,除了填滿了緩衝區,還覆蓋了其他一些程式正常退出所需要的資料。為了研究這個問題,就需要了解Linux系統中程式的記憶體空間。

  進行函式呼叫時系統所作的“序幕”工作就是將函式的返回地址和EBP壓棧,再將ESP賦給EBP使其成為區域性基指標,最後ESP減去一定的值為區域性變數留出空間。這樣當程式將過長的字串複製到緩衝區時就會依次覆蓋EBP和返回地址。當用AAAA覆蓋返回地址,函式退棧時系統就將0x41414141(A的16進位制ASCII碼)賦給EIP去執行,由於是一個非法的記憶體地址,故程式崩潰。但如果用一個實際存在的地址覆蓋返回地址,那麼程式就轉而去執行該地址處的指令,通常駭客會在這個地址植入所謂的shellcode,由shellcode產生一個shell,如果被攻擊程式設定了suid位,那麼產生的shell就是root shell,駭客也就獲得了系統的最高控制權,這一過程就是基本的緩衝區溢位攻擊。

  覆蓋函式的返回地址是比較常見的攻擊方式,但緩衝區溢位攻擊的手法是靈活多樣的,往往在程式設計中的一個小小紕漏就可能導致被攻擊,下面簡單介紹一下幾種較為高階的攻擊方式。

  (1)透過覆蓋函式指標進行攻擊:

  以下是引用片段:

  

        /* 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);

  }

  上面這個程式在執行複製時沒有檢查邊界,這樣使用者資料就有可能覆蓋函式指標fp,如果用shllcode的地址去覆蓋fp,那麼函式指標呼叫時就會去執行shellcode。

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

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

  以下是引用片段:

  

        /* 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);

  }

  雖然這個程式沒有函式指標,但在執行第二個複製時,可以將任意的資料複製到任意的地址中(這個地址由第一個複製指定),這時就可以選擇用 .dtors區的地址覆蓋指標pbuf,在執行第二個複製時將shellcode的地址複製至.dtors區,那麼在函式退出時shellcode就會被執行。

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

  從上面的這些例子可以看出,如果程式設計中不注意緩衝區邊界的檢查,就很可能導致被溢位攻擊。

  由於緩衝區溢位攻擊的頻繁爆發,迫使很多作業系統廠商推出了不可執行堆疊、更新C庫函式等措施。這些措施一定程度上遏制了普通的緩衝區溢位,但道高一尺,魔高一丈,駭客們很快就將注意力轉移到新的溢位攻擊上,如堆溢位。從最初的溢位重要變數(如函式指標、檔案指標)到dlmalloc中malloc-free型別的堆溢位到ptmalloc中的堆溢位,層出不窮。其實不管這些手法有多高明,最終的根源只有一個:利用程式中未對緩衝區邊界進行有效檢查。

  2.SQL隱碼攻擊

  資料庫系統除了可能受到緩衝區溢位的攻擊外,近幾年又出現了SQL隱碼攻擊的攻擊方式,這種攻擊方式被稱為 “ SYSDBA的惡夢”。SQL隱碼攻擊可能導致資料庫系統中的普通使用者竊取機密資料(如獲得SYSDBA密碼)、進行許可權提升(如獲得SYSDBA特權)等,而這種攻擊方式又不需要太多計算機方面的知識,一般只要能熟練使用SQL語言即可,因此對資料庫的安全構成了很大的威脅。

  SQL隱碼攻擊的攻擊方式比較簡單,一般是將一些特權語句注入到有漏洞的儲存過程或觸發器中導致這些語句被非法執行。例如在Oracle中由SYS建立如下儲存過程並將執行許可權授予普通使用者:

  以下是引用片段:

  

        CREATE OR REPLACE PROCEDURE PROC1 ( INPUT VARCHAR2) AS

  ... ...

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

  EXECUTE IMMEDIATE STMT;

  ... ...

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

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

  雖然這只是一個簡單的例子,但它表明在編寫系統儲存過程、函式和觸發器時一定要注意防止SQL隱碼攻擊的可能。

  資料庫是資訊系統的基石,一旦被駭客入侵,後果將不堪設想。而抵抗駭客入侵的好辦法就是克服軟體程式設計中存在的各種漏洞,讓駭客無機可乘。透過原始碼審計、漏洞跟蹤等方式可以較好的修正現存系統中的各種安全隱患。目前我們正在達夢資料庫中積極開展漏洞發掘的相關工作,努力使達夢資料庫成為真正牢不可破的資料庫,為國家的資訊保安構築堅強的基石。

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914889/viewspace-2639993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章