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