數據庫系統是在操作系統平台之上的最重要的系統軟件數據庫系統的安全可以說是十分重要的曾經有句話這樣說如果網絡遍地是金錢那麼金錢就在數據庫服務器中隨著無紙化業務環境的不斷擴大人們在數據庫中存儲著越來越多的敏感信息銀行賬戶醫療記錄政府文件軍事機密等等數據庫系統就成為越來越有價值的攻擊目標因此確保數據庫系統的安全也越來越重要
作為一種大型的系統軟件數據庫系統中也存在著各種各樣的安全漏洞其中危害性較大的有緩沖區溢出堆溢出和SQL注入等
緩沖區溢出
緩沖區溢出是一種很常見也很古老的安全漏洞早在上個世紀年代緩沖區溢出就已經為人所知但時至今日大量的緩沖區溢出漏洞仍被發現最著名的Morris蠕蟲就是利用Unix系統上fingerd程序的緩沖區溢出漏洞在Oracle i發布之初Oarcle公司曾宣稱他的數據庫是 unbreakable 的但不到幾個月的時間就暴出Oracle i中oracleexeXDB等程序存在多個緩沖區溢出漏洞
在C語言中最常見的緩沖區就是字符數組而操縱字符數組的函數有getsstrcpysprintf等這些函數在執行字符串拷貝的過程中沒有對字符串進行長度檢查這樣就很容易發生超長的字符串溢出緩沖區的情況當初這樣設計是出於效率的考慮但現在看來這些函數的使用已成為C語言軟件脆弱的一個重要因素如果程序員沒有良好的編程習慣時刻注意函數調用過程中是否拷貝了超過緩沖區長度的字符串那麼緩沖區溢出就不可避免對於一個有緩沖區溢出漏洞的程序當普通用戶輸入超長字符串時通常只會使該程序崩潰例如對於下面一小段代碼
以下是引用片段
/* vulprog */
#include
int main(int argc char * argv[])
{
char buff[];
strcpy(buff argv[]);
}
如果用戶執行
/vulprog AAAAAAAAAAAAAAAA
在Linux上會出現段錯誤
因為用戶輸入了超長的字符串
除了填滿了緩沖區
還覆蓋了其他一些程序正常退出所需要的數據
為了研究這個問題
就需要了解Linux系統中進程的內存空間
進行函數調用時系統所作的序幕工作就是將函數的返回地址和EBP壓棧再將ESP賦給EBP使其成為局部基指針最後ESP減去一定的值為局部變量留出空間這樣當程序將過長的字符串拷貝到緩沖區時就會依次覆蓋EBP和返回地址當用AAAA覆蓋返回地址函數退棧時系統就將x(A的進制ASCII碼)賦給EIP去執行由於是一個非法的內存地址故程序崩潰但如果用一個實際存在的地址覆蓋返回地址那麼程序就轉而去執行該地址處的指令通常黑客會在這個地址植入所謂的shellcode由shellcode產生一個shell如果被攻擊程序設置了suid位那麼產生的shell就是root shell黑客也就獲得了系統的最高控制權這一過程就是基本的緩沖區溢出攻擊
覆蓋函數的返回地址是比較常見的攻擊方式但緩沖區溢出攻擊的手法是靈活多樣的往往在編程中的一個小小纰漏就可能導致被攻擊下面簡單介紹一下幾種較為高級的攻擊方式
()通過覆蓋函數指針進行攻擊
以下是引用片段
/* vulprog */
int main(int argc char * argv[])
{
void (* fp)(char *) = (void (*)(char *))&puts;
char buff[];
strcpy(buffargc[]);
fp(argc[]);
exit();
}
上面這個程序在執行拷貝時沒有檢查邊界
這樣用戶數據就有可能覆蓋函數指針fp
如果用shllcode的地址去覆蓋fp
那麼函數指針調用時就會去執行shellcode
這種覆蓋函數指針的方式是一種較直接的覆蓋方式(因為函數指針就在緩沖區上面)還有一種間接的覆蓋方式就是當函數指針不直接在緩沖區上面時通過覆蓋另外一個指針來覆蓋函數指針再將shellcode的地址填充函數指針
()通過覆蓋 dtors區地址進行攻擊
以下是引用片段
/* vulprog */
int main(int argc char * argv[])
{
char * pbuf = malloc(strlen(argv[])+);
char buff[];
strcpy(buffargv[]);
strcpy(pbufargv[]);
exit();
}
雖然這個程序沒有函數指針
但在執行第二個拷貝時
可以將任意的數據拷貝到任意的地址中(這個地址由第一個拷貝指定)
這時就可以選擇用
dtors區的地址覆蓋指針pbuf
在執行第二個拷貝時將shellcode的地址拷貝至
dtors區
那麼在函數退出時shellcode就會被執行
其實針對這個程序攻擊者不僅可以覆蓋dtors區的地址還可以覆蓋GOT(全局偏移表)中exit的地址或__deregister_frame_info的地址
從上面的這些例子可以看出如果編程中不注意緩沖區邊界的檢查就很可能導致被溢出攻擊
由於緩沖區溢出攻擊的頻繁爆發迫使很多操作系統廠商推出了不可執行堆棧更新C庫函數等措施這些措施一定程度上遏制了普通的緩沖區溢出但道高一尺魔高一丈黑客們很快就將注意力轉移到新的溢出攻擊上如堆溢出從最初的溢出重要變量(如函數指針文件指針)到dlmalloc中mallocfree類型的堆溢出到ptmalloc中的堆溢出層出不窮其實不管這些手法有多高明最終的根源只有一個利用程序中未對緩沖區邊界進行有效檢查
SQL注入
數據庫系統除了可能受到緩沖區溢出的攻擊外近幾年又出現了SQL注入的攻擊方式這種攻擊方式被稱為 SYSDBA的惡夢SQL注入可能導致數據庫系統中的普通用戶竊取機密數據(如獲得SYSDBA密碼)進行權限提升(如獲得SYSDBA特權)等而這種攻擊方式又不需要太多計算機方面的知識一般只要能熟練使用SQL語言即可因此對數據庫的安全構成了很大的威脅
SQL注入的攻擊方式比較簡單一般是將一些特權語句注入到有漏洞的存儲過程或觸發器中導致這些語句被非法執行例如在Oracle中由SYS創建如下存儲過程並將執行權限授予普通用戶
以下是引用片段
CREATE OR REPLACE PROCEDURE PROC ( INPUT VARCHAR) AS
STMT:=SELECT TITLES FROM BOOKS WHERE AUTHOR = || INPUT || ;
EXECUTE IMMEDIATE STMT;
正常情況下用戶可以通過執行
EXEC SYS
PROC
(
DICKENS
)來查詢DICKENS的著作
但如果惡意用戶這樣執行該存儲過程
EXEC SYSPROC( DICKENS UNION SELECT PASSWORD FROM USERS_TABLE WHERE A = A)那麼他就非法地查出了所有用戶的密碼
雖然這只是一個簡單的例子但它表明在編寫系統存儲過程函數和觸發器時一定要注意防止SQL注入的可能
數據庫是信息系統的基石一旦被黑客入侵後果將不堪設想而抵抗黑客入侵的最好辦法就是克服軟件編程中存在的各種漏洞讓黑客無機可乘通過源碼審計漏洞跟蹤等方式可以較好的修正現存系統中的各種安全隱患目前我們正在達夢數據庫中積極開展漏洞發掘的相關工作努力使達夢數據庫成為真正牢不可破的數據庫為國家的信息安全構築堅強的基石
From:http://tw.wingwit.com/Article/program/Oracle/201311/17934.html