韓宸望,林 暉,饒緒黎,黃 川
1(福建師范大學(xué) 數(shù)學(xué)與計算機(jī)科學(xué)學(xué)院,福州 350117)2(福建師范大學(xué) 福建省網(wǎng)絡(luò)安全與密碼技術(shù)重點實驗室,福州 350117)3(福州職業(yè)技術(shù)學(xué)院 信息技術(shù)工程系,福州 350108)
隨著Web 3.0時代的到來以及B/S模式的迅速發(fā)展,Web技術(shù)在許多領(lǐng)域都得到了廣泛的應(yīng)用,且已成為世界經(jīng)濟(jì)發(fā)展中的關(guān)鍵技術(shù)之一[1].與此同時,Web的安全問題也日趨嚴(yán)峻,Web安全威脅已經(jīng)成為網(wǎng)絡(luò)安全威脅最主要的來源之一.因此,對Web安全的研究也成為了目前網(wǎng)絡(luò)安全領(lǐng)域的重點和熱點[2].其中,SQL注入作為Web應(yīng)用程序面臨的最普遍、最高危的攻擊之一,連續(xù)多年位列OWASP(開放式Web應(yīng)用程序安全項目,Open Web Application Security Project)年度十大攻擊行為,并且多次排名第一.
基于上述分析,本文結(jié)合URL長度、訪問頻率及SQL語法樹,提出了一種新的SQL注入過濾方法——LFS (length-frequency-SQL syntax tree)過濾方法.該方法包括學(xué)習(xí)和過濾兩個階段.學(xué)習(xí)階段在安全的環(huán)境下進(jìn)行,通過爬蟲和數(shù)據(jù)庫代理,根據(jù)用戶提供的爬蟲啟始數(shù)據(jù)進(jìn)行爬取,生成URL和SQL語句的映射表.過濾階段工作在現(xiàn)實環(huán)境下,通過檢測長度、連接頻率、SQL語法樹特征,以此來檢測SQL注入攻擊.仿真實驗及結(jié)果分析表明LFS方法相較于傳統(tǒng)的關(guān)鍵字過濾和正則表達(dá)式過濾能夠更有效的防止SQL注入攻擊.
針對SQL注入攻擊檢測,國內(nèi)外研究人員已經(jīng)做了大量的研究工作,并且取得了一定的研究成果.張燕等[3]提出了一種基于數(shù)據(jù)挖掘技術(shù)的SQL注入攻擊檢測方法.該方法首先收集了數(shù)據(jù)庫日志中內(nèi)部查詢樹;然后,根據(jù)查詢樹的語義、語法特征和查詢樹類型提取查詢樹的特征向量;最后,根據(jù)多項式核函數(shù)SVM對這些特征向量進(jìn)行分類,從而實現(xiàn)SQL攻擊檢測.
黃保華等人[4]提出了一種SQL語句塊摘要樹模型,用于檢測SQL注入攻擊.基于該模型的SQL注入檢測對SQL語句序列進(jìn)行了檢測,有效地提高了攔截率,但是在數(shù)據(jù)庫連接共享的環(huán)境中,該模型由于需要對順序執(zhí)行的SQL序列進(jìn)行檢測導(dǎo)致實施起來存在一定的困難.趙宇飛等人[5]根據(jù)SQL注入攻擊的網(wǎng)絡(luò)流量與正常用戶請求的網(wǎng)絡(luò)流量有較大的區(qū)別,以網(wǎng)絡(luò)流量分析的角度,提出了LFF(length-frequencyfeature)檢測方法.張志超等人[6]結(jié)合人工神經(jīng)元網(wǎng)絡(luò),提出了一種基于人工神經(jīng)元網(wǎng)絡(luò)的SQL注入漏洞的分析模型.該模型利用人工神經(jīng)網(wǎng)絡(luò)算法對用戶輸入的SQL語句進(jìn)行檢測,從而判斷用戶是否在進(jìn)行SQL注入攻擊.
王偉平等人[7]利用正則表達(dá)式對SQL注入攻擊的特征進(jìn)行描述,并提出了基于正則表達(dá)式的SQL注入攻擊過濾方案.該方案與關(guān)鍵字過濾相比,具有更高的識別率和較低的誤報率.Ivan Ristc開發(fā)的開源項目ModSecurity[8]和Roesch M開發(fā)的入侵檢測軟件Snort[9]同樣根據(jù)SQL注入攻擊的特征定制SQL注入攻擊的特征規(guī)則集,并以此過濾用戶的輸入來抵擋SQL注入攻擊.田玉杰等人[10]提出了一種基于分類的SQL注入攻擊雙層防御模型.該模型采用了基于Http請求分類的用戶輸入過濾,以此降低用戶輸入過對正常數(shù)據(jù)的誤報率.應(yīng)用SQL語法結(jié)構(gòu)比較和于參數(shù)化分類的動態(tài)查詢匹配,從而提高了用戶輸入過濾的攔截率和語法結(jié)構(gòu)比較的檢測效率.
Ain Zubaidah Mohd Saleh等人[11]將提出了一種Web應(yīng)用程序漏洞檢測方法.該方法結(jié)合了Boyer-Moore字符串查找算法,能夠有效地檢測多種Web安全漏洞,例如SQL注入,XSS等Web安全漏洞.Nency Patel等人[12]改進(jìn)了Aho-Corasick模式匹配算法,并將該算法應(yīng)用于SQL注入攻擊防御.傳統(tǒng)的防止SQL注入的模式匹配往往采用靜態(tài)的模式匹配算法.但是改進(jìn)的Aho-Corasick模式匹配算法能夠捕捉SQL注入引起的新異常模式,并將反復(fù)出現(xiàn)的新異常模式自動加入模式匹配庫中.Jemal Abawajy等人[13]針對SQL注入攻擊在RFID系統(tǒng)中的危害,提出了一種基于策略的SQL注入攻擊檢測方法.該方法通過制定合法的SQL查詢語句規(guī)則形成規(guī)則庫,之后對RFID系統(tǒng)傳輸?shù)臄?shù)據(jù)進(jìn)行攔截驗證,并根據(jù)合法的SQL查詢語句規(guī)則庫進(jìn)行檢測,以此來防御SQL注入.
同時,還可以通過采用參數(shù)化查詢,在代碼層對SQL注入攻擊進(jìn)行防御[14].使用參數(shù)化查詢訪問數(shù)據(jù)庫,能夠防止SQL注入,使Web應(yīng)用程序更加安全.此外,通過對存儲過程的訪問權(quán)限的正確配置也能夠防止SQL注入,提高系統(tǒng)安全性.存儲過程將一組SQL語句集編譯后存儲在數(shù)據(jù)庫中,以此來提高安全性、防止SQL注入.例如,黃龍軍[15]在網(wǎng)上考試系統(tǒng)中利用SQL Server存儲過程有效地防御SQL注入攻擊,提高了系統(tǒng)的安全性.
SQL注入攻擊是一種由攻擊者通過影響應(yīng)用程序向后臺數(shù)據(jù)庫傳遞的SQL查詢而引發(fā)的攻擊.SQL注入攻擊是一種通過操縱Web輸入來修改后臺SQL語句以利用代碼進(jìn)行攻擊的技術(shù)[16].雖然不同種類的SQL注入的攻擊方式有所區(qū)別,但它們的原理和過程基本相同.SQL注入攻擊過程和原理如圖1所示.
攻擊者在登錄界面使用賬號admin’和密碼admin進(jìn)行登錄.客戶端瀏覽器向Web服務(wù)器發(fā)送URL為:http://www.test.com/login.asp?username=ad min’&password=admin的請求.之后Web服務(wù)器向數(shù)據(jù)庫服務(wù)器發(fā)送SQL語句,該SQL語句為:select * from accounts where username=’admin’ and password=’admin’.數(shù)據(jù)庫執(zhí)行該SQL語句后向Web服務(wù)器返回敏感信息,并最終由Web服務(wù)器將該敏感信息轉(zhuǎn)發(fā)給了客戶端瀏覽器,從而被攻擊者獲取.
圖1 SQL注入攻擊過程
對于特定的Web應(yīng)用程序,其發(fā)送的HTTP請求報文的URL和參數(shù)與Web應(yīng)用程序收到請求報文執(zhí)行的SQL語句存在一定的映射關(guān)系.并且任何擁有SQL攻擊特征的輸入都將改變原有的SQL語句的語法結(jié)構(gòu).因此若用戶輸入構(gòu)成的SQL語句的語法結(jié)構(gòu)和期望中的語法結(jié)構(gòu)不一致,則該輸入為SQL注入.本文方法基于上述前提,提出了一種新的SQL注入過濾方法,該方法將SQL注入防護(hù)分為兩個階段:學(xué)習(xí)階段和過濾階段.
學(xué)習(xí)階段工作在安全環(huán)境下,利用爬蟲和數(shù)據(jù)庫代理,根據(jù)用戶提供的啟始文件(XML文件),該文件包含爬蟲的啟始數(shù)據(jù),對該Web應(yīng)用程序進(jìn)行爬取,生成該Web應(yīng)用程序的HTTP請求報文中的URL和Web應(yīng)用程序執(zhí)行的SQL語句的映射表(XML文件).其運行環(huán)境如圖2所示.
圖2 學(xué)習(xí)階段運行環(huán)境
以圖1為例,假設(shè)用戶發(fā)送的URL為http://www.test.com/login.asp?username=admin&password=123456&type=admin,則之后Web應(yīng)用程式執(zhí)行的SQL語句為:select * from accounts where username=‘a(chǎn)dmin’ and password=‘123456’ and type=‘a(chǎn)dmin’.過濾系統(tǒng)先對該SQL語句進(jìn)行解析生成對應(yīng)的語法樹,之后將語法樹的結(jié)點與爬蟲發(fā)出的HTTP報文中的數(shù)據(jù)進(jìn)行對比,其數(shù)據(jù)發(fā)出時必須不重復(fù),并且不包含有SQL關(guān)鍵字如select,and,or等.若數(shù)據(jù)一致并且該數(shù)據(jù)在原SQL語句中被‘’(一對單引號)所引用,則該數(shù)據(jù)類型為字符型,將SQL語句中對應(yīng)的數(shù)據(jù)改為該數(shù)據(jù)對應(yīng)的Http數(shù)據(jù)報文中的參數(shù)名.若數(shù)據(jù)一致,該數(shù)據(jù)為數(shù)字并且在原SQL語句中沒有被‘’所引用,則該數(shù)據(jù)類型為數(shù)字型,將SQL語句中對應(yīng)的數(shù)據(jù)改為該數(shù)據(jù)對應(yīng)的Http數(shù)據(jù)報文中的參數(shù)名并在該參數(shù)名兩側(cè)加上*符號.據(jù)此將Web生成的SQL語句改為:select *from accounts where username=‘username’ and password=‘passwor d’ and type=‘type’.若該 url會根據(jù)用戶輸入的執(zhí)行不同的SQL語句,則需在相應(yīng)的啟始文件寫入各種情況的啟始數(shù)據(jù)并將該對應(yīng)的<param>的change屬性設(shè)置為true.生成的映射表(XML文件)利用選擇標(biāo)簽<if>和<elseif>分情況存儲SQL語句.假設(shè)上面的例子根據(jù)type屬性執(zhí)行不同的SQL語句,則圖3和圖4分別給出了相對應(yīng)的啟始文件和URL與SQL語句映射表的XML文件.表1和表2分別給出了啟始文件的標(biāo)簽和映射表標(biāo)簽.其中圖3的sql標(biāo)簽的元素 where username =‘username’ and password = ‘password’中,其中對 SQL 的抽取的原理如下.
圖3 啟始文件數(shù)據(jù)
圖4 URL和SQL語句映射表
表1 爬蟲啟始數(shù)據(jù)XML文件標(biāo)簽
表2 映射表標(biāo)簽
SQL注入攻擊往往會改變原有的SQL語句語法樹的結(jié)構(gòu).以 SQL 語句“select a from b where c=?”(其中? 為占位符)為例,對于正常的用戶輸入,假設(shè)用戶輸入為admin,則其SQL語法樹結(jié)構(gòu)如圖5所示.對于SQL 注入攻擊,假設(shè)用戶輸入為 admin ‘or’ 1 ‘=’ 1 ,則其SQL語法樹結(jié)構(gòu)如圖6所示.由圖5和圖6中的語法樹結(jié)構(gòu)可見,由于SQL語句“select a from b where c=?”(其中? 為占位符)中用戶輸入的數(shù)據(jù)位于where子樹,所以其它SQL語法樹中并沒有改變結(jié)構(gòu).因此對SQL的抽取沒有必要抽取整個SQL語句,只需根據(jù)用戶輸入數(shù)據(jù)所對應(yīng)的位置,對該子樹進(jìn)行解析并記錄下該子樹的根節(jié)點和特征(該子樹的結(jié)點總數(shù)),抽取對應(yīng)的SQL語句.以SQL語句“select a from b where c=?”(其中? 為占位符)為例,則對應(yīng)抽取的SQL語句為:where c=?(其中? 為占位符,根據(jù)與爬蟲發(fā)出的數(shù)據(jù)的對比結(jié)果確定的Http數(shù)據(jù)報文中的參數(shù)名),并記錄該子樹根結(jié)點為where,特征為4.
圖5 正常的SQL語法樹
圖6 注入攻擊SQL語法樹
過濾階段工作在現(xiàn)實環(huán)境下,通過檢測長度、連接頻率,并根據(jù)映射表和用戶的輸入構(gòu)建SQL語句,再對該SQL語句進(jìn)行解析獲取特征值,之后將該特征值與映射表的SQL語句特征進(jìn)行匹配,以此來檢測SQL注入攻擊.其工作環(huán)境如圖7所示.
圖7 注入攻擊SQL語法樹
在HTTP的get請求方式中,SQL注入攻擊過程往往需要向URL中拼接SQL語句,所以SQL注入的URL長度相較于正常的URL長度會有所區(qū)別.因此當(dāng)HTTP的URL長度超過某個閾值時,則該用戶輸入可能為SQL注入攻擊,需要進(jìn)行進(jìn)一步判斷.文獻(xiàn)[7]中研究表明,大部分的HTTP的get請求方式中URL的長度普遍在5–70 byte之間,所以本文設(shè)置URL長度閾值為70 byte,當(dāng)URL長度大于70時,則記錄該請求由人工進(jìn)行進(jìn)一步判斷.
SQL注入攻擊的HTTP連接頻率往往高于正常用戶的HTTP連接頻率.所以,單位時間內(nèi)HTTP請求的三元組<源IP,目的IP,目的端口>的頻率能夠作為檢測SQL注入的一個標(biāo)準(zhǔn).文獻(xiàn)[7]中研究表明,正常網(wǎng)絡(luò)的HTTP連接頻率為4.87次/s,但其中大部分連接頻率遠(yuǎn)低于該值.因此,本文將連接頻率的閾值定為3次/s.檢測中,如果某個三元組的連接頻率大于3次/秒,則記錄該請求由人工進(jìn)行進(jìn)一步判斷.
SQL注入攻擊往往會改變原有的SQL語法樹結(jié)構(gòu).因此,可以根據(jù)用戶的輸入提取映射表中對應(yīng)的SQL語句信息,之后根據(jù)相應(yīng)的信息進(jìn)行SQL解析.再與映射表的SQL語句特征進(jìn)行匹配,若匹配成功則為正常輸入.若匹配失敗則為SQL注入攻擊.以上文中的圖4為例,假設(shè)用戶的正常輸入為admin和123456,則對應(yīng)的解析后的SQL語法樹子樹如圖8所示.假設(shè)SQL注入攻擊的輸入為admin和123456’or’1’=’1,則對應(yīng)的解析后的 SQL 語法樹子樹如圖9所示.由此可見用戶正常輸入的SQL語法樹子樹的特征與SQL注入攻擊的SQL語法樹子樹的特征有所區(qū)別.因此,可以根據(jù)SQL語法樹子樹的特征來檢測SQL注入攻擊.
本文提出的SQL注入過濾方法的學(xué)習(xí)階段的具體流程描述如下:
步驟1.讀取用戶提供的爬蟲啟始數(shù)據(jù)放入待抓取URL隊列并生成URL與SQL語句的映射表.之后讀取待抓取URL隊列的隊頭數(shù)據(jù).
步驟2.判斷步驟1中提取的URL是在已抓取URL隊列中,若存在則直接結(jié)束,準(zhǔn)備讀取下一個待抓取URL.若不存在則進(jìn)行步驟3.
步驟3.發(fā)送HTTP請求,并根據(jù)其中的URL和請求方式在映射表中相應(yīng)的位置生成<url>和<type>標(biāo)簽.之后獲取SQL語句并解析成SQL語法樹.
圖8 正常輸入的SQL語法樹中的where子樹
圖9 SQL注入攻擊的SQL語法樹中的where子樹
步驟4.將步驟3生成的SQL語法樹的葉子結(jié)點逐個與HTTP報文中參數(shù)的數(shù)據(jù)進(jìn)行比較.若數(shù)據(jù)不一致,則比較下一個結(jié)點;若所有結(jié)點都不一致,則直接結(jié)束,準(zhǔn)備讀取下一個待抓取URL;若數(shù)據(jù)一致,則進(jìn)行步驟5.
步驟5.判斷步驟4的數(shù)據(jù)是否被’’所引用,若被’’所引用,則該數(shù)據(jù)類型為字符型,將SQL語句中對應(yīng)的數(shù)據(jù)改為該數(shù)據(jù)對應(yīng)的Http數(shù)據(jù)報文中的參數(shù)名.若該數(shù)據(jù)為數(shù)字并且在原SQL語句中沒有被’’所引用,則該數(shù)據(jù)類型為數(shù)字型,將SQL語句中對應(yīng)的數(shù)據(jù)改為該數(shù)據(jù)對應(yīng)的Http數(shù)據(jù)報文中的參數(shù)名并在該參數(shù)名兩側(cè)加上*符號.
步驟6.抽取SQL語法樹,記錄下抽取子樹的根結(jié)點和特征.之后在映射表中對應(yīng)的<url>標(biāo)簽中生成對應(yīng)的<sql>標(biāo)簽.
步驟7.準(zhǔn)備讀取下一個待抓取URL,重復(fù)步驟1到步驟6.
本文提出的SQL注入過濾方法的過濾階段的具體流程描述如下:
步驟1.首先,將對HTTP請求方式進(jìn)行判斷.如果是GET方式,提取URL進(jìn)入步驟2,如果是POST方式,提取實體進(jìn)入步驟3.
步驟2.對URL的長度進(jìn)行檢測,若長度大于70 byte,則記錄該請求由人工進(jìn)行進(jìn)一步判斷,之后進(jìn)入步驟3.否則直接進(jìn)入步驟3.
步驟3.提取當(dāng)前HTTP請求中的三元組<源IP,目的IP,目的端口>,若其不存在于三元組表中,則創(chuàng)建該三元組.若存在于三元組表中,則相應(yīng)的三元組連接數(shù)加1,并對該三元組進(jìn)行連接頻率檢測,若連接頻率大于3次/秒,則記錄該請求由人工進(jìn)行進(jìn)一步判斷,之后進(jìn)入步驟4.否則直接進(jìn)入步驟4.
步驟4.根據(jù)URL查找學(xué)習(xí)階段生成的URL和SQL語句映射表,獲取相應(yīng)的SQL語句,子樹根結(jié)點,語法樹特征等信息.從HTTP請求中提取相應(yīng)的參數(shù)值,構(gòu)建SQL子句.根據(jù)映射表中的子樹根結(jié)點,對該SQL子句進(jìn)行進(jìn)行對應(yīng)的SQL解析得到SQL語法子樹.若解析析失敗則進(jìn)行二次解析;若解析成功繼續(xù)步驟5.二次解析時過濾模塊自動生成完整的SQL語句進(jìn)行解析.以上文中的 where username=’admin’ and password=’123456’ and type=’admin’為例,生成 select a from b where username=’admin’ and password=’123456’and type=’admin’進(jìn)行解析.若仍解析失敗則判斷該輸入為SQL注入攻擊,解析成功則繼續(xù)步驟5.
步驟5.將步驟4生成的SQL語法子樹的特征(SQL語法子樹的結(jié)點總數(shù))與映射表中的特征進(jìn)行匹配.若一樣則將該輸入判定為正常輸入;若不一樣該則將輸入判定為SQL注入攻擊.
步驟6.獲取下一條HTTP請求,重復(fù)步驟1到步驟5.
本文提出的方法的設(shè)計模塊圖如圖10所示.
1)數(shù)據(jù)提取模塊:負(fù)責(zé)提取HTTP報文中的數(shù)據(jù).在學(xué)習(xí)階段時,并將相關(guān)的數(shù)據(jù)存入配置文件中.在過濾階段,并結(jié)合映射表生成相應(yīng)的SQL語句.
2)爬蟲模塊:該模塊包括待抓取URL隊列和已抓取URL隊列.爬蟲從待抓取URL隊列中依次讀取URL,之后根據(jù)URL訪問對應(yīng)網(wǎng)頁.同時將已經(jīng)訪問的URL發(fā)送給已抓取URL隊列,以避免重復(fù)抓取.對于剛抓取的網(wǎng)頁,則從中抽出所包含的所有鏈接信息,并在已抓起隊列中檢測,若發(fā)現(xiàn)鏈接還沒被抓取,則將該URL放入待抓取URL隊列末尾.直至待抓取URL隊列為空時才停止抓取網(wǎng)頁.
圖10 系統(tǒng)模塊圖
3)判斷模塊:負(fù)責(zé)對HTTP連接的URL長度、連接頻率進(jìn)行檢測.若URL長度大于70 byte或連接頻率大于3次/s,則記錄該請求由人工進(jìn)行進(jìn)一步判斷.并比較SQL解析模塊生成的SQL語法樹的特征值與映射表中的特征值,根據(jù)結(jié)果判斷該用戶輸入是否為SQL注入攻擊.
4)SQL解析模塊:負(fù)責(zé)對SQL語句進(jìn)行解析,生成相應(yīng)的SQL語法樹.該模塊包括詞法分析和語法分析.詞法分析負(fù)責(zé)將輸入的SQL語句進(jìn)行分詞.語法分析在詞法分析的基礎(chǔ)上,判斷輸入的SQL語句是否符合語法邏輯.當(dāng)語法分析正常結(jié)束后,則輸出相應(yīng)的抽象語法樹.
5)日志:負(fù)責(zé)接收其他模塊的記錄請求,并將疑似SQL注入攻擊的HTTP請求記錄在日志中.
6)配置文件:配置文件包括用戶提供的啟始文件(XML文件)和URL和SQL語句映射表(XML文件).其中啟始文件包含用戶提供的爬蟲啟始數(shù)據(jù).URL和SQL語句映射表中包含了URL和SQL語句的映射信息.
本文通過搭建實際的測試平臺來檢測和分析LFS方法的性能.測試平臺使用tomcat服務(wù)器,后臺數(shù)據(jù)庫采用MySQL數(shù)據(jù)庫,Web應(yīng)用程序為小型J2EE招聘系統(tǒng),涵蓋登錄,查看簡歷等功能并代碼中存在SQL注入漏洞.測試數(shù)據(jù)為SQL注入攻擊輸入,包含SQL關(guān)鍵字的用戶輸入和用戶正常輸入各100條,其中SQL注入攻擊輸入由SQLMAP生成.為了測試LFS過濾方法對于SQL注入攻擊的攔截率和誤報率,本文對LFS過濾,關(guān)鍵字過濾和正則表達(dá)式過濾(含30條過濾規(guī)則)進(jìn)行了比較.測試結(jié)果如圖11、圖12和表3所示.
圖11 SQL注入攔截率
圖12 SQL注入誤報率
表3 SQL注入攔截率和誤報率
測試結(jié)果表3、圖11和圖12表明了本文提出的LFS過濾方法相較于關(guān)鍵字過濾和正則表達(dá)式過濾有更高的攔截率和更低的誤報率,能夠較好的對SQL注入進(jìn)行防御.
為了測試LFS過濾方法對于Web應(yīng)用程序性能的影響,本文分別對Web應(yīng)用程序未加載過濾模塊和Web應(yīng)用程序加載了過濾模塊這兩種情況分別進(jìn)行測試,測試結(jié)果如圖13、圖14、圖15和表4所示.
圖13 正常輸入測試時間
圖14 含關(guān)鍵字的正常輸入測試時間
圖15 SQL注入攻擊測試時間
圖13表明,對于不含關(guān)鍵字的正常訪問,加載過濾模塊與否對Web應(yīng)用程序響應(yīng)時間有略微的影響,加載了過濾模塊將導(dǎo)致Web應(yīng)用程序響應(yīng)時間有略微的延遲,但對用戶體驗影響不大.圖14表明,對于含有關(guān)鍵字的正常訪問,過濾模塊需要對該用戶請求進(jìn)行URL長度和連接頻率的檢測.之后需要根據(jù)映射表和用戶輸入的數(shù)據(jù)進(jìn)行SQL解析,但是用戶輸入中含有SQL關(guān)鍵字(如select、order by等)可能會改變了原有的SQL語句的語法,造成SQL解析失敗,進(jìn)行二次解析,致使系統(tǒng)響應(yīng)時間較長.圖15表明,對于SQL注入攻擊,當(dāng)沒有加載過濾模塊時,SQL注入攻擊能夠改變Web應(yīng)用程序的SQL語句,使得后臺數(shù)據(jù)庫執(zhí)行該SQL語句,從而導(dǎo)致Web應(yīng)用程序響應(yīng)時間有明顯;當(dāng)加載了過濾模塊時,由于要對url長度和連接頻率進(jìn)行檢測,并且過濾模塊對復(fù)雜的SQL語句的解析時間較長,導(dǎo)致系統(tǒng)響應(yīng)時間增加.表4則給出了加載過濾模塊與否,在三種輸入中的平均系統(tǒng)響應(yīng)時間.因此對于SQL注入攻擊,不論加載了過濾模塊與否和系統(tǒng)響應(yīng)時間都會有所延遲,導(dǎo)致了兩者的系統(tǒng)響應(yīng)時間較為接近.因此,該過濾模塊對于系統(tǒng)的響應(yīng)延遲在可接受的范圍內(nèi),對用戶體驗的影響不大.
表4 系統(tǒng)響應(yīng)時間(單位:ms)
論文針對SQL注入攻擊問題展開研究,并結(jié)合爬蟲、數(shù)據(jù)庫代理等技術(shù),提出了一種新的SQL注入過濾方法——LFS過濾方法.首先,通過采用爬蟲和數(shù)據(jù)庫代理技術(shù)構(gòu)建URL和SQL語句映射表,完成學(xué)習(xí)過程;其次,通過對URL長度、訪問頻率及SQL語法樹這三個方面進(jìn)行檢測,實現(xiàn)對用戶輸入進(jìn)行過濾,防止SQL注入,完成過濾過程;最終,將學(xué)習(xí)過程和過濾過程有機(jī)結(jié)合,實現(xiàn)了新的LFS過濾方法.仿真實驗和性能分析結(jié)果表明,論文提出的LFS過濾方法能夠有效的防止SQL注入攻擊,在攔截率和誤報率方面優(yōu)于關(guān)鍵字過濾方法和正則表達(dá)式過濾方法.
然而隨著系統(tǒng)業(yè)務(wù)的不斷提高,應(yīng)用程序可能會隨著用戶輸入的不同而產(chǎn)生不同的SQL語句,這給本方法帶來很大的挑戰(zhàn).一方面導(dǎo)致本方法在學(xué)習(xí)階段可能無法獲取所有的SQL語句,另一方面由于SQL語句的數(shù)量不可控,可能導(dǎo)致學(xué)習(xí)階段產(chǎn)生的URL和SQL語句映射表數(shù)據(jù)量巨大,從而導(dǎo)致在過濾階段耗時有顯著增加.我們同時注意到可變語句(隨著用戶輸入的不同而產(chǎn)生不同的SQL語句)的產(chǎn)生有和大相似度,例如相關(guān)的SQL語法樹結(jié)構(gòu)有很大的相似性,變化的只有SQL語句的局部.因此,在未來的研究工作中,我們考慮采用基于SQL語法樹的相似度的方法來對學(xué)習(xí)階段產(chǎn)生的URL和SQL語句映射表進(jìn)行壓縮,以此減少過濾時間.
1 鄭成興.網(wǎng)絡(luò)入侵防范的理論與實踐.北京:機(jī)械工業(yè)出版社,2006.
2 高鵬,嚴(yán)望佳.構(gòu)建安全的Web站點.北京:清華大學(xué)出版社,1999.
3 張燕.數(shù)據(jù)挖掘提取查詢樹特征的SQL注入攻擊檢測.電子技術(shù)應(yīng)用,2016,42(3):90–94.
4 黃保華,馬巖,謝統(tǒng)義.用于SQL注入檢測的語句塊摘要樹模型.信息安全與技術(shù),2012,(3):34–37.
5 趙宇飛,熊剛,賀龍濤,等.面向網(wǎng)絡(luò)環(huán)境的SQL注入行為檢測方法.通信學(xué)報,2016,37(2):88–97.[doi:10.11959/j.issn.1000-436x.2016034]
6 張志超,王丹,趙文兵,等.一種基于神經(jīng)網(wǎng)絡(luò)的SQL注入漏洞的檢測模型.計算機(jī)與現(xiàn)代化,2016,(10):67–71.[doi:10.3969/j.issn.1006-2475.2016.10.014]
7 王偉平,李昌,段桂華.基于正則表示的SQL注入過濾模塊設(shè)計.計算機(jī)工程,2011,37(5):158–160.
8 Becher M.Web application firewalls.Akademikerverlag:Universiti Teknologi MARA,2012.
9 Roesch M.Snort-lightweight intrusion detection for networks.Proceedings of the 13th USENIX Conference on System Administration.Berkeley,CA,USA.1999.229–238.
10 田玉杰,趙澤茂,王麗君,等.基于分類的SQL注入攻擊雙層防御模型研究.信息網(wǎng)絡(luò)安全,2015,(6):1–6.
11 Saleh AZM,Rozali NA,Buja AG,et al.A method for web application vulnerabilities detection by using boyer-moore string matching algorithm.Procedia Computer Science,2015,(72):112–121.[doi:10.1016/j.procs.2015.12.111]
12 Patel N,Shekokar N.Implementation of pattern matching algorithm to defend SQLIA.Procedia Computer Science,2015,(45):453–459.[doi:10.1016/j.procs.2015.03.078]
13 Abawajy J,Fernando H.Policy-based SQLIA detection and prevention approach for RFID systems.Computer Standards&Interfaces,2015,(38):64–71.
14 Wei K,Muthuprasanna M,Kothari S.Preventing SQL injection attacks in stored procedures.Proceedings of 2006 Software Engineering Conference.Sydney,Australia.2006.191–198.
15 黃龍軍.存儲過程技術(shù)在網(wǎng)絡(luò)考試系統(tǒng)SQL注入攻擊防御上的應(yīng)用.計算機(jī)系統(tǒng)應(yīng)用,2013,22(1):103–106.
16 Clarke J.SQL Injection Attacks and Defense.Amsterdam:Elsevier,2009.