當前位置:編程學習大全網 - 熱門推薦 - SQL註入攻擊的種類和防範手段有哪些?

SQL註入攻擊的種類和防範手段有哪些?

暈,這不是C#考題嗎。

SQL註入攻擊的種類

知彼知己,方可取勝。首先要清楚SQL註入攻擊有哪些種類。

1.沒有正確過濾轉義字符

在用戶的輸入沒有為轉義字符過濾時,就會發生這種形式的註入式攻擊,它會被傳遞給壹個SQL語句。這樣就會導致應用程序的終端用戶對數據庫上的語句實施操縱。比方說,下面的這行代碼就會演示這種漏洞:

statement := "SELECT * FROM users WHERE name = '" + userName + "'; "

這種代碼的設計目的是將壹個特定的用戶從其用戶表中取出,但是,如果用戶名被壹個惡意的用戶用壹種特定的方式偽造,這個語句所執行的操作可能就不僅僅是代碼的作者所期望的那樣了。例如,將用戶名變量(即username)設置為:

a' or 't'='t,此時原始語句發生了變化:

SELECT * FROM users WHERE name = 'a' OR 't'='t';

如果這種代碼被用於壹個認證過程,那麽這個例子就能夠強迫選擇壹個合法的用戶名,因為賦值't'='t永遠是正確的。

在壹些SQL服務器上,如在SQL Server中,任何壹個SQL命令都可以通過這種方法被註入,包括執行多個語句。下面語句中的username的值將會導致刪除“users”表,又可以從“data”表中選擇所有的數據(實際上就是透露了每壹個用戶的信息)。

a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%

這就將最終的SQL語句變成下面這個樣子:

SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';

其它的SQL執行不會將執行同樣查詢中的多個命令作為壹項安全措施。這會防止攻擊者註入完全獨立的查詢,不過卻不會阻止攻擊者修改查詢。

2.Incorrect type handling

如果壹個用戶提供的字段並非壹個強類型,或者沒有實施類型強制,就會發生這種形式的攻擊。當在壹個SQL語句中使用壹個數字字段時,如果程序員沒有檢查用戶輸入的合法性(是否為數字型)就會發生這種攻擊。例如:

statement := "SELECT * FROM data WHERE id = " + a_variable + "; "

從這個語句可以看出,作者希望a_variable是壹個與“id”字段有關的數字。不過,如果終端用戶選擇壹個字符串,就繞過了對轉義字符的需要。例 如,將a_variable設置為:1; DROP TABLE users,它會將“users”表從數據庫中刪除,SQL語句變成:SELECT * FROM DATA WHERE id = 1; DROP TABLE users;

3.數據庫服務器中的漏洞

有時,數據庫服務器軟件中也存在著漏洞,如MYSQL服務器中mysql_real_escape_string()函數漏洞。這種漏洞允許壹個攻擊者根據錯誤的統壹字符編碼執行壹次成功的SQL註入式攻擊。

4.盲目SQL註入式攻擊

當壹個Web應用程序易於遭受攻擊而其結果對攻擊者卻不見時,就會發生所謂的盲目SQL註入式攻擊。有漏洞的網頁可能並不會顯示數據,而是根據註入到合法 語句中的邏輯語句的結果顯示不同的內容。這種攻擊相當耗時,因為必須為每壹個獲得的字節而精心構造壹個新的語句。但是壹旦漏洞的位置和目標信息的位置被確 立以後,壹種稱為Absinthe的工具就可以使這種攻擊自動化。

5.條件響應

註意,有壹種SQL註入迫使數據庫在壹個普通的應用程序屏幕上計算壹個邏輯語句的值:

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1

這會導致壹個標準的面面,而語句

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在頁面易於受到SQL註入式攻擊時,它有可能給出壹個不同的結果。如此這般的壹次註入將會證明盲目的SQL註入是可能的,它會使攻擊者根據另外壹個 表中的某字段內容設計可以評判真偽的語句。

6.條件性差錯

如果WHERE語句為真,這種類型的盲目SQL註入會迫使數據庫評判壹個引起錯誤的語句,從而導致壹個SQL錯誤。例如:

SELECT 1/0 FROM users WHERE username='Ralph'。顯然,如果用戶Ralph存在的話,被零除將導致錯誤。

7.時間延誤

時間延誤是壹種盲目的SQL註入,根據所註入的邏輯,它可以導致SQL引擎執行壹個長隊列或者是壹個時間延誤語句。攻擊者可以衡量頁面加載的時間,從而決定所註入的語句是否為真。

以上僅是對SQL攻擊的粗略分類。但從技術上講,如今的SQL註入攻擊者們在如何找出有漏洞的網站方面更加聰明,也更加全面了。出現了壹些新型的SQL攻 擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。我們不妨看看the Asprox Trojan這種木馬,它主要通過壹個發布郵件的僵屍網絡來傳播,其整個工作過程可以這樣描述:首先,通過受到控制的主機發送的垃圾郵件將此木馬安裝到電 腦上,然後,受到此木馬感染的電腦會下載壹段二進制代碼,在其啟動時,它會使用搜索引擎搜索用微軟的ASP技術建立表單的、有漏洞的網站。搜索的結果就成 為SQL註入攻擊的靶子清單。接著,這個木馬會向這些站點發動SQL註入式攻擊,使有些網站受到控制、破壞。訪問這些受到控制和破壞的網站的用戶將會受到 欺騙,從另外壹個站點下載壹段惡意的JavaScript代碼。最後,這段代碼將用戶指引到第三個站點,這裏有更多的惡意軟件,如竊取口令的木馬。

以前,我們經常警告或建議Web應用程序的程序員們對其代碼進行測試並打補丁,雖然SQL註入漏洞被發現和利用的機率並不太高。但近來攻擊者們越來越多地 發現並惡意地利用這些漏洞。因此,在部署其軟件之前,開發人員應當更加主動地測試其代碼,並在新的漏洞出現後立即對代碼打補丁。

防禦和檢查SQL註入的手段

1.使用參數化的過濾性語句

要防禦SQL註入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不 是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然後,用戶輸入就被限於壹個參數。下面是壹個使用Java和JDBC API例子:

PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE PASSWORD=?");

prep.setString(1, pwd);

總體上講,有兩種方法可以保證應用程序不易受到SQL註入的攻擊,壹是使用代碼復查,二是強迫使用參數化語句的。強迫使用參數化的語句意味著嵌入用戶輸入的SQL語句在運行時將被拒絕。不過,目前支持這種特性的並不多。如H2 數據庫引擎就支持。

2.還要避免使用解釋程序,因為這正是黑客們借以執行非法命令的手段。

3.防範SQL註入,還要避免出現壹些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用壹種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。

4.使用專業的漏洞掃描工具。但防禦SQL註入攻擊也是不夠的。攻擊者們目前正在自動搜索攻擊目標並實施攻擊。其技術甚至可以輕易地被應用於其它的Web 架構中的漏洞。企業應當投資於壹些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。壹個完善的漏洞掃描程序不同於網絡掃描程 序,它專門查找網站上的SQL註入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。

5.最後壹點,企業要在Web應用程序開發過程的所有階段實施代碼的安全檢查。首先,要在部署Web應用之前實施安全測試,這種措施的意義比以前更大、更深遠。企業還應當在部署之後用漏洞掃描工具和站點監視工具對網站進行測試。

Web安全拉警報已經響起,安全形式異常嚴峻,企業絕對不應當草率從事。安全重於泰山!

  • 上一篇:悲情紅與黑的演員名單
  • 下一篇:請提供幾個永久免費的網絡遊戲
  • copyright 2024編程學習大全網