觀察近來的一些安全事件及其后果,,安全專家們已經(jīng)得到一個(gè)結(jié)論,這些威脅主要是通過SQL注入造成的,。雖然前面有許多文章討論了SQL注入,,但今天所討論的內(nèi)容也許可幫助你檢查自己的服務(wù)器,并采取相應(yīng)防范措施,。
SQL注入攻擊的種類
知彼知己,,方可取勝,。首先要清楚
SQL注入攻擊有哪些種類。
1.沒有正確過濾轉(zhuǎn)義字符 在用戶的輸入沒有為轉(zhuǎn)義字符過濾時(shí),,就會發(fā)生這種形式的注入式攻擊,,它會被傳遞給一個(gè)SQL語句。這樣就會導(dǎo)致應(yīng)用程序的終端用戶對數(shù)據(jù)庫上的語句實(shí)施操縱,。比方說,,下面的這行代碼就會演示這種漏洞:
statement := "SELECT * FROM users WHERE name = '" + userName + "'; "
這種代碼的設(shè)計(jì)目的是將一個(gè)特定的用戶從其用戶表中取出,但是,,如果用戶名被一個(gè)惡意的用戶用一種特定的方式偽造,,這個(gè)語句所執(zhí)行的操作可能就不僅僅是代碼的作者所期望的那樣了。例如,,將用戶名變量(即username)設(shè)置為:
a' or 't'='t,,此時(shí)原始語句發(fā)生了變化:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
如果這種代碼被用于一個(gè)認(rèn)證過程,那么這個(gè)例子就能夠強(qiáng)迫選擇一個(gè)合法的用戶名,,因?yàn)橘x值't'='t永遠(yuǎn)是正確的,。
在一些SQL服務(wù)器上,如在SQL Server中,,任何一個(gè)SQL命令都可以通過這種方法被注入,包括執(zhí)行多個(gè)語句,。下面語句中的username的值將會導(dǎo)致刪除“users”表,,又可以從“data”表中選擇所有的數(shù)據(jù)(實(shí)際上就是透露了每一個(gè)用戶的信息)。
a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%
這就將最終的SQL語句變成下面這個(gè)樣子:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';
其它的SQL執(zhí)行不會將執(zhí)行同樣查詢中的多個(gè)命令作為一項(xiàng)安全措施,。這會防止攻擊者注入完全獨(dú)立的查詢,,不過卻不會阻止攻擊者修改查詢。
2.Incorrect type handling
如果一個(gè)用戶提供的字段并非一個(gè)強(qiáng)類型,,或者沒有實(shí)施類型強(qiáng)制,,就會發(fā)生這種形式的攻擊。當(dāng)在一個(gè)SQL語句中使用一個(gè)數(shù)字字段時(shí),,如果程序員沒有檢查用戶輸入的合法性(是否為數(shù)字型)就會發(fā)生這種攻擊,。例如:
statement := "SELECT * FROM data WHERE id = " + a_variable + "; "
從這個(gè)語句可以看出,作者希望a_variable是一個(gè)與“id”字段有關(guān)的數(shù)字,。不過,,如果終端用戶選擇一個(gè)字符串,就繞過了對轉(zhuǎn)義字符的需要,。例如,,將a_variable設(shè)置為:1; DROP TABLE users,它會將“users”表從數(shù)據(jù)庫中刪除,,SQL語句變成:SELECT * FROM DATA WHERE id = 1; DROP TABLE users;
3.數(shù)據(jù)庫服務(wù)器中的漏洞
有時(shí),,數(shù)據(jù)庫服務(wù)器軟件中也存在著漏洞,,如MYSQL服務(wù)器中mysql_real_escape_string()函數(shù)漏洞。這種漏洞允許一個(gè)攻擊者根據(jù)錯誤的統(tǒng)一字符編碼執(zhí)行一次成功的SQL注入式攻擊,。
4.盲目SQL注入式攻擊
當(dāng)一個(gè)Web應(yīng)用程序易于遭受攻擊而其結(jié)果對攻擊者卻不見時(shí),,就會發(fā)生所謂的盲目SQL注入式攻擊。有漏洞的網(wǎng)頁可能并不會顯示數(shù)據(jù),,而是根據(jù)注入到合法語句中的邏輯語句的結(jié)果顯示不同的內(nèi)容,。這種攻擊相當(dāng)耗時(shí),因?yàn)楸仨殲槊恳粋€(gè)獲得的字節(jié)而精心構(gòu)造一個(gè)新的語句,。但是一旦漏洞的位置和目標(biāo)信息的位置被確立以后,,一種稱為Absinthe的工具就可以使這種攻擊自動化。
5.條件響應(yīng)
注意,,有一種SQL注入迫使數(shù)據(jù)庫在一個(gè)普通的應(yīng)用程序屏幕上計(jì)算一個(gè)邏輯語句的值:
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1
這會導(dǎo)致一個(gè)標(biāo)準(zhǔn)的面面,,而語句
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在頁面易于受到SQL注入式攻擊時(shí),它有可能給出一個(gè)不同的結(jié)果,。如此這般的一次注入將會證明盲目的SQL注入是可能的,,它會使攻擊者根據(jù)另外一個(gè)表中的某字段內(nèi)容設(shè)計(jì)可以評判真?zhèn)蔚恼Z句。
6.條件性差錯
如果WHERE語句為真,,這種類型的盲目SQL注入會迫使數(shù)據(jù)庫評判一個(gè)引起錯誤的語句,,從而導(dǎo)致一個(gè)SQL錯誤。例如:
SELECT 1/0 FROM users WHERE username='Ralph',。顯然,,如果用戶Ralph存在的話,被零除將導(dǎo)致錯誤,。
7.時(shí)間延誤
時(shí)間延誤是一種盲目的SQL注入,,根據(jù)所注入的邏輯,它可以導(dǎo)致SQL引擎執(zhí)行一個(gè)長隊(duì)列或者是一個(gè)時(shí)間延誤語句,。攻擊者可以衡量頁面加載的時(shí)間,,從而決定所注入的語句是否為真。
以上僅是對SQL攻擊的粗略分類,。但從技術(shù)上講,,如今的SQL注入攻擊者們在如何找出有漏洞的網(wǎng)站方面更加聰明,也更加全面了,。出現(xiàn)了一些新型的SQL攻擊手段,。黑客們可以使用各種工具來加速漏洞的利用過程。我們不妨看看the Asprox Trojan這種木馬,,它主要通過一個(gè)發(fā)布郵件的僵尸網(wǎng)絡(luò)來傳播,,其整個(gè)工作過程可以這樣描述:首先,通過受到控制的主機(jī)發(fā)送的垃圾郵件將此木馬安裝到電腦上,然后,,受到此木馬感染的電腦會下載一段二進(jìn)制代碼,,在其啟動時(shí),它會使用搜索引擎搜索用微軟的ASP技術(shù)建立表單的,、有漏洞的網(wǎng)站,。搜索的結(jié)果就成為SQL注入攻擊的靶子清單。接著,,這個(gè)木馬會向這些站點(diǎn)發(fā)動SQL注入式攻擊,,使有些網(wǎng)站受到控制、破壞,。訪問這些受到控制和破壞的網(wǎng)站的用戶將會受到欺騙,,從另外一個(gè)站點(diǎn)下載一段惡意的JavaScript代碼。最后,,這段代碼將用戶指引到第三個(gè)站點(diǎn),,這里有更多的惡意軟件,如竊取口令的木馬,。
以前,,我們經(jīng)常警告或建議Web應(yīng)用程序的程序員們對其代碼進(jìn)行測試并打補(bǔ)丁,雖然SQL注入漏洞被發(fā)現(xiàn)和利用的機(jī)率并不太高,。但近來攻擊者們越來越多地發(fā)現(xiàn)并惡意地利用這些漏洞,。因此,在部署其軟件之前,,開發(fā)人員應(yīng)當(dāng)更加主動地測試其代碼,,并在新的漏洞出現(xiàn)后立即對代碼打補(bǔ)丁。
防御和檢查SQL注入的手段
1.使用參數(shù)化的過濾性語句
要防御SQL注入,,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,,用戶的輸入必須進(jìn)行過濾,,或者使用參數(shù)化的語句。參數(shù)化的語句使用參數(shù)而不是將用戶輸入嵌入到語句中,。在多數(shù)情況中,,SQL語句就得以修正。然后,,用戶輸入就被限于一個(gè)參數(shù),。下面是一個(gè)使用Java和JDBC API例子:
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE PASSWORD=?");
prep.setString(1, pwd);
總體上講,有兩種方法可以保證應(yīng)用程序不易受到SQL注入的攻擊,,一是使用代碼復(fù)查,,二是強(qiáng)迫使用參數(shù)化語句的。強(qiáng)迫使用參數(shù)化的語句意味著嵌入用戶輸入的SQL語句在運(yùn)行時(shí)將被拒絕。不過,,目前支持這種特性的并不多,。如H2 數(shù)據(jù)庫引擎就支持。
2.還要避免使用解釋程序,,因?yàn)檫@正是黑客們借以執(zhí)行非法命令的手段,。
3.防范SQL注入,還要避免出現(xiàn)一些詳細(xì)的錯誤消息,,因?yàn)楹诳蛡兛梢岳眠@些消息,。要使用一種標(biāo)準(zhǔn)的輸入確認(rèn)機(jī)制來驗(yàn)證所有的輸入數(shù)據(jù)的長度、類型,、語句,、企業(yè)規(guī)則等。
4.使用專業(yè)的漏洞掃描工具,。但防御SQL注入攻擊也是不夠的,。攻擊者們目前正在自動搜索攻擊目標(biāo)并實(shí)施攻擊。其技術(shù)甚至可以輕易地被應(yīng)用于其它的Web架構(gòu)中的漏洞,。企業(yè)應(yīng)當(dāng)投資于一些專業(yè)的漏洞掃描工具,,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,,它專門查找網(wǎng)站上的SQL注入式漏洞,。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。
5.最后一點(diǎn),,企業(yè)要在Web應(yīng)用程序開發(fā)過程的所有階段實(shí)施代碼的安全檢查,。首先,要在部署Web應(yīng)用之前實(shí)施安全測試,,這種措施的意義比以前更大,、更深遠(yuǎn)。企業(yè)還應(yīng)當(dāng)在部署之后用漏洞掃描工具和站點(diǎn)監(jiān)視工具對網(wǎng)站進(jìn)行測試,。
Web安全拉警報(bào)已經(jīng)響起,,安全形式異常嚴(yán)峻,企業(yè)絕對不應(yīng)當(dāng)草率從事,。安全重于泰山!