摘 要:簡(jiǎn)要介紹了SQL注入式攻擊的原理。在前人提出的“對(duì)用戶輸入信息實(shí)施過(guò)濾”的技術(shù)基礎(chǔ)上,建立了一個(gè)針對(duì)SQL注入攻擊的檢測(cè)/防御/備案通用模型。該模型在客戶端和服務(wù)器端設(shè)置兩級(jí)檢查。對(duì)于一般性用戶誤操作和低等級(jí)惡意攻擊,客戶端的檢查將自動(dòng)做出反應(yīng);考慮到客戶端檢查有可能被有經(jīng)驗(yàn)的攻擊者繞開,特在服務(wù)器端設(shè)定二級(jí)檢查。在文中還提出了對(duì)高等級(jí)惡意攻擊的自動(dòng)備案技術(shù),并給出了相應(yīng)代碼。
關(guān)鍵詞:系統(tǒng)安全;SQL Server;SQL注入攻擊;IDS檢測(cè);DDL模型
互聯(lián)網(wǎng)上的安全問(wèn)題越來(lái)越嚴(yán)重,入侵檢測(cè)(IDS)也因而顯得尤為必要。MS SQL Server作為數(shù)據(jù)庫(kù)市場(chǎng)的主要產(chǎn)品之一,研究針對(duì)他的SQL攻擊處理方案,建立一個(gè)通用的SQL注入攻擊防御、檢測(cè)、備案模型,對(duì)于加強(qiáng)安全建設(shè)具有積極的意義。
1、SQL注入攻擊簡(jiǎn)介
SQL注入攻擊源于英文“SQL Injection Attack”。目前還沒(méi)有看到一種標(biāo)準(zhǔn)的定義,常見的是對(duì)這種攻擊形式、特點(diǎn)的描述。微軟技術(shù)中心從2個(gè)方面進(jìn)行了描述:
(1)腳本注入式的攻擊。
(2)惡意用戶輸入用來(lái)影響被執(zhí)行的SQL腳本。
Stephen Kost給出了這種攻擊形式的另一個(gè)特征,“從一個(gè)數(shù)據(jù)庫(kù)獲得未經(jīng) 授權(quán)的訪問(wèn)和直接檢索”。SQL注入攻擊就其本質(zhì)而言,他利用的工具是SQL的語(yǔ)法,針對(duì)的是應(yīng)用程序開發(fā)者編程過(guò)程中的漏洞。“當(dāng)攻擊者能夠操作數(shù)據(jù),往應(yīng)用程序中插入一些SQL語(yǔ)句時(shí),SQL注入攻擊就發(fā)生了”。
由于SQL注入攻擊利用的是SQL語(yǔ)法,使得這種攻擊具有廣泛性。理論上說(shuō),對(duì)于所有基于SQL語(yǔ)言標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)軟件都是有效的,包括MS SQL Server,Oracle,DB2,Sybase,MySQL等。當(dāng)然,各種軟件有自身的特點(diǎn),最終的攻擊代碼可能不盡相同。SQL注入攻擊的原理相對(duì)簡(jiǎn)單,易于掌握和實(shí)施,并且整個(gè)Internet上連接有數(shù)目驚人的數(shù)據(jù)庫(kù)系統(tǒng)(僅在中國(guó),截至2003年3月的統(tǒng)計(jì)就有82 900多個(gè)),在過(guò)去的幾年里,SQL攻擊的數(shù)量一直在增長(zhǎng)。
2、SQL注入式攻擊的檢測(cè)及跟蹤
2.1SQL攻擊檢測(cè)/防御/跟蹤模型
針對(duì)SQL攻擊的防御,前人做過(guò)大量的工作,提出的解決方案包括 :
(1)封裝客戶端提交信息。
(2)替換或刪除敏感字符/字符串。
(3)屏蔽出錯(cuò)信息以及。
(4)在服務(wù)端正式處理之前對(duì)提交數(shù)據(jù)的合法性進(jìn)行檢查等。
方案(1)的做法需要RDBMS的支持,目前只有Oracle采用該技術(shù);方案(2)是一種不 完全的解決措施,舉例來(lái)說(shuō)明他的弱點(diǎn),當(dāng)客戶端的輸入為“…ccmdmcmdd…”時(shí),在對(duì)敏感字符串“cmd”替換刪除以后,剩下的字符正好是“…cmd…”;方案(3)的實(shí)質(zhì)是在服務(wù)端處理完畢之后進(jìn)行補(bǔ)救,攻擊已經(jīng)發(fā)生,只是阻止攻擊者知道攻擊的結(jié)果;方案(4)被多數(shù)的研究 者認(rèn)為是最根本的解決手段,在確認(rèn)客戶端的輸入合法之前,服務(wù)端拒絕進(jìn)行關(guān)鍵性的處理操作。方案(4)與(2)的區(qū)別在于,方案(4)一旦檢測(cè)到敏感字符/字符串,針對(duì)數(shù)據(jù)庫(kù)的操作即行中止,而方案(2)是對(duì)有問(wèn)題的客戶端輸入做出補(bǔ)救,不中止程序后續(xù)操作。方案(2)雖然在一定程度上有效,但有“治標(biāo)不治本”的嫌疑,新的攻擊方式正在被不斷發(fā)現(xiàn),只要允許服務(wù)端程序使用這些提交信息,就總有受到攻擊的可能。
因此,本文中針對(duì)SQL注入攻擊的檢測(cè)/防御/備案模型即基于提交信息的合法性檢 查,在客戶端和服務(wù)端進(jìn)行兩級(jí)檢查,只要任一級(jí)檢查沒(méi)有通過(guò),提交的信息就不會(huì)進(jìn)入query語(yǔ)句,不會(huì)構(gòu)成攻擊。在客戶端和服務(wù)端進(jìn)行合法性檢查的函數(shù)基本相同。客戶端檢查的主要 作用是減少網(wǎng)絡(luò)流量,降低服務(wù)器負(fù)荷,將一般誤操作、低等級(jí)攻擊與高等級(jí)攻擊行為區(qū)分開來(lái)。技術(shù)上,客戶端的檢查是有可能被有經(jīng)驗(yàn)的攻擊者繞開的,在這種情形下,提交的數(shù)據(jù)被直接發(fā)往服務(wù)端,通過(guò)在服務(wù)器端設(shè)定二級(jí)檢查就顯得十分必要。由于正常提交到服務(wù)端的數(shù)據(jù)已經(jīng)在客戶端檢查過(guò),因此,服務(wù)端檢查到的提交異常基本可以認(rèn)定為惡意攻擊行為所致,中止提交信息的處理,進(jìn)行攻擊備案,并對(duì)客戶端給出出錯(cuò)/警告提示。對(duì)應(yīng)模型簡(jiǎn)圖如圖1所示。

