SQL Injection概述~~~



贊助商連結


David Jackson
2002-05-06, 09:16 PM
I. 何謂 SQL Injection

SQL Injection 是一個專用名詞描述一個藉由射入特殊 SQL 程式碼
攻擊應用程式的動作。 事實上, 許多 SQL Injection 的問題不是
因為資料庫伺服器的問題, 而是因為確認使用者輸入的程式有不適
當的確認方式。

II. SQL Injection 起因

SQL Injection 的起因通常是因為程式利用字串建造方式執行 SQL
程式碼,舉例,搜尋網頁有可能利用以下程式碼來執行搜尋的動作:
(以下範例使用 VBScript 或 ASP 的寫法)

Set myRecordset = myConnection.execute(^SELECT * FROM myTable
WHERE someText ='^ & request.FORM(^inputdata^) & ^'^)

當使用者輸入以下字串給上述搜尋程式的時候:

' exec master..xp_cmdshell 'net user test testpass /ADD' --

此字串將被組合成為 :

Set myRecordset = myConnection.execute(^SELECT * FROM myTable
WHERE someText ='' exec master..xp_cmdshell 'net user
test testpass /ADD'--'

請注意,使用者所輸入的第一個「'」符號終止 someText 變數,跟著
執行一個新增新使用者到局部帳號資料庫的動作 。 若上述程式擁有
'sa' 權限,而 MSSQLSERVER 服務使用足夠權限執行 ,攻擊者有可能
獲得一個可進入那台伺服器的帳號。

III. SQL Injection 影響

SQL Injection 所帶來的大小影響是根基被引入的程式來確定 。 不幸
地,許多應用程式使用過度的權限,如: sa 權限或資料庫主人權限去
執行。以下是每種過度權限所帶來的影響:

1. sa 權限
若被攻擊的應用程式擁有 sa 權限,攻擊者有可能讀取,寫入,甚
至刪除所有 SQL 資料庫伺服器裡的資料。

2. db_owner 權限
若被攻擊的應用程式擁有 db_owner 權限,攻擊者有可能讀取或寫
入在被影響資料庫裡的所有資料,攻擊者有可能移除表格,建立新
物件,並完全控制被影響的資料庫。

3. 普通使用者權限 (建議使用)
若被攻擊的應用程式擁有 普通使用者 權限,攻擊者只能控制那個
使用者的資料庫,在最好的狀況下,攻擊者只能執行一些閱讀指令
,而在最壞狀況下, 攻擊者也只能夠閱讀或寫入所有那個使用者的
表格。


IV. SQL Injection 預防方法

以下是 SQL Injection 的預防方法:
1. 請查清應用程式使用者所輸入的值 , 若希望使用者輸入一些數值
,請利用 ISNUMERIC 或其他相關 function 來確認。 若希望使用
者輸入 string 資料,請以 「''」 符號代替 「'」 符號 , 您
可以用 replace 或其他相關 function 來作這個動作,如:
goodString = replace(inputString,','')
2. 請使用一些步驟來取得資料庫的資料,讓使用者無法直接使用資料
庫的表格,建議使用 ADO 的指令物件把使用者的輸入分類。
3. 重新探討程式碼並測試寫好的程式。

V. SQL Injection 偵測方法

在一個偵測平台上,輸入含有「'」符號的輸入信息給您的應用程式,
若發現有錯誤,請重新探討您的程式碼並再測試寫好的程式。