新疆 孫俊德
SQL注入攻擊與防范技術
新疆 孫俊德
通過對目前常見的SQL注入攻擊的行為分析,網站管理人員從中了解并采用相關的防范技術,保障網站數據庫的安全。本文通過對SQL注入攻擊過程的分析,有針對性提出如何增強網站抗SQL注入攻擊的措施。
SQL注入;黑客;網站安全
SQL注入攻擊可以算是互聯網上最為流傳最為廣泛的攻擊方式,許多企業網站先后遭此攻擊。所謂SQL注入(SQL Injection),就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,查詢數據庫。
(1)一些網站的管理登陸頁面對輸入的用戶名和密碼沒有做SQL過濾,導致網站被攻擊。
這里假設一個沒有嚴格過濾SQL字符的管理登陸界面。事實上黑客并不需要知道用戶名和密碼,那么黑客只需在用戶名里面輸入"'or 1=1--",密碼任意輸入,提交后,系統認為用戶名為空('')或者(1=1恒成立),后面不執行(--),就無需驗證密碼直接進入后臺。
(2)下面的查詢語句在有注入漏洞的服務器上被惡意利用也會導致嚴重后果。
String SqlStr=”Select*from customers where CompanyName like'%"+textBox1.Text+"%"';
這樣的字符串連接可能會帶來災難性的結果,比如用戶在文本框中輸入:
a'or1=1
那么SqlStr的內容就是:
select*from customers where CompanyName like'%a'or1=1--%'
這樣,整個customers數據表的所有數據就會被全部檢索出來,因為1=1永遠true,而且最后的百分號和單引號被短橫杠注釋掉了。
如果用戶在文本框中輸入:
a'EXEC sP_addlogin'John','123'EXEC sP_addsrvrolemember'John','sysadmin'--
那么SqlStr的內容就是:
select*from customers where CompanyName like'%a'EXEC sp_addlogin'John','123'
EXECsp_addsrvrolemember'John','sysadmin'--
該語句是在后臺數據庫中增加一個用戶John,密碼123,而且是一個sysadmin賬號,相當于sa的權限。
如果用戶這時在文本框中輸入:a'EXECxp_cmdShell('formatc:/y')--運行之后就開始格式化C盤!
(3)通過注入獲得管理員賬戶密碼。
一個正常的網址http://localhost/lawjia/show.asp?ID=101,將這個網址提交到服務器后,服務器將進行類似Select*from表名 where字段="&ID的查詢(ID即客戶端提交的參數,本例是即101),再將查詢結果返回給客戶端。
當某人知道網站管理員帳號存儲在表login中,其用戶名為admin,如果想知道管理員密碼,此時他可從客戶端接著提交這樣一個網址:
http://localhost/lol/show.asp?ID=101 and(Select password from login where user_name='admin')>0
返回的出錯信息如下:
MicrosoftOLEDBProvider forODBCDrivers(0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server] 將 varchar 值 '!@huway**a'轉換為數據類型為int的列時發生語法錯誤。
/lol/show.asp,第 27 行
黑體字部分即為返回密碼
(4)通過工具進行注入攻擊測試。
如何判斷一個網站能否被注入,首先找到注入點,像上面提到的“/show.asp?ID=101”就是一個注人點,很多新聞系統的新聞顯示頁面、產品發布顯示頁面都有類似ID=101的標志,在ID=101后面直接輸入and 1=1,如果沒有出錯,仍然返回原先顯示頁面,這就是一個注人漏洞,如果返回您的網址不合法,顯然己經做了SQL過濾。
顯然人工猜測表名是一件麻煩事情,但大多存放管理員的賬戶的表通常為addmin,guan,login這樣簡單單詞,通過黑客工具附帶字典,先確定表的名稱,接著猜測字段,然后窮學查詢字段第一位、第二、第三位…,直到全部出來,借助工具,對有注人漏洞網站攻擊成功率可達60%以上。注入工具有NBSI、啊 D、Domain 等。
以上僅是對SQL攻擊的粗略分類。但從技術上講,如今的SQL注入攻擊者們在如何找出有漏洞的網站方面更加聰明,也更加全面了。出現了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。
2.1 使用參數化的過濾性語句
要防御SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然后,用戶輸入就被限于一個參數。下面是一個使用Java和JDBCAPI例子:
PreparedStatement prep=conn.prepareStatement("SELECT*FROM USERS WHEREPASSWORD=?");
prep.setString(1,pwd);
總體上講,有兩種方法可以保證應用程序不易受到SQL注入的攻擊,一是使用代碼復查,二是強迫使用參數化語句的。強迫使用參數化的語句意味著嵌入用戶輸入的SQL語句在運行時將被拒絕。不過,目前支持這種特性的并不多。如H2數據庫引擎就支持。
2.2 還要避免使用解釋程序,因為這正是黑客們借以執行非法命令的手段。
2.3 防范SQL注入,還要避免出現一些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用一種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。
2.4 使用專業的漏洞掃描工具。但防御SQL注入攻擊也是不夠的。攻擊者們目前正在自動搜索攻擊目標并實施攻擊。其技術甚至可以輕易地被應用于其它的Web架構中的漏洞。企業應當投資于一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個完善的漏洞掃描程序不同于網絡掃描程序,它專門查找網站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。
建議Web應用程序的程序員們對其代碼進行測試并打補丁,雖然SQL注入漏洞被發現和利用的機率并不太高。但近來攻擊者們越來越多地發現并惡意地利用這些漏洞。因此,在部署其軟件之前,開發人員應當更加主動地測試其代碼,并在新的漏洞出現后立即對代碼打補丁,做為網站管理人員要在Web應用程序開發過程的所有階段實施代碼的安全檢查。首先,要在部署Web應用之前實施安全測試,這種措施的意義比以前更大、更深遠。網站管理人員還應當在部署之后用漏洞掃描工具和站點監視工具對網站進行測試。
[1]馬宜義.網絡安全與病毒防范.上海:上海交通大學院出版社,2009.
[2]秦志興,張鳳荔.計算機病毒原理與防范[M].北京:人民郵電出版社,2007.
[3]張仁斌,李剛,等.計算機病毒與反病毒技術[M].武漢:武漢大學出版社,2006.
(編輯 呂智飛)
(作者單位:昌吉職業技術學院)