潘號良 汪光一 陸新華
北京衛戍區指揮自動化工作站 北京 100740
隨著web應用程序的流行和普及,SQL注入攻擊技術也隨之出現,該種攻擊技術被廣為利用。根據網絡統計,每年都有數萬個網站遭受SQL注入式攻擊,其中不乏知名網站。更有甚者,現在出現了新型的攻擊方法。利用軟件自動搜索web應用程序的SQL漏洞,自動生成注入腳本,進行攻擊,造成web應用程序的破壞。
對于 Web應用程序來說,很多都使用數據庫來存儲信息。SQL命令就是前端 Web和后端數據庫之間的接口,使得數據可以傳遞至Web應用程序。很多Web站點都會利用用戶輸入的參數動態地生成 SQL查詢要求,攻擊者通過在URL、表單域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過應用程序,從而可以對數據進行不受限的訪問。
SQL注入漏洞成因在于 Web應用程序對用戶提交的數據未做充分檢查過濾。用戶提交的數據可能會在程序里被用來構造訪問后臺數據庫的SQL指令,如果這些數據過濾不嚴格就有可能被插入惡意的SQL代碼,從而非授權操作后臺的數據庫,導致從敏感信息泄露、破壞數據庫內容和結構。利用SQL注入漏洞可以構成對Web服務器的直接攻擊,還可能利用服務器攻擊第三方瀏覽網站的其他用戶。
我這里以大家常見的用戶身份認證的簡單 Web應用程序為例進行講解。假定這個應用程序提供一個登錄頁面,在這個界面里要求用戶輸入用戶名和口令,然后通過HTTP請求發送用戶名和口令,之后,Web應用程序檢查用戶傳遞過來的用戶名和口令跟數據庫中的用戶名和口令是否匹配。這種情況下,我們假定數據庫中存在一個名稱為 user_table的表,該表包括三個字段,分別為用戶 id(用以標識該用戶)、用戶名稱username、用戶密碼userpassword。
web應用程序代碼如下:

開頭兩行代碼從HTTP請求中取得用戶輸入,然后在下一行開始構造一個 SQL查詢。執行查詢,然后在 while()循環中得到結果,如果一個用戶名和口令對匹配,就會返回正確的ID。否則,id的值仍然為-1,這意味著用戶沒有通過認證。表面上看,如果用戶名和口令對匹配,那么該用戶通過認證;否則,該用戶不會通過認證——但是,事實果真如此嗎?非也!讀者也許已經注意到了,這里并沒有對SQL命令進行設防,所以攻擊者完全能夠在用戶名或者口令字段中注入SQL語句,從而改變SQL查詢。為此,我們仔細研究一下上面的SQL查詢字符串:

上述代碼認為字符串username和password都是數據,不過,攻擊者卻可以隨心所欲地輸入任何字符。如果一位攻擊者輸入的用戶名為’OR 1=1--,而口令為x,那么查詢字符串將變成下面的樣子:

該雙劃符號--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會。這樣,查詢字符串相當于:

如今的SELECT語句跟以前的已經大相徑庭了,因為現在只要用戶名為長度為零的字符串''或 1=1這兩個條件中一個為真,就返回用戶標識符ID——我們知道,1=1是恒為真的。所以這個語句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令'OR1=1--而非數據。
近段時間修改一個ASP程序(有SQL注入漏洞),于是利用instr函數,寫出這個ASP函數,供大家參考。以下是函數片段:


使用sqlsaferequest函數替換Request。
我們在本文中介紹了注入攻擊的原理。然后通過一個簡單的程序事例詳細介紹了 SQL注入攻擊的過程,使我們對SQL注入攻擊有了一個深入的認識。最后給出了一個防范SQL注入攻擊的簡單函數。要想有效防范SQL注入攻擊,需要大家平時提高意識,多對web應用程序進行SQL攻擊測試,及早發現漏洞,堵住漏洞。
[1](美)克拉克著,黃曉磊,李化譯.SQL 注入攻擊與防御[M].清華大學出版社.2010.
[2]孫建舒.SQL注入式攻擊與防范.計算機與信息技術[J].2011.
[3]吳貴山.SQL注入攻擊防御策略的研究.計算機與網絡[J].2012.