潘號良 汪光一 陸新華
北京衛(wèi)戍區(qū)指揮自動化工作站 北京 100740
隨著web應(yīng)用程序的流行和普及,SQL注入攻擊技術(shù)也隨之出現(xiàn),該種攻擊技術(shù)被廣為利用。根據(jù)網(wǎng)絡(luò)統(tǒng)計,每年都有數(shù)萬個網(wǎng)站遭受SQL注入式攻擊,其中不乏知名網(wǎng)站。更有甚者,現(xiàn)在出現(xiàn)了新型的攻擊方法。利用軟件自動搜索web應(yīng)用程序的SQL漏洞,自動生成注入腳本,進行攻擊,造成web應(yīng)用程序的破壞。
對于 Web應(yīng)用程序來說,很多都使用數(shù)據(jù)庫來存儲信息。SQL命令就是前端 Web和后端數(shù)據(jù)庫之間的接口,使得數(shù)據(jù)可以傳遞至Web應(yīng)用程序。很多Web站點都會利用用戶輸入的參數(shù)動態(tài)地生成 SQL查詢要求,攻擊者通過在URL、表單域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過應(yīng)用程序,從而可以對數(shù)據(jù)進行不受限的訪問。
SQL注入漏洞成因在于 Web應(yīng)用程序?qū)τ脩籼峤坏臄?shù)據(jù)未做充分檢查過濾。用戶提交的數(shù)據(jù)可能會在程序里被用來構(gòu)造訪問后臺數(shù)據(jù)庫的SQL指令,如果這些數(shù)據(jù)過濾不嚴(yán)格就有可能被插入惡意的SQL代碼,從而非授權(quán)操作后臺的數(shù)據(jù)庫,導(dǎo)致從敏感信息泄露、破壞數(shù)據(jù)庫內(nèi)容和結(jié)構(gòu)。利用SQL注入漏洞可以構(gòu)成對Web服務(wù)器的直接攻擊,還可能利用服務(wù)器攻擊第三方瀏覽網(wǎng)站的其他用戶。
我這里以大家常見的用戶身份認(rèn)證的簡單 Web應(yīng)用程序為例進行講解。假定這個應(yīng)用程序提供一個登錄頁面,在這個界面里要求用戶輸入用戶名和口令,然后通過HTTP請求發(fā)送用戶名和口令,之后,Web應(yīng)用程序檢查用戶傳遞過來的用戶名和口令跟數(shù)據(jù)庫中的用戶名和口令是否匹配。這種情況下,我們假定數(shù)據(jù)庫中存在一個名稱為 user_table的表,該表包括三個字段,分別為用戶 id(用以標(biāo)識該用戶)、用戶名稱username、用戶密碼userpassword。
web應(yīng)用程序代碼如下:
開頭兩行代碼從HTTP請求中取得用戶輸入,然后在下一行開始構(gòu)造一個 SQL查詢。執(zhí)行查詢,然后在 while()循環(huán)中得到結(jié)果,如果一個用戶名和口令對匹配,就會返回正確的ID。否則,id的值仍然為-1,這意味著用戶沒有通過認(rèn)證。表面上看,如果用戶名和口令對匹配,那么該用戶通過認(rèn)證;否則,該用戶不會通過認(rèn)證——但是,事實果真如此嗎?非也!讀者也許已經(jīng)注意到了,這里并沒有對SQL命令進行設(shè)防,所以攻擊者完全能夠在用戶名或者口令字段中注入SQL語句,從而改變SQL查詢。為此,我們仔細研究一下上面的SQL查詢字符串:
上述代碼認(rèn)為字符串username和password都是數(shù)據(jù),不過,攻擊者卻可以隨心所欲地輸入任何字符。如果一位攻擊者輸入的用戶名為’OR 1=1--,而口令為x,那么查詢字符串將變成下面的樣子:
該雙劃符號--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會。這樣,查詢字符串相當(dāng)于:
如今的SELECT語句跟以前的已經(jīng)大相徑庭了,因為現(xiàn)在只要用戶名為長度為零的字符串''或 1=1這兩個條件中一個為真,就返回用戶標(biāo)識符ID——我們知道,1=1是恒為真的。所以這個語句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令'OR1=1--而非數(shù)據(jù)。
近段時間修改一個ASP程序(有SQL注入漏洞),于是利用instr函數(shù),寫出這個ASP函數(shù),供大家參考。以下是函數(shù)片段:
使用sqlsaferequest函數(shù)替換Request。
我們在本文中介紹了注入攻擊的原理。然后通過一個簡單的程序事例詳細介紹了 SQL注入攻擊的過程,使我們對SQL注入攻擊有了一個深入的認(rèn)識。最后給出了一個防范SQL注入攻擊的簡單函數(shù)。要想有效防范SQL注入攻擊,需要大家平時提高意識,多對web應(yīng)用程序進行SQL攻擊測試,及早發(fā)現(xiàn)漏洞,堵住漏洞。
[1](美)克拉克著,黃曉磊,李化譯.SQL 注入攻擊與防御[M].清華大學(xué)出版社.2010.
[2]孫建舒.SQL注入式攻擊與防范.計算機與信息技術(shù)[J].2011.
[3]吳貴山.SQL注入攻擊防御策略的研究.計算機與網(wǎng)絡(luò)[J].2012.