本發(fā)明涉及網(wǎng)絡(luò)安全領(lǐng)域,尤其涉及一種基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)及防御方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,Web技術(shù)和數(shù)據(jù)庫技術(shù)已經(jīng)成為組成現(xiàn)代化信息系統(tǒng)的關(guān)鍵技術(shù),以Web服務(wù)器和數(shù)據(jù)庫為基礎(chǔ)的信息安全是當(dāng)前核心的互聯(lián)網(wǎng)安全問題之一。Web服務(wù)器及其后臺的數(shù)據(jù)庫中往往保存著政府機(jī)構(gòu)、企事業(yè)單位、個人用戶等的重要信息,其重要性和價值對黑客而言具有巨大的吸引力,因此極易受到黑客的攻擊。
SQL注入攻擊是目前Web服務(wù)器面臨的一類常見的攻擊,攻擊者通過修改應(yīng)用程序的Web表單的輸入域或頁面請求中的查詢字符串等插入一系列的SQL命令來改變數(shù)據(jù)庫查詢語句,從而欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行惡意的SQL命令,進(jìn)而實(shí)現(xiàn)對后臺數(shù)據(jù)庫未經(jīng)授權(quán)的訪問并竊取數(shù)據(jù)庫中有價值的數(shù)據(jù)。SQL注入攻擊是黑客攻擊Web服務(wù)器時最常用的一種攻擊方式,給互聯(lián)網(wǎng)安全造成了嚴(yán)重的威脅。
申請?zhí)枮?01310714559.6的發(fā)明專利公開了一種SQL注入攻擊的識別方法及裝置,首先對SQL的語法和詞法進(jìn)行分析,建立基于SQL語法元素和SQL語法字段的SQL注入攻擊的規(guī)則特征庫;當(dāng)收到查詢數(shù)據(jù)庫的請求時,提取其中的SQL語法元素和SQL字段并和SQL注入攻擊的特征庫進(jìn)行匹配,如果匹配成功則認(rèn)為是SQL注入攻擊。由于僅僅依據(jù)對SQL語法和詞法的分析無法精確區(qū)分正常的SQL語句和SQL注入攻擊,無法建立一個完善的SQL注入攻擊的特征庫,因此該方法具有較高的誤報率和漏報率,且由于需要對整個特征庫進(jìn)行匹配,在數(shù)據(jù)庫訪問量較大的情況下運(yùn)行效率較低。
申請?zhí)枮?01510057370.3的發(fā)明專利公開了一種基于語義分析的智能防SQL注入方法,對來自網(wǎng)頁的所有請求進(jìn)行數(shù)據(jù)攔截或是數(shù)據(jù)提取,將提取到的數(shù)據(jù)送入安全中心進(jìn)行處理并返回結(jié)果,同時根據(jù)預(yù)設(shè)判斷規(guī)則按順序逐條檢查,判斷這些數(shù)據(jù)是否有害。該方法在用戶請求到達(dá)Web服務(wù)器之前進(jìn)行檢測過濾,但由于預(yù)設(shè)判斷規(guī)則是基于語義分析的,因此存在較大的誤報率和漏報率,且預(yù)設(shè)判斷規(guī)則需要不斷地更新,該方法的實(shí)用性較差。
申請?zhí)枮?01210210140.2的發(fā)明專利公開了一種基于數(shù)據(jù)庫的SQL注入攻擊防護(hù)方法,在操作系統(tǒng)層建立一個底層驅(qū)動數(shù)據(jù)安全殼,利用硬盤緩存形成一個虛擬空間,將數(shù)據(jù)庫加載在這個虛擬空間內(nèi),外部數(shù)據(jù)在訪問數(shù)據(jù)庫的時候,首先通過數(shù)據(jù)安全殼,由數(shù)據(jù)安全殼負(fù)責(zé)外部數(shù)據(jù)與數(shù)據(jù)安全殼內(nèi)部數(shù)據(jù)庫的數(shù)據(jù)交換;數(shù)據(jù)安全殼的管理端對外部數(shù)據(jù)所來自的地址進(jìn)行記錄,數(shù)據(jù)安全殼的端口轉(zhuǎn)向驅(qū)動形成到達(dá)數(shù)據(jù)庫的過濾通道,數(shù)據(jù)安全殼的過濾驅(qū)動對所有訪問數(shù)據(jù)庫的外部數(shù)據(jù)進(jìn)行過濾,將安全的代碼放行進(jìn)入數(shù)據(jù)庫,并對惡意的代碼進(jìn)行過濾和清除。該方法的側(cè)重點(diǎn)在于,在靠近數(shù)據(jù)庫這一側(cè)對SQL注入攻擊進(jìn)行防護(hù),但仍然是基于規(guī)則的,不能從根源上防御SQL注入攻擊。
總的來說,現(xiàn)有的SQL注入攻擊防御方法大多是基于規(guī)則的,即事先建立好用于區(qū)分正常SQL語句和SQL注入攻擊的判斷規(guī)則,由于攻擊手段的不斷發(fā)展和進(jìn)化,再加上互聯(lián)網(wǎng)上數(shù)據(jù)量太大且多樣性太大,很難建立一個能精確區(qū)分正常SQL語句和SQL注入攻擊的完善的規(guī)則庫,因此該類方法往往會有較高的誤報率和漏報率,需要不停地更新規(guī)則庫但是仍然不能起到非常有效的防護(hù)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于改進(jìn)已有SQL注入攻擊防御技術(shù)的不足,提出一種基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)及防御方法,不依賴于規(guī)則,無需事先建立用于區(qū)分正常SQL語句和SQL注入攻擊的判斷規(guī)則,通過創(chuàng)新的對SQL語句進(jìn)行替換變換,使得攻擊者惡意注入的SQL語句變成不符合數(shù)據(jù)庫語法規(guī)范的語句而無法被執(zhí)行,進(jìn)而有效防御了SQL注入攻擊行為。本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)及防御方法適用于多種類型的Web服務(wù)器和數(shù)據(jù)庫系統(tǒng),能夠顯著提升對Web服務(wù)器及其后臺數(shù)據(jù)庫的安全防護(hù),具有廣闊的推廣應(yīng)用前景。
為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明所提供的技術(shù)方案是:
一種基于動態(tài)變換的SQL注入攻擊防御方法,包括以下步驟:
步驟一、構(gòu)建數(shù)據(jù)庫字段替換規(guī)則集合和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,所述數(shù)據(jù)庫字段替換規(guī)則集合中包括有SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串,所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合中包括有SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串;
步驟二、進(jìn)行初始化替換操作,將數(shù)據(jù)庫中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,將Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換成對應(yīng)的替換字符串;
步驟三、截獲并解析Web服務(wù)器發(fā)往數(shù)據(jù)庫的SQL語句,首先把SQL語句中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,接著把SQL語句中按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換后出現(xiàn)的替換字符串再次按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合還原為對應(yīng)的SQL關(guān)鍵字,然后將所述SQL語句發(fā)往數(shù)據(jù)庫;
步驟四、截獲并解析數(shù)據(jù)庫向Web服務(wù)器的返回結(jié)果,將返回結(jié)果中出現(xiàn)的與數(shù)據(jù)庫字段替換規(guī)則集合中的替換字符串相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行還原,然后將返回結(jié)果發(fā)往Web服務(wù)器;
步驟五、動態(tài)變換所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,并根據(jù)變換后的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合對Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字進(jìn)行更新替換操作。
進(jìn)一步的根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御方法,其中步驟一具體包括以下步驟:
(1-1)、根據(jù)用戶配置信息生成SQL關(guān)鍵字集合;
(1-2)、為SQL關(guān)鍵字集合中的每一個SQL關(guān)鍵字生成對應(yīng)的一個第一替換字符串,由所述SQL關(guān)鍵字、第一替換字符串以及SQL關(guān)鍵字與第一替換字符串的對應(yīng)關(guān)系構(gòu)成所述數(shù)據(jù)庫字段替換規(guī)則集合;
(1-3)、為SQL關(guān)鍵字集合中的每一個SQL關(guān)鍵字生成對應(yīng)的一個第二替換字符串,由所述SQL關(guān)鍵字、第二替換字符串以及SQL關(guān)鍵字與第二替換字符串的對應(yīng)關(guān)系構(gòu)成所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合。
進(jìn)一步的根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御方法,其中所述數(shù)據(jù)庫字段替換規(guī)則集合中的SQL關(guān)鍵字和第一替換字符串具有一一對應(yīng)關(guān)系,每一個SQL關(guān)鍵字所對應(yīng)的第一替換字符串為沒有具體含義的、不常見的字符串,且所述第一替換字符串中不含有與SQL關(guān)鍵字形式相同的字符串;所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合中的SQL關(guān)鍵字和第二替換字符串具有一一對應(yīng)關(guān)系,每一個SQL關(guān)鍵字所對應(yīng)的第二替換字符串為沒有具體含義的、不常見的字符串,且所述第二替換字符串中不含有與SQL關(guān)鍵字形式相同的字符串;所述數(shù)據(jù)庫字段替換規(guī)則集合和所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合之間不含有相同的替換字符串。
進(jìn)一步的根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御方法,其中所述步驟三具體包括以下步驟:
(3-1)、截獲并解析Web服務(wù)器發(fā)往數(shù)據(jù)庫的SQL語句,通過將所述SQL語句與數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行對比,判定所述SQL語句中是否含有與數(shù)據(jù)庫字段替換規(guī)則集合中的SQL關(guān)鍵字形式相同的字符串,若是則將所述字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,若否則不進(jìn)行替換操作;
(3-2)、將所述SQL語句中按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換后出現(xiàn)的替換字符串再次按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合還原為對應(yīng)的SQL關(guān)鍵字,然后將所述SQL語句發(fā)往數(shù)據(jù)庫。
進(jìn)一步的根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御方法,其中所述步驟四具體包括:截獲并解析數(shù)據(jù)庫向Web服務(wù)器的返回結(jié)果,通過將所述返回結(jié)果與數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行對比,判定所述返回結(jié)果中是否含有與數(shù)據(jù)庫字段替換規(guī)則集合中的替換字符串相同的字符串,若是則將所述字符串按照數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行還原,若否則不進(jìn)行還原操作,最后將返回結(jié)果發(fā)往Web服務(wù)器。
進(jìn)一步的根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御方法,其中步驟五具體包括以下步驟:
(5-1)、每隔一段時間生成一套新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合;
(5-2)、按照新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合對Web服務(wù)器上網(wǎng)站程序中的SQL語句進(jìn)行更新替換操作,將SQL語句中的SQL關(guān)鍵字按照新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換成對應(yīng)的替換字符串;
(5-3)、刪除舊的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合。
一種基于動態(tài)變換的SQL注入攻擊防御系統(tǒng),包括:
替換規(guī)則構(gòu)建單元,用于構(gòu)建數(shù)據(jù)庫字段替換規(guī)則集合和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,所述數(shù)據(jù)庫字段替換規(guī)則集合中包括有SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串,所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合中包括有SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串;
初始化替換單元,用于進(jìn)行初始化替換操作,將數(shù)據(jù)庫中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,將Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換成對應(yīng)的替換字符串;
訪問數(shù)據(jù)處理單元,用于截獲并解析Web服務(wù)器發(fā)往數(shù)據(jù)庫的SQL語句,首先把SQL語句中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,接著把SQL語句中按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換后出現(xiàn)的替換字符串再次按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合還原為對應(yīng)的SQL關(guān)鍵字,然后將所述SQL語句發(fā)往數(shù)據(jù)庫;
返回結(jié)果處理單元,用于截獲并解析數(shù)據(jù)庫向Web服務(wù)器的返回結(jié)果,將返回結(jié)果中出現(xiàn)的與數(shù)據(jù)庫字段替換規(guī)則集合中的替換字符串相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行還原,然后將返回結(jié)果發(fā)往Web服務(wù)器;
動態(tài)變換單元,用于動態(tài)變換所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,并根據(jù)變換后的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合對Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字進(jìn)行更新替換操作。
一種基于動態(tài)變換的SQL注入攻擊防御系統(tǒng),包括:替換規(guī)則初始化單元、數(shù)據(jù)庫字段替換單元、網(wǎng)站程序SQL關(guān)鍵字替換單元、通信數(shù)據(jù)處理單元、替換規(guī)則動態(tài)變換單元和替換規(guī)則存儲單元;
所述替換規(guī)則初始化單元基于用戶配置信息構(gòu)建數(shù)據(jù)庫字段替換規(guī)則集合和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,并將數(shù)據(jù)庫字段替換規(guī)則集合及其生成時間存儲于替換規(guī)則存儲單元,將網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合及其生成時間存儲于替換規(guī)則存儲單元,同時通知數(shù)據(jù)庫字段替換單元按照數(shù)據(jù)庫字段替換規(guī)則集合完成數(shù)據(jù)庫中與SQL關(guān)鍵字形式相同的字符串的初始化替換操作,通知網(wǎng)站程序SQL關(guān)鍵字替換單元按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合完成Web服務(wù)器上網(wǎng)站程序中的SQL語句的初始化替換操作,其中所述數(shù)據(jù)庫字段替換規(guī)則集合和所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合均包括有SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串;
所述數(shù)據(jù)庫字段替換單元根據(jù)替換規(guī)則初始化單元的替換通知,按照替換規(guī)則存儲單元中存儲的數(shù)據(jù)庫字段替換規(guī)則集合,將數(shù)據(jù)庫中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串替換為對應(yīng)的替換字符串;
所述網(wǎng)站程序SQL關(guān)鍵字替換單元根據(jù)替換規(guī)則初始化單元或替換規(guī)則動態(tài)變換單元的替換通知,按照替換規(guī)則存儲單元中存儲的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,將Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字替換為對應(yīng)的替換字符串;
所述通信數(shù)據(jù)處理單元包括訪問數(shù)據(jù)處理模塊和返回結(jié)果處理模塊,所述訪問數(shù)據(jù)處理模塊截獲并解析Web服務(wù)器發(fā)往數(shù)據(jù)庫的SQL語句,首先把SQL語句中出現(xiàn)的與SQL關(guān)鍵字形式相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,接著把SQL語句中按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合替換后出現(xiàn)的替換字符串再次按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合還原為對應(yīng)的SQL關(guān)鍵字,然后將所述SQL語句發(fā)往數(shù)據(jù)庫;所述返回結(jié)果處理模塊截獲并解析數(shù)據(jù)庫向Web服務(wù)器的返回結(jié)果,將返回結(jié)果中出現(xiàn)的與數(shù)據(jù)庫字段替換規(guī)則集合中替換字符串相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行還原,然后將返回結(jié)果發(fā)往Web服務(wù)器;
所述替換規(guī)則動態(tài)變換單元動態(tài)變換替換規(guī)則存儲單元中存儲的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,并通知網(wǎng)站程序SQL關(guān)鍵字替換單元按照變換后新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合對Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字進(jìn)行替換操作,待替換操作完成后刪除替換規(guī)則存儲單元中存儲的舊的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合。
進(jìn)一步地根據(jù)本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御系統(tǒng),其中所述替換規(guī)則存儲單元包括第一存儲模塊和第二存儲模塊,所述數(shù)據(jù)庫字段替換規(guī)則集合及其生成時間存儲于所述第一存儲模塊中,所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合及其生成時間存儲于所述第二存儲模塊中;所述訪問數(shù)據(jù)處理模塊截獲Web服務(wù)器發(fā)往數(shù)據(jù)庫的SQL語句后,查詢所述第一存儲模塊中的數(shù)據(jù)庫字段替換規(guī)則集合,以判定所述SQL語句中是否含有與數(shù)據(jù)庫字段替換規(guī)則集合中的SQL關(guān)鍵字形式相同的字符串,若是則將所述字符串按照數(shù)據(jù)庫字段替換規(guī)則集合替換為對應(yīng)的替換字符串,若否則不作處理,然后所述訪問數(shù)據(jù)處理模塊查詢所述第二存儲模塊中的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,將所述SQL語句中含有的與網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合中的替換字符串相同的字符串按照網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合還原為對應(yīng)的SQL關(guān)鍵字,然后將所述SQL語句發(fā)往數(shù)據(jù)庫;所述返回結(jié)果處理模塊截獲數(shù)據(jù)庫向Web服務(wù)器的返回結(jié)果后,查詢所述第一存儲模塊中的數(shù)據(jù)庫字段替換規(guī)則集合,將返回結(jié)果中出現(xiàn)的與數(shù)據(jù)庫字段替換規(guī)則集合中的替換字符串相同的字符串按照數(shù)據(jù)庫字段替換規(guī)則集合進(jìn)行還原,然后將返回結(jié)果發(fā)往Web服務(wù)器。
本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)的用途,其中將所述基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)布置于Web服務(wù)器上或者布置于Web服務(wù)器和數(shù)據(jù)庫之間。
本發(fā)明的有益效果:
1)、本發(fā)明創(chuàng)新了一種SQL注入攻擊防御的新思路,不基于規(guī)則,無需維護(hù)一個龐大的規(guī)則庫,極大地降低了SQL注入攻擊防御的開發(fā)維護(hù)成本;系統(tǒng)不僅能防御已知的SQL注入攻擊,也能防御未知的SQL注入攻擊,具有很低的誤報率和漏報率;
2)、本發(fā)明對于正常用戶訪問Web服務(wù)器及后臺數(shù)據(jù)庫的請求是透明的,而對于SQL注入攻擊,攻擊者惡意注入的SQL語句經(jīng)過本發(fā)明的字段替換后會變成不符合數(shù)據(jù)庫語法規(guī)范的語句而無法執(zhí)行,從而有效防御了任何類型的SQL注入攻擊行為;
3)、本發(fā)明引入動態(tài)變換的思想,打破傳統(tǒng)SQL注入攻擊防御方法的靜態(tài)性特征,通過動態(tài)變換Web服務(wù)器上網(wǎng)站程序中SQL語句的SQL關(guān)鍵字的替換規(guī)則,使得攻擊者無法通過不斷的攻擊嘗試來突破SQL注入攻擊防御系統(tǒng);
4)、經(jīng)樣機(jī)使用實(shí)踐證明,本發(fā)明能有效阻止SQL注入攻擊行為,且本發(fā)明所述方案實(shí)現(xiàn)布置容易、操作簡單、安全可靠,具有顯著的經(jīng)濟(jì)社會效益和廣闊的市場推廣應(yīng)用前景。
附圖說明
圖1是本發(fā)明所述基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)的總體結(jié)構(gòu)框圖;
圖2是本發(fā)明所述基于動態(tài)變換的SQL注入攻擊防御方法的流程圖;
圖中各附圖標(biāo)記的含義如下:
11-替換規(guī)則初始化單元,12-替換規(guī)則存儲單元,13-數(shù)據(jù)庫字段替換單元,14-網(wǎng)站程序SQL關(guān)鍵字替換單元,15-通信數(shù)據(jù)處理單元;16-替換規(guī)則動態(tài)變換單元。
具體實(shí)施方式
以下結(jié)合附圖對本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)的描述,以使本領(lǐng)域技術(shù)人員能夠更加清楚地理解本發(fā)明的方案,但并不因此限制本發(fā)明的保護(hù)范圍。
為了便于敘述,首先給出一個SQL注入攻擊的例子。假設(shè)某個Web服務(wù)器上網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL網(wǎng)站登錄驗(yàn)證的SQL查詢語句為select*from users where name='用戶輸入的用戶名'and pw='用戶輸入的密碼',攻擊者惡意輸入用戶名1'or'1'='1以及密碼1'or'1'='1,此時原來的SQL查詢語句將變?yōu)閟elect*from users where name='1'or'1'='1'and pw='1'or'1'='1',也即等價于select*from users,攻擊者通過這樣的注入,可以實(shí)現(xiàn)無賬號密碼登錄網(wǎng)站,達(dá)到其攻擊目的。由于SQL注入攻擊的本質(zhì)是攻擊者通過修改應(yīng)用程序的Web表單的輸入域或頁面請求中的查詢字符串等插入一系列的SQL語句來改變操作數(shù)據(jù)庫的命令,也即攻擊者注入的SQL語句是動態(tài)生成的。
下面首先詳細(xì)闡述本發(fā)明的技術(shù)創(chuàng)新原理。
首先技術(shù)人員確定用于操作數(shù)據(jù)庫的所有SQL語句中包括的全部或常用SQL關(guān)鍵字(包括select、where、union、and、or等),形成一個SQL關(guān)鍵字集合,記為集合A,集合A中的每一個元素對應(yīng)于一個SQL關(guān)鍵字。接著根據(jù)集合A構(gòu)建與之一一對應(yīng)的集合B,為集合A中的每一個元素對應(yīng)一個沒有具體含義、不常見的字符串(字符串隨機(jī)生成,保證不重復(fù),不包括有與SQL關(guān)鍵字形式一樣的字符串),優(yōu)選的進(jìn)行等長度替換,例如把集合A中出現(xiàn)的select替換成df#g¥u,同時記錄集合A中每一個元素的對應(yīng)規(guī)則,形成數(shù)據(jù)庫字段替換規(guī)則集合,記為集合B,也就是說集合B中包括有集合A中的每一個元素及其對應(yīng)的字符串,例如集合A為:{……,select,where,and,or,……},則集合B為:{……,select→df#g¥u,where→r¥#de,and→@#*,or→%&,……}。同時根據(jù)集合A構(gòu)建與之一一對應(yīng)的集合C,為集合A中的每一個元素對應(yīng)一個沒有具體含義、不常見的字符串(字符串隨機(jī)生成,保證不重復(fù),不包括有與SQL關(guān)鍵字形式一樣的字符串),優(yōu)選的進(jìn)行等長度替換,例如把集合A中出現(xiàn)的select替換成sdf&e$,同時記錄集合A中每一個元素的對應(yīng)規(guī)則,形成網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,記為集合C,也就是說集合C中包括有集合A中的每一個元素及其對應(yīng)的字符串,例如集合A為:{……,select,where,and,or,……},則集合C為:{……,select→sdf&e$,where→ergf&,and→fr#,or→g¥,……}。同時保證集合B和集合C中不含有相同的字符串,且集合B和集合C中與集合A中的每一個元素對應(yīng)的字符串中不含有與SQL關(guān)鍵字形式相同的字符串。
然后在初始化階段中把要防御的數(shù)據(jù)庫中出現(xiàn)的與集合A中的元素相同的元素(包括select、where、union、and、or等)按照集合B的規(guī)則分別替換成對應(yīng)的字符串(優(yōu)選等長度替換);接著把作為數(shù)據(jù)庫訪問端的Web服務(wù)器上網(wǎng)站程序中預(yù)先寫入的SQL語句的SQL關(guān)鍵字(包括select、where、union、and、or等)按照集合C的規(guī)則分別替換成對應(yīng)的字符串(優(yōu)選等長度替換)。
這里需要說明的是,數(shù)據(jù)庫內(nèi)容的替換和Web服務(wù)器上網(wǎng)站程序內(nèi)容的替換是兩個相互獨(dú)立的過程,無先后次序之分,集合B和集合C之間也是相互獨(dú)立的,無依賴關(guān)系,且集合B和集合C之間不包括有相同的元素,也不包括有任何SQL關(guān)鍵字。上述對數(shù)據(jù)庫內(nèi)容進(jìn)行的替換是基于集合B的規(guī)則對擬查詢訪問的數(shù)據(jù)庫中出現(xiàn)的與集合A中的元素相同的字段進(jìn)行的替換,這種替換針對的是數(shù)據(jù)庫且并不區(qū)分替換對象是否是關(guān)鍵字,因此在相關(guān)表述中,將數(shù)據(jù)庫中出現(xiàn)的集合B中的SQL關(guān)鍵字元素(如select)統(tǒng)一表述為與SQL關(guān)鍵字形式相同的字符串,因?yàn)樵跀?shù)據(jù)庫中并不存在有SQL關(guān)鍵字,但是存在著和SQL關(guān)鍵字的各字符完全一樣的字符串,如select字符串;而對Web服務(wù)器網(wǎng)站程序內(nèi)容進(jìn)行的替換是基于集合C的規(guī)則對作為數(shù)據(jù)庫訪問端口的網(wǎng)站程序中預(yù)先寫入的用于操作數(shù)據(jù)庫的靜態(tài)性質(zhì)的SQL語句中出現(xiàn)的與集合A中元素相同的SQL關(guān)鍵字進(jìn)行替換,這種替換針對的是Web服務(wù)器網(wǎng)站程序預(yù)先寫好的靜態(tài)SQL語句部分,替換的直接對象是SQL語句中的SQL關(guān)鍵字,并不對處于動態(tài)的用戶輸入部分的字段信息進(jìn)行替換,比如網(wǎng)站程序中某個select是不屬于SQL語句中的普通字符串或者屬于用戶輸入的字符串,則并不是網(wǎng)站程序中的SQL語句部分的SQL關(guān)鍵字,對該select字符串并不進(jìn)行替換,網(wǎng)站程序中用于操作一類數(shù)據(jù)庫的SQL語句通常都是固定的。
上述替換是在布置所述SQL注入攻擊防御系統(tǒng)后進(jìn)行的初始化階段的替換。然后當(dāng)Web服務(wù)器上的某個網(wǎng)站程序需要操作數(shù)據(jù)庫時,所布置的SQL注入攻擊防御系統(tǒng)截獲網(wǎng)站程序發(fā)送至數(shù)據(jù)庫的通信數(shù)據(jù),解析通信數(shù)據(jù)中用于操作數(shù)據(jù)庫的SQL語句,按以下步驟執(zhí)行防御操作:
第一步,把該SQL語句中出現(xiàn)的集合A中的元素按照集合B中對應(yīng)的規(guī)則進(jìn)行替換(例如把該SQL語句中有用戶輸入的select替換成df#g¥u),如果該SQL語句中沒有出現(xiàn)集合A中的元素,則無需進(jìn)行替換。說明:由于網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL關(guān)鍵字已經(jīng)全部按規(guī)則集合C被替換,因此SQL語句的SQL關(guān)鍵字部分不可能出現(xiàn)集合A中的元素,集合A中的元素只可能出現(xiàn)在SQL語句中用戶輸入的部分,因此若該SQL語句中沒有出現(xiàn)集合A中的元素,說明在該條SQL語句中用戶沒有輸入select、where、union、and等這一類的字符串)。
第二步,把該SQL語句中按照集合C中的規(guī)則替換過的字符串按照集合C的規(guī)則還原為對應(yīng)的SQL關(guān)鍵字(例如把sdf&e$還原成select,此處進(jìn)行還原是因?yàn)镾QL語句是由Web服務(wù)器網(wǎng)站程序生成的,由于網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL關(guān)鍵字事先在上述初始化階段被按照規(guī)則C替換過),然后把還原后的通信數(shù)據(jù)發(fā)送至數(shù)據(jù)庫;經(jīng)過還原后SQL語句中的SQL關(guān)鍵字全部被還原為正常的SQL查詢訪問關(guān)鍵字,只有作為非SQL關(guān)鍵字的用戶輸入部分的字段沒有被還原,但是該用戶輸入部分如果含有可能造成注入攻擊的SQL關(guān)鍵字,則在上述第一步中已經(jīng)被按照規(guī)則B進(jìn)行了替換,從而還原后的通信數(shù)據(jù)發(fā)送至數(shù)據(jù)庫后,如果用戶進(jìn)行了注入攻擊輸入,則整個SQL語句將會變成語法語義錯誤的語句,無法被數(shù)據(jù)庫執(zhí)行,導(dǎo)致SQL注入攻擊失敗。
第三步,當(dāng)數(shù)據(jù)庫返回結(jié)果時,所述防御系統(tǒng)截獲數(shù)據(jù)庫發(fā)送至Web服務(wù)器的通信數(shù)據(jù),解析數(shù)據(jù)庫執(zhí)行SQL語句后返回的通信數(shù)據(jù),并查詢集合B,把其中按照集合B中的規(guī)則替換過的字符串進(jìn)行還原(例如把df#g¥u還原成select),保證非攻擊性輸入的正常訪問,因?yàn)樯鲜龅谝徊街幸褜υL問數(shù)據(jù)庫的SQL語句中用戶輸入部分的與集合A中元素相同的字段進(jìn)行了替換,同時數(shù)據(jù)庫在初始化中也對與集合A中元素相同的字段進(jìn)行了同樣的替換,在非注入攻擊性訪問下,如果數(shù)據(jù)庫中存在與用戶輸入對應(yīng)相同的字段,則數(shù)據(jù)庫在執(zhí)行SQL訪問語句后能夠返回訪問結(jié)果,且需要將返回結(jié)果中經(jīng)過替換處理的字段進(jìn)行還原,最后把經(jīng)過還原處理后的通信數(shù)據(jù)發(fā)送至Web服務(wù)器。如果數(shù)據(jù)庫返回的內(nèi)容中沒有出現(xiàn)按照集合B中的規(guī)則替換過的字符串則無需進(jìn)行還原。
進(jìn)一步,為了防止攻擊者猜測Web服務(wù)器上網(wǎng)站程序中的SQL語句的SQL關(guān)鍵字(包括select、where、union、and、or等)的替換規(guī)則集合C,需要對替換規(guī)則集合C進(jìn)行動態(tài)變換,即每隔一段時間生成一套新的替換規(guī)則集合C1,然后按照新的替換規(guī)則集合C1對Web服務(wù)器上網(wǎng)站程序中的SQL語句的SQL關(guān)鍵字進(jìn)行替換,替換完畢后把舊的替換規(guī)則集合C刪除??紤]到真實(shí)的Web服務(wù)器網(wǎng)站程序中需要替換的內(nèi)容很多,每次進(jìn)行替換需要耗費(fèi)一定的時間。為了保證Web服務(wù)器能持續(xù)正常對外提供服務(wù),在網(wǎng)站程序SQL關(guān)鍵字的替換過程中,優(yōu)選的新舊兩套替換規(guī)則集合可同時被使用,當(dāng)基于舊的替換規(guī)則集合C的所有操作完成后,才對其進(jìn)行刪除,以后均按照新的集合C1替換,同時生成新的集合C1時只需要對集合C中各關(guān)鍵字元素對應(yīng)的字符串部分進(jìn)行重新生成即可。
下面基于上述發(fā)明原理,詳細(xì)給出本發(fā)明所述基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)和防御方法。
如圖1所示,本發(fā)明所述的基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)包括替換規(guī)則初始化單元11、替換規(guī)則存儲單元12、數(shù)據(jù)庫字段替換單元13、網(wǎng)站程序SQL關(guān)鍵字替換單元14、通信數(shù)據(jù)處理單元15和替換規(guī)則動態(tài)變換單元16;其中所述替換規(guī)則初始化單元11連接于替換規(guī)則存儲單元12、數(shù)據(jù)庫字段替換單元13和網(wǎng)站程序SQL關(guān)鍵字替換單元14;替換規(guī)則存儲單元12連接于數(shù)據(jù)庫字段替換單元13、網(wǎng)站程序SQL關(guān)鍵字替換單元14和通信數(shù)據(jù)處理單元15;數(shù)據(jù)庫字段替換單元13連接于替換規(guī)則存儲單元12;網(wǎng)站程序SQL關(guān)鍵字替換單元14連接于替換規(guī)則存儲單元12和替換規(guī)則動態(tài)變換單元16;通信數(shù)據(jù)處理單元15連接于替換規(guī)則存儲單元12;替換規(guī)則動態(tài)變換單元16連接于替換規(guī)則存儲單元12、網(wǎng)站程序SQL關(guān)鍵字替換單元14。
替換規(guī)則初始化單元11用于生成數(shù)據(jù)庫字段替換規(guī)則集合(集合B)和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合(集合C)。首先技術(shù)人員確定用于操作數(shù)據(jù)庫的SQL語句的全部或常用SQL關(guān)鍵字(包括select、where、union、and、or等),通過用戶配置模塊輸入,形成SQL關(guān)鍵字集合,記為集合A,替換規(guī)則初始化單元11根據(jù)用戶配置的SQL關(guān)鍵字集合A,為集合A中的每一個元素分別生成對應(yīng)的沒有具體含義、不常見的字符串(字符串隨機(jī)生成,保證不重復(fù)),優(yōu)選的生成等長的字符串,并記錄集合A中每個元素與其對應(yīng)字符串間的對應(yīng)關(guān)系(集合B中的對應(yīng)關(guān)系可表示為select→df#g¥u的形式,但不限于此),形成數(shù)據(jù)庫字段替換規(guī)則集合,記為集合B,集合B中包括有所有的SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串;然后替換規(guī)則初始化單元11把生成的集合B以及集合B的生成時間存儲到替換規(guī)則存儲單元12中,并在初始化階段通知數(shù)據(jù)庫字段替換單元13完成對數(shù)據(jù)庫字段的替換。同時替換規(guī)則初始化單元11根據(jù)用戶配置的SQL關(guān)鍵字集合A生成網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,即為集合C,同理集合C中記錄有集合A中的每個元素及其與對應(yīng)字符串間的對應(yīng)關(guān)系(集合C中的對應(yīng)關(guān)系可表示為select→sdf&e$的形式,但不限于此),即集合C中包括有所有的SQL關(guān)鍵字和每一個SQL關(guān)鍵字所對應(yīng)的替換字符串,然后替換規(guī)則初始化單元11把生成的集合C以及集合C的生成時間存儲到替換規(guī)則存儲單元12中,并在初始化階段通知網(wǎng)站程序SQL關(guān)鍵字替換單元14完成對Web服務(wù)器網(wǎng)站程序中SQL語句中的SQL關(guān)鍵字的首次替換。替換規(guī)則初始化單元11按照類似的方式生成所述集合C和集合B,但保證集合B和集合C之間沒有包括同樣的字符串,且兩者都不包括有與SQL關(guān)鍵字相同的字符串。
替換規(guī)則存儲單元12包括數(shù)據(jù)庫字段替換模規(guī)則集合存儲模塊和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊,數(shù)據(jù)庫字段替換模規(guī)則集合存儲模塊用于存儲數(shù)據(jù)庫字段替換規(guī)則集合B以及規(guī)則集合B的生成時間,網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊用于存儲網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C以及規(guī)則集合C的生成時間。
數(shù)據(jù)庫字段替換單元13接收來自替換規(guī)則初始化單元11發(fā)送過來的替換通知,對數(shù)據(jù)庫中的字段進(jìn)行的替換,具體的數(shù)據(jù)庫字段替換單元13查詢替換規(guī)則存儲單元12中的數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊,按照其中的數(shù)據(jù)庫字段替換規(guī)則集合B,把數(shù)據(jù)庫中出現(xiàn)的與集合A中的元素相同的元素(包括select、where、union、and、or等)分別替換成對應(yīng)的字符串(例如把數(shù)據(jù)庫中出現(xiàn)的select替換成df#g¥u)。
網(wǎng)站程序SQL關(guān)鍵字替換單元14接收來自替換規(guī)則初始化單元11或替換規(guī)則動態(tài)變換單元16發(fā)送過來的通知,實(shí)現(xiàn)對Web服務(wù)器上網(wǎng)站程序中SQL關(guān)鍵字的替換操作。具體的網(wǎng)站程序SQL關(guān)鍵字替換單元14收到來自替換規(guī)則初始化單元11的替換通知后,查詢替換規(guī)則存儲單元12中存儲的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C,把Web服務(wù)器上網(wǎng)站程序中的SQL語句的SQL關(guān)鍵字(包括select、where、union、and、or等)替換成集合C中對應(yīng)的字符串(例如把select替換為df#g¥u),這對應(yīng)于初始化階段的替換。網(wǎng)站程序SQL關(guān)鍵字替換單元14收到來自替換規(guī)則動態(tài)變換單元16發(fā)送過來的替換通知后,此時替換規(guī)則存儲單元12中已存儲有由替換規(guī)則動態(tài)變換單元16新生成的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C1,網(wǎng)站程序SQL關(guān)鍵字替換單元14按照新生成的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C1將Web服務(wù)器上網(wǎng)站程序中的SQL語句中的SQL關(guān)鍵字替換為對應(yīng)的替換字符串,這對應(yīng)于動態(tài)變換階段的更新替換,優(yōu)選的所述網(wǎng)站程序SQL關(guān)鍵字替換單元14中記錄有Web服務(wù)器上網(wǎng)站程序中的各SQL關(guān)鍵字的替換位置,在后續(xù)的動態(tài)變換過程中,網(wǎng)站程序SQL關(guān)鍵字替換單元14直接按照新生成的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C1對所記錄的網(wǎng)站程序替換位置的字符串進(jìn)行更新替換,這樣可以較快的完成網(wǎng)站程序中的SQL語句的動態(tài)變換。替換完成后網(wǎng)站程序SQL關(guān)鍵字替換單元14通知替換規(guī)則動態(tài)變換單元16把替換規(guī)則存儲單元12中網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則存儲模塊存儲的舊的集合C刪除(依據(jù)規(guī)則集合C的生成時間判斷)。如果替換規(guī)則存儲單元12中只有一套集合C或者基于舊集合C的操作尚未完成,則不進(jìn)行刪除操作。
通信數(shù)據(jù)處理單元15包括訪問數(shù)據(jù)處理模塊和返回結(jié)果處理模塊;訪問數(shù)據(jù)處理模塊截獲網(wǎng)站程序發(fā)送至數(shù)據(jù)庫的通信數(shù)據(jù),解析網(wǎng)站程序用于操作數(shù)據(jù)庫的SQL語句,查詢替換規(guī)則存儲單元12中數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊中的集合B和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊中的集合C,首先把該SQL語句中出現(xiàn)的與集合A中的元素相同的字符串按照集合B的規(guī)則替換為對應(yīng)的字符串(例如把select替換成df#g¥u),如果該SQL語句中沒有出現(xiàn)與集合A中元素相同的字符串,則無需進(jìn)行替換;接著把初始化階段按照集合C替換過的字符串按照集合C的規(guī)則還原為對應(yīng)的SQL關(guān)鍵字(例如把sdf&e$還原成select);最后把修改后的通信數(shù)據(jù)發(fā)送至數(shù)據(jù)庫。返回結(jié)果處理模塊處理數(shù)據(jù)庫發(fā)送至Web服務(wù)器的通信數(shù)據(jù),解析數(shù)據(jù)庫執(zhí)行SQL語句后返回的內(nèi)容,查詢替換規(guī)則存儲單元12中的數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊中的集合B,把其中按照規(guī)則集合B替換過的字符串進(jìn)行還原(例如把df#g¥u還原成select),如果沒有出現(xiàn)按照規(guī)則集合B替換過的字符串則無需進(jìn)行還原,最后把修改后的通信數(shù)據(jù)發(fā)送至Web服務(wù)器。所述的通信數(shù)據(jù)處理單元15基于替換規(guī)則存儲單元12中存儲的內(nèi)容對Web服務(wù)器和數(shù)據(jù)庫之間的通信數(shù)據(jù)進(jìn)行替換與還原操作。
替換規(guī)則動態(tài)變換單元16包括網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合生成模塊、網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合刪除模塊;網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合生成模塊每隔一段時間生成用于替換網(wǎng)站程序SQL關(guān)鍵字的一套新的規(guī)則集合C(即新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合),具體生成過程優(yōu)選為復(fù)制當(dāng)前的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合,然后對集合中各關(guān)鍵字元素對應(yīng)的字符串進(jìn)行修改,形成新的無規(guī)則字符串。所述網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合生成模塊把新生成的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C以及集合C的生成時間存儲到替換規(guī)則存儲單元12的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊中,同時通知網(wǎng)站程序SQL關(guān)鍵字替換單元14利用最新生成的集合C(通過集合C的生成時間判斷)對Web服務(wù)器上網(wǎng)站程序中的SQL關(guān)鍵字進(jìn)行替換;網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合刪除模塊接收來自網(wǎng)站程序SQL關(guān)鍵字替換單元14的通知,刪除存儲在替換規(guī)則存儲單元12中網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊中舊的集合C。
本發(fā)明進(jìn)一步給出基于上述SQL注入攻擊防御系統(tǒng)進(jìn)行的SQL注入攻擊防御方法,如附圖2所示,首先本發(fā)明所述的SQL注入攻擊防御系統(tǒng)可布置于Web服務(wù)器上,也可布置在Web服務(wù)器和數(shù)據(jù)庫之間的任意一點(diǎn),防御系統(tǒng)的布置位置不做限制,所述防御方法包括以下步驟:
步驟(1)、構(gòu)建數(shù)據(jù)庫字段替換規(guī)則集合和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合。替換規(guī)則初始化單元11基于用戶配置信息構(gòu)建SQL關(guān)鍵字集合(即為集合A),并基于集合A構(gòu)建數(shù)據(jù)庫字段替換規(guī)則集合(記為集合B)和網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合(記為集合C),并將集合B以及集合B的生成時間存儲到替換規(guī)則存儲單元12中的數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊中,將集合C以及集合C的生成時間存儲到替換規(guī)則存儲單元12中的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊中。如前所述的集合A包括了用于操作數(shù)據(jù)庫的SQL語句的SQL關(guān)鍵字,由用戶輸入配置,形式為{……select,where,and,or,……},集合B為集合A中的每一個元素對應(yīng)一個沒有具體含義、不常見的字符串,并記錄對應(yīng)關(guān)系,形式為{……,select→df#g¥u,where→r¥#de,and→@#*,or→%&,……},集合C的形成方式與集合B類似,也為集合A中的每一個元素對應(yīng)一個沒有具體含義、不常見的字符串,并記錄對應(yīng)關(guān)系,但是集合C中不包括集合B中已經(jīng)出現(xiàn)過的字符串,集合C的形式為{……,select→sdf&e$,where→ergf&,and→fr#,or→g¥,……},優(yōu)選的集合B和集合C為集合A中的每一個元素對應(yīng)等長度的字符串,且字符串中不包括集合A中的SQL關(guān)鍵字元素本身。由于集合B和集合C中同時包括有集合A中的各元素和其對應(yīng)的字符串,因此在后續(xù)各替換操作中基于集合B和集合C即可完成。
步驟(2)、進(jìn)行初始化替換操作,具體包括:
(2-1)、替換規(guī)則初始化單元11通知數(shù)據(jù)庫字段替換單元13進(jìn)行數(shù)據(jù)庫字段的替換,數(shù)據(jù)庫字段替換單元13查詢替換規(guī)則存儲單元12,得到數(shù)據(jù)庫字段替換規(guī)則集合B,然后對數(shù)據(jù)庫進(jìn)行查詢操作,將數(shù)據(jù)庫中出現(xiàn)的與集合A中的元素相同的元素按照集合B中的對應(yīng)規(guī)則分別替換成對應(yīng)的字符串;
(2-2)、替換規(guī)則初始化單元11通知網(wǎng)站程序SQL關(guān)鍵字替換單元14進(jìn)行Web服務(wù)器上網(wǎng)站程序中SQL關(guān)鍵字的替換,網(wǎng)站程序SQL關(guān)鍵字替換單元14查詢替換規(guī)則存儲單元12,得到網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C,然后對Web服務(wù)器上的網(wǎng)站程序進(jìn)行查詢操作,將網(wǎng)站程序中的SQL語句的SQL關(guān)鍵字按照集合C中的對應(yīng)規(guī)則分別替換成對應(yīng)的字符串,完成對Web服務(wù)器網(wǎng)站程序中SQL關(guān)鍵字的初始化替換。
步驟(3)、初始化替換后,當(dāng)Web服務(wù)器上的某個網(wǎng)站程序操作數(shù)據(jù)庫時,通信數(shù)據(jù)處理單元15截獲網(wǎng)站程序發(fā)送至數(shù)據(jù)庫的通信數(shù)據(jù),解析通信數(shù)據(jù)中用于操作數(shù)據(jù)庫的SQL語句,并執(zhí)行如下操作:
(3-1):通信數(shù)據(jù)處理單元15查詢替換規(guī)則存儲單元12中的數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊,把截獲的SQL語句中出現(xiàn)的與集合A中的元素相同的元素按照集合B中的對應(yīng)規(guī)則替換為對應(yīng)的字符串,如果該SQL語句中沒有出現(xiàn)與集合A中的元素相同的元素(說明在該條SQL語句中用戶沒有輸入select、where、union、and等SQL關(guān)鍵字,因?yàn)槌脩糨斎氩糠忠酝獾腟QL關(guān)鍵字已經(jīng)在初始化階段全部被替換),則無需進(jìn)行替換;
(3-2):通信數(shù)據(jù)處理單元15查詢替換規(guī)則存儲單元12中的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊,把截獲的SQL語句中按照集合C替換過的字符串再次按照集合C中的對應(yīng)規(guī)則還原為對應(yīng)的SQL關(guān)鍵字,然后通信處理單元15把SQL語句經(jīng)過還原的所述通信數(shù)據(jù)發(fā)送至數(shù)據(jù)庫;在該步驟中,經(jīng)過還原后SQL語句中的SQL關(guān)鍵字全部被還原為正常的SQL查詢訪問關(guān)鍵字,只有作為非SQL關(guān)鍵字的用戶輸入部分的字段沒有被還原,但是該用戶輸入部分如果含有可能造成注入攻擊的SQL關(guān)鍵字,則在上述(3-1)步驟中已被按照規(guī)則B替換成了不規(guī)則的字符串,含有該不規(guī)則字符串的SQL語句到達(dá)數(shù)據(jù)庫后將會變成語法語義錯誤的語句,不會被數(shù)據(jù)庫執(zhí)行,導(dǎo)致SQL注入攻擊失敗(參見實(shí)施例3)。
步驟(4)、數(shù)據(jù)庫向Web服務(wù)器返回訪問結(jié)果時,通信數(shù)據(jù)處理單元15截獲數(shù)據(jù)庫發(fā)送至Web服務(wù)器的通信數(shù)據(jù),解析通信數(shù)據(jù)中數(shù)據(jù)庫執(zhí)行SQL語句后返回的內(nèi)容,并執(zhí)行如下操作:查詢替換規(guī)則存儲單元12中的數(shù)據(jù)庫字段替換規(guī)則集合存儲模塊,把返回結(jié)果中包括的按照集合B中替換過的字符串再次按照集合B中的對應(yīng)規(guī)則還原為對應(yīng)的元素(例如把df#g¥u還原成select),如果數(shù)據(jù)庫執(zhí)行SQL語句后返回的內(nèi)容中沒有出現(xiàn)按照集合B替換過的字符串則無需進(jìn)行還原操作,最后通信處理單元15把修改后的通信數(shù)據(jù)發(fā)送至Web服務(wù)器。通過該步驟能夠保證非攻擊性輸入的正常訪問,因?yàn)樯鲜霾襟E(3-1)中已對訪問數(shù)據(jù)庫的SQL語句中用戶輸入部分中的與集合A中元素相同的字段進(jìn)行了替換,同時數(shù)據(jù)庫在初始化中也對與集合A中元素相同的字段進(jìn)行了同樣的替換,在非注入攻擊性訪問下,如果數(shù)據(jù)庫中存在與用戶輸入對應(yīng)相同的字段,則數(shù)據(jù)庫在執(zhí)行SQL訪問語句后能夠返回訪問結(jié)果,且需要將返回結(jié)果中經(jīng)過替換處理的字段進(jìn)行還原,最后把經(jīng)過還原處理后的通信數(shù)據(jù)發(fā)送至Web服務(wù)器(參見實(shí)施例2)。
步驟(5)、替換規(guī)則動態(tài)變換單元16的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合生成模塊每隔一段時間生成一套新的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C,把新生成的集合C以及新集合C的生成時間存儲到替換規(guī)則存儲單元12的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合存儲模塊中,然后通知網(wǎng)站程序SQL關(guān)鍵字替換單元14利用最新生成的集合C(通過集合C的生成時間判斷)對Web服務(wù)器上網(wǎng)站程序中的SQL語句的SQL關(guān)鍵字進(jìn)行替換,即通知網(wǎng)站程序SQL關(guān)鍵字替換單元14執(zhí)行上述步驟(2-2)。替換完成后網(wǎng)站程序SQL關(guān)鍵字替換單元14通知替換規(guī)則動態(tài)變換單元16的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合刪除模塊把替換規(guī)則存儲單元12中網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則存儲模塊存儲的舊的集合C刪除(依據(jù)集合C的生成時間判斷)。
本發(fā)明提出的SQL注入攻擊防御方法通過對SQL語句進(jìn)行替換變換,使得攻擊者惡意注入的SQL語句會變成不符合數(shù)據(jù)庫語法規(guī)范的語句而無法被執(zhí)行,進(jìn)而有效防御了SQL注入攻擊行為,為進(jìn)一步的理解本發(fā)明的方案,下面給出布置本發(fā)明所述防御系統(tǒng)后正常用戶操作數(shù)據(jù)庫和SQL注入攻擊具體的實(shí)施例。
實(shí)施例1
實(shí)施例1為正常用戶操作數(shù)據(jù)庫的例子。假設(shè)某個網(wǎng)站程序中登錄驗(yàn)證的SQL查詢語句為select*from users where name='用戶輸入的用戶名'and pw='用戶輸入的密碼';正確的用戶名為admin,正確的密碼為password,用戶名admin和密碼password存儲在數(shù)據(jù)庫中。根據(jù)用戶配置的SQL關(guān)鍵字集合A為{……、select、where、and、……}。根據(jù)集合A構(gòu)建的數(shù)據(jù)庫字段替換規(guī)則集合B為{……、select→字符串a(chǎn),where→字符串b,and→字符串c、……}(此處是為了便于敘述,對替換的不規(guī)則字符串進(jìn)行了簡略描述);根據(jù)集合A構(gòu)建的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C為{……、select→字符串h,where→字符串i,and→字符串j、……}(此處是為了便于敘述,對替換字符串同樣進(jìn)行了簡略描述,字符串h、i、j不同于字符串a(chǎn)、b、c)。首先按照集合B對數(shù)據(jù)庫內(nèi)容進(jìn)行初始替換,即把數(shù)據(jù)庫中出現(xiàn)的select替換成字符串a(chǎn),where替換成字符串b,and替換成字符串c,等等,同時按照集合C對網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL語句的SQL關(guān)鍵字進(jìn)行替換,即把網(wǎng)站程序中的select替換成字符串h,where替換成字符串i,and替換成字符串j。假設(shè)用戶輸入正確的用戶名和密碼查詢數(shù)據(jù)庫,則從網(wǎng)站程序發(fā)往數(shù)據(jù)庫的SQL語句為h*from users i name='admin'j pw='password',防御系統(tǒng)截獲該條SQL語句后,由于該SQL語句中已經(jīng)沒有集合A中的元素,因此無需按照規(guī)則集合B進(jìn)行替換,接著查詢集合C,把按照集合C替換過的字符串進(jìn)行還原(把字符串h還原成select,字符串i還原成where,字符串j還原成and),則該SQL語句被還原成select*from users where name='admin'and pw='password',這是一條符合數(shù)據(jù)庫語法規(guī)范的SQL語句,發(fā)到數(shù)據(jù)庫后能正常執(zhí)行,在此例中防御系統(tǒng)對正常用戶操作數(shù)據(jù)庫而言是透明的。
實(shí)施例2
下面給出正常用戶操作數(shù)據(jù)庫的第二個例子。假設(shè)某個網(wǎng)站程序中登錄驗(yàn)證的SQL查詢語句為select*from users where name='用戶輸入的用戶名'and pw='用戶輸入的密碼';正確的用戶名為select,正確的密碼為password,用戶名select和密碼password存儲在數(shù)據(jù)庫中。根據(jù)用戶配置的SQL關(guān)鍵字集合A為{……、select、where、and、……}。根據(jù)集合A構(gòu)建的數(shù)據(jù)庫字段替換規(guī)則集合B為{……、select→字符串a(chǎn),where→字符串b,and→字符串c、……}(此處是為了便于敘述,對替換的不規(guī)則字符串進(jìn)行了簡略描述);根據(jù)集合A構(gòu)建的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C為{……、select→字符串h,where→字符串i,and→字符串j、……}(此處是為了便于敘述,對替換字符串同樣進(jìn)行了簡略描述,字符串h、i、j不同于字符串a(chǎn)、b、c)。首先按照集合B對數(shù)據(jù)庫內(nèi)容進(jìn)行初始替換,即把數(shù)據(jù)庫中出現(xiàn)的select替換成字符串a(chǎn),where替換成字符串b,and替換成字符串c,等等,同時按照集合C對網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL語句的SQL關(guān)鍵字進(jìn)行替換,即把網(wǎng)站程序中的select替換成字符串h,where替換成字符串i,and替換成字符串j。假設(shè)用戶輸入正確的用戶名和密碼查詢數(shù)據(jù)庫,則從網(wǎng)站程序發(fā)往數(shù)據(jù)庫的SQL語句為h*from users i name='select'j pw='password',防御系統(tǒng)截獲該條SQL語句后,由于該SQL語句中含有集合A中的元素select,需按照集合B的規(guī)則(select→字符串a(chǎn))替換為字符串a(chǎn),該SQL語句變?yōu)閔*from users i name='a'j pw='password';接著查詢集合C,把按照集合C替換過的字符串進(jìn)行還原(把字符串h還原成select,字符串i還原成where,字符串j還原成and),則該SQL語句被還原成select*from users where name='a'and pw='password',由于數(shù)據(jù)庫中的select已經(jīng)被替換成字符串a(chǎn)了,因此這是一條符合數(shù)據(jù)庫語法規(guī)范的SQL語句,發(fā)到數(shù)據(jù)庫后能正常執(zhí)行,在此例中防御系統(tǒng)對正常用戶操作數(shù)據(jù)庫而言也是透明的,同時數(shù)據(jù)庫執(zhí)行該語句時由于數(shù)據(jù)庫中的select已經(jīng)被替換成字符串a(chǎn),因此能夠找到字符串a(chǎn),數(shù)據(jù)庫的返回結(jié)果中如果包括字符串a(chǎn),在此需要根據(jù)集合B將字符串a(chǎn)還原為select,保證了這種情況下的數(shù)據(jù)正常訪問。
實(shí)施例3
下面給出SQL注入攻擊的例子。
假設(shè)某個網(wǎng)站程序中登錄驗(yàn)證的SQL查詢語句為select*from users where name='用戶輸入的用戶名'and pw='用戶輸入的密碼';正確的用戶名為admin,正確的密碼為password,用戶名admin和密碼password存儲在數(shù)據(jù)庫中。如果攻擊者輸入的用戶名為1'or'1'='1,輸入的密碼為1'or'1'='1,在沒有布置本發(fā)明所述防御系統(tǒng)下,發(fā)往數(shù)據(jù)庫的SQL語句會變成select*from users where name='1'or'1'='1'and pw='1'or'1'='1',也即等價于select*from users,攻擊者通過這樣的注入,可以實(shí)現(xiàn)無賬號密碼登錄網(wǎng)站,達(dá)到其攻擊目的。但是在布置本發(fā)明所述的防御系統(tǒng)后,根據(jù)本發(fā)明所述防御系統(tǒng)的方案,首先構(gòu)建SQL關(guān)鍵字集合A為{……、select、where、and、or、……}。根據(jù)集合A構(gòu)建的數(shù)據(jù)庫字段替換規(guī)則集合B為{……、select→字符串a(chǎn)、where→字符串b、and→字符串c、or→字符串d、……}(此處是為了便于敘述,對替換的不規(guī)則字符串進(jìn)行了簡略描述);根據(jù)集合A構(gòu)建的網(wǎng)站程序SQL關(guān)鍵字替換規(guī)則集合C為{……、select→字符串h,where→字符串i,and→字符串j、or→字符串k、……}(此處是為了便于敘述,對替換字符串同樣進(jìn)行了簡略描述,字符串h、i、j、k不同于字符串a(chǎn)、b、c、d)。首先按照集合B對數(shù)據(jù)庫內(nèi)容進(jìn)行初始替換,即把數(shù)據(jù)庫中出現(xiàn)的select替換成字符串a(chǎn),where替換成字符串b,and替換成字符串c,or替換成字符串d,等等,同時按照集合C對網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL語句的SQL關(guān)鍵字進(jìn)行替換,即把網(wǎng)站程序中的select替換成字符串h,where替換成字符串i,and替換成字符串j。由于該網(wǎng)站程序中用于操作數(shù)據(jù)庫的SQL關(guān)鍵字中并不包括or,因此不進(jìn)行or的替換。假設(shè)攻擊者輸入的用戶名為1'or'1'='1,輸入的密碼為1'or'1'='1,則從網(wǎng)站程序發(fā)往數(shù)據(jù)庫的SQL語句變?yōu)閔*from users i name='1'or'1'='1'j pw='1'or'1'='1',防御系統(tǒng)截獲該條SQL語句后,由于該SQL語句中含有集合A中的元素or,將會把該SQL語句中的or按照集合B的規(guī)則(or→字符串d)替換為字符串d,則該SQL語句將變成h*from users i name='1'd'1'='1'j pw='1'd'1'='1';然后查詢集合C,把按照集合C替換過的字符串進(jìn)行還原(把字符串h還原成select,字符串i還原成where,字符串j還原成and),則該SQL語句被還原成select*from users where name='1'd'1'='1'and pw='1'd'1'='1',這是一條不符合數(shù)據(jù)庫語法規(guī)范的SQL語句,發(fā)到數(shù)據(jù)庫后能不能正常執(zhí)行,直接導(dǎo)致SQL注入攻擊失敗。
布置本發(fā)明所述基于動態(tài)變換的SQL注入攻擊防御系統(tǒng)后,對于正常訪問Web服務(wù)器及后臺數(shù)據(jù)庫的請求而言是透明的,而對于SQL注入攻擊,攻擊者惡意注入的SQL語句經(jīng)過系統(tǒng)的字段替換后會變成不符合數(shù)據(jù)庫語法規(guī)范的語句而無法執(zhí)行,從而杜絕了攻擊者通過修改應(yīng)用程序的Web表單的輸入域或頁面請求中的查詢字符串等插入一系列的SQL命令來改變數(shù)據(jù)庫查詢語句以欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行惡意SQL命令的情況發(fā)生,有效防御了SQL注入攻擊行為,提升了對Web服務(wù)器及其后臺數(shù)據(jù)庫的安全防護(hù)。
以上僅是對本發(fā)明的優(yōu)選實(shí)施方式進(jìn)行了描述,并不將本發(fā)明的技術(shù)方案限制于此,本領(lǐng)域技術(shù)人員在本發(fā)明的主要技術(shù)構(gòu)思的基礎(chǔ)上所作的任何公知變形都屬于本發(fā)明所要保護(hù)的技術(shù)范疇,本發(fā)明具體的保護(hù)范圍以權(quán)利要求書的記載為準(zhǔn)。