對(duì)提交信息的檢查,主要包括數(shù)據(jù)類型檢查、數(shù)據(jù)長(zhǎng)度檢查和敏感字符過(guò)濾。前兩項(xiàng)可利用函數(shù)直接辦到,敏感字符過(guò)濾則需要應(yīng)用開發(fā)方做相應(yīng)開發(fā)。經(jīng)過(guò)總結(jié),對(duì)

語(yǔ)句時(shí)必須用到的,因此可以針對(duì)這些敏感字符,設(shè)定過(guò)濾函數(shù),在把這些上傳的參數(shù)結(jié)合到查詢語(yǔ)句之前對(duì)他們進(jìn)行過(guò)濾。下面的2個(gè)函數(shù)即過(guò)濾模塊的主要代碼:


提交非法字符的人,都有可能是SQL注入攻擊者。但考慮到用戶在正常使用中的誤操作也有提交非法字符/字符串的可能,因此客戶端的一級(jí)檢查無(wú)論對(duì)用戶誤操作,還是一般性攻擊,所做出處理措施只是中止信息提交,給出友好的出錯(cuò)提示。在經(jīng)過(guò)一級(jí)檢查以后提交到服務(wù)器端的信息中仍然包括非法字符/字符串的,惟一的可能是攻擊者繞開了客戶端的一級(jí)檢查。對(duì)于這種危險(xiǎn)的信號(hào),服務(wù)器端將從收到的提交信息數(shù)據(jù)包中提取攻擊源的IP地址,存入數(shù)據(jù)庫(kù)備查,同時(shí)中止針對(duì)數(shù)據(jù)庫(kù)的操作.
3、結(jié)語(yǔ)
由于SQL注入攻擊針對(duì)的是應(yīng)用開發(fā)過(guò)程中的編程不嚴(yán)密,因而對(duì)于絕大多數(shù)防火墻來(lái)說(shuō),這種攻擊是“合法”的。問(wèn)題的解決只有依賴于完善編程。專門針對(duì)SQL注入攻擊的工具較少,Wpoison對(duì)于用asp,php進(jìn)行的開發(fā)有一定幫助。本文中的DDL模型作為一個(gè)整體解決方案,對(duì)代碼稍加變動(dòng)也可用于SQL Server以外的關(guān)系數(shù)據(jù)庫(kù)。已經(jīng)將該模型應(yīng)用于某單位的Web數(shù)據(jù)庫(kù)開發(fā),取得了良好的效果。本文中給出的代碼在Windows 2000 Server+SQL Server 2000環(huán)境測(cè)試通過(guò)。