台灣最大程式設計社群網站
線上人數
851
 
會員總數:245619
討論主題:189317
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 『資料隱碼』SQL Injection的源由與防範之道
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
『資料隱碼』SQL Injection的源由與防範之道
價值 : 0 QP  點閱數:2182 回應數:0
樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
『資料隱碼』SQL Injection的源由與防範之道


“資料庫”為儲存資料之軟體系統,對資料庫進行存取或查詢主要是使用資料查詢語言-SQL (Structure Query Language, SQL),SQL標準資料查詢語言。大部份資料查詢都會使用SQL語言所撰寫程式碼。



“SQL Injection”是當客戶輸入資料或查詢條件後,經過SQL程式存取資料庫,若此時程式未能對所輸入的資料進行必要的查驗,就讓駭客有機可乘。駭客將特殊SQL指令(也就是有害的Query程式碼),送給(Inject)資料庫系統執行。而造成資料庫的安全問題。



“SQL Injection”並非透過病毒及一般攻擊手段,而是經由標準且既定的程序操作,較難從資料庫管理系統防範有破壞性的程式碼,唯有加強安全控管與降低程式存取資料庫的權限,最佳方式是從程式設計來著手,並建立起良好的程式開發風格與習慣,方能阻檔此類的攻擊事件。



什麼導致資料隱碼攻擊發生?

資料隱碼通常由於程式設計者使用 “建立字串” 技巧來產生要執行的SQL指令。例如,在搜尋網頁上,程式設計者可能使用下列程式碼來執行一個查詢:




Set myRecordset = myConnection.execute("SELECT * FROM Data_Table WHERE someText ='" & request.form("inputdata") & "'")



導致資料隱碼問題的發生是由於程式設計者的疏忽 – 缺乏輸入資料檢查。程式設計者相信使用者不會輸入一些會對資料庫有傷害的資料 – 例如:單引號(')。

當然,單引號不是唯一的問題。程式設計師應該檢查所有可以輸入的欄位,和欄位是否會讓有心的駭客執行 “資料隱碼”。



這個問題的影響?

依照給予應用程式執行資料庫的權限不同,而有不同程度的傷害:

:

權限等級
後果

sa
得到 SQL Server 以及作業系統完整的控制。攻擊者共過 xp_cmdshell 這個 extended stored procedure 能夠對 SQL Server 資料庫上的所有資料進行讀、寫、及修改。

db_owner
對被影響資料庫上的所有資料進行讀/寫。能夠刪除Table、建立新 Table、進而取得被影響資料庫的控制權。

normal user (no fixed server or database roles)

(recommended)
能夠存取該帳戶所被允許的資料庫物件。最好的狀況是只能夠執行某些 Stored Procedures;最差的狀況是可以存取所有的 Tables 和 Views 。




如何避免資料隱碼攻擊的發生?

以下提供一些方法來避免資料隱碼攻擊:

加強程式上的安全檢查措施:在程式中加上輸入資料型態檢查、資料長度檢查與資料內容檢查,讓駭客無法利用隱藏於輸入資料的特殊指令或程式碼有機可乘。
妥善使用權限管理:在程式中勿用較高權限來存取資料庫,比如說讓SQL程式使用資料庫管理員(System Administrator, SA)身份來存取資料庫。
保持良好的程式開發習慣:撰寫資料庫存取或查詢程式時,不應該直接接受單引號為輸入值,而應將輸入的單引號轉為兩個單引號'『''』後再交由 SQL 程式來處理;駭客通常會把隱碼附加在單引號『'』後做為輸入值。
將核心程式碼隱藏起來:勿讓網頁上程式直接存取或查詢資料庫,而是透過預存程式(Stored-procedure)來執行。
刪除多餘的資料表(Table):資料庫管理系統安裝後會有幾個既存的資料表,這些資料表是供程式開發、範例資料庫或暫存使用,如”pub”及”Northwind”等;因為這些公用的資料表架構是公開的,易為駭客所利用。
使用 Stored Procedure 將 Tables 與 Views 的存取隱藏起來。
當使用 Stored Procedures 時,使用 ADO Command 物件來呼叫。
建立程式碼撰寫標準並進行程式覆核 (Code Review)。


如何檢測目前的應用程式是否會受到資訊隱碼攻擊?

首先在測試平台上將錯誤處理的功能關閉,如此一來 ODBC 和 SQL Server 的錯誤就不會被顯示在畫面上。接下來在你的應用程式的輸入欄位鍵入單引號 (')測試是否會發生錯誤。如果有錯誤發生的話表示程式中對於輸入資料的驗證有問題導致錯誤的 SQL 指令產生,這是導致資料隱碼攻擊的原因。好的程式覆核(code review)才是解決問題的根本之道。提早預防,將會避免未來更大的災害發生 ....



更多的參考資料,請至微軟軟站:『資料隱碼』SQL Injection的源由與防範之道


2 回應者: Allen 日期: 2002/4/25 上午 10:39:25
以下資訊, 節錄自今早收到來自精誠公司發出的電子報, 僅供參考(以下資訊共非電子報全文)
=============================================
精誠公司提出下列「補救建議」,協助使用者強化網頁程式,避免遭受SQL Injection資料庫查詢植入攻擊:

 1. 針對特殊的SQL關聯式資料庫查詢參數,如 "--", " ' "等加以過濾或拒絕。
 2. 對於「Input Validation 輸入值檢查」部分,務必嚴加分辨與過濾"select"、"create"、"update"、"delete"、"insert"、"drop"等SQL關聯式資料庫查詢指令,防止駭客偽裝成合法使用者,在輸入過程中夾帶上述惡意指令。
 3. 對於特殊的輸入欄位,如使用者帳號或密碼的輸入,應設定網頁程式只能接受"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"英文大小寫與阿拉伯數字的輸入,並設定拒絕接受其他符號的輸入,以防止駭客在輸入值中夾帶"--", " ' "等符號。
 4. 在網頁程式中加入"Error Handling 錯誤檢查功能",以免駭客探知網頁程式是否有能力處理資料輸入時的錯誤。
 5. 設定資料庫系統的讀取權限,僅允許個別使用者調閱或修改自己的資料。
 6. 設定網站伺服器與資料庫伺服器的存取記錄功能,以利安全事件發生時,可供追查與佐證之用。



21 回應者: Fire 日期: 2002/4/25 下午 12:51:34
在 SQL 語法中, 字串要用單引號引起來,
如果字串本身就含有單引號, 那就要置換成連續兩個單引號(幾乎所有的程式語言都是如此吧!?)
asp 裡只要用 replace 就可以了 replace(xx, "'", "''")

至於用 like 時, 某些特殊字元(e.g. 萬用字元, 指數符號...)要用方括號包起來
像小鋪的這個討論區就無法搜尋特殊字元, 這是不合理的
假設我想搜尋某文章含有這個笑臉 ^_^ 它剛好每個字元都是有特別的用途
SQL 語法應該是:
select * from xxx where yyy like '%[^][_][^]%'
這一樣用 replace 就可以做啊
如果要搜尋的字串剛好又有"方括號"呢?
假設想搜尋的字串是 [^] 呢???
語法如下:
select * from xxx where yyy like '%[[][^]]%'



15 回應者: 新手 日期: 2002/4/24 下午 03:11:13
實在不懂隱碼..不過..是否只要
檢查到 ' 和 % 就回應給訪客要他重新輸入 是否這樣就會比較安全?

是否還要把一些特殊字串也給他擋下來

%1c
+dir+
cmd.exe



14 回應者: david 日期: 2002/4/24 下午 02:49:32
寫作時 , 有幾點是要注意的

1. WEB AP傳遞的變數 「'」 單引號最好要replace 掉

2. databse 的privilege 要設好

3.多用 Procedure , 少用SQL Statement 於WEB AP 中

4.Web Server 中關於 DB 的錯誤最好不要 show 出

... 等等 .




7 回應者: pop 日期: 2002/4/23 下午 10:25:16
還有限制帳號及密碼的字串長度
例如
帳號15字元
密碼 12字元
超過即不於認證




8 回應者: cuculon 日期: 2002/4/23 下午 10:30:47
還要限制萬用字元*及%才能完全杜絕這個攻擊.
cuculon 也不想公佈入侵方式,只能提醒大家.
一定要注意ID及password的檢查方式.
至於其他的資料輸入,倒不必太擔心.不用每個資料輸入的sub prg都要做這個檢查.




11 回應者: 胎疼喵 日期: 2002/4/23 下午 10:57:41
嗯...這問題存在許久...
很多網站我測過都有這問題......
有興趣的人...只要看到ASP網站..有輸入方塊...你就給他打一些奇怪符號..會出錯就是有問題了~
這種類型的站都有可能被破~
除此之外....除了修改資料庫等等....還可以跑一些Command..Like Dos Command...
夾雜在SQL Query String裡面......也是要注意的.....




2 回應者: Allen 日期: 2002/4/25 上午 10:39:25
以下資訊, 節錄自今早收到來自精誠公司發出的電子報, 僅供參考(以下資訊共非電子報全文)
=============================================
精誠公司提出下列「補救建議」,協助使用者強化網頁程式,避免遭受SQL Injection資料庫查詢植入攻

擊:

 1. 針對特殊的SQL關聯式資料庫查詢參數,如 "--", " ' "等加以過濾或拒絕。
 2. 對於「Input Validation 輸入值檢查」部分,務必嚴加分辨與過濾"select"、"create"、"update"

、"delete"、"insert"、"drop"等SQL關聯式資料庫查詢指令,防止駭客偽裝成合法使用者,在輸入過程

中夾帶上述惡意指令。
 3. 對於特殊的輸入欄位,如使用者帳號或密碼的輸入,應設定網頁程式只能接受

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"英文大小寫與阿拉伯數字的輸入

,並設定拒絕接受其他符號的輸入,以防止駭客在輸入值中夾帶"--", " ' "等符號。
 4. 在網頁程式中加入"Error Handling 錯誤檢查功能",以免駭客探知網頁程式是否有能力處理資料輸

入時的錯誤。
 5. 設定資料庫系統的讀取權限,僅允許個別使用者調閱或修改自己的資料。
 6. 設定網站伺服器與資料庫伺服器的存取記錄功能,以利安全事件發生時,可供追查與佐證之用。



9 回應者: 安安 日期: 2002/4/23 下午 10:44:36
概略介紹「資料隱碼」攻擊


--------------------------------------------------------------------------------

最近國內有關網路銀行出現「資料隱碼」的攻擊入侵事件,想知道它是什麼嗎?

其實我早在知城寫的「駭客解凍WEB網站篇」裡面,已經把有關「資料隱碼」攻擊類似的觀念呈現出來,像「ASP程式密碼驗證的漏洞」、「Showcode.asp洩漏檔案內容的漏洞」....等等,許多駭客間接入侵攻擊的內容,其實就是「資料隱碼」攻擊的前身,當時我就提出有許多網頁程式設計師撰寫網頁程式時,沒有考慮「程式漏洞」這個環節的錯誤!

沒想到時隔一年,這些綜合網頁資料庫程式漏洞的攻擊方式,出現了一個新名詞「資料隱碼」攻擊,這時才有許多國內人於重視....

什麼是「資料隱碼」?如果你有看過我「ASP程式密碼驗證的漏洞」那篇文章,你很容易就可以體會,它其實只是利用資料庫查詢程式撰寫的漏洞,讓你可以把「資料庫程式碼」當作一般資料丟給伺服器處理,使得伺服器錯把這些駭客丟來的「資料庫程式碼」偽裝資料,當成正常的資料庫程式來執行,藉而達到入侵的目的。

舉例來說,假如一個資料庫程式要做驗證密碼的工作,但是因為沒有作好「資料輸入」的查核,使得駭客可以夾帶 SQL 語法到資料內闖關:

SELECT webexplode(object,?::html),req_level FROM wbpages WHERE name='page' AND path='/' AND req_level <= 100

這就是「資料隱碼」攻擊

轉載自Hackland電子報~~

這個方法我也有用過,連校務行政都出過問題... 知道這個問題有多大了吧~!!


================================================================================

回應者: 祥

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 偵測方法

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

VI. 參考資料

* http://www.owasp.org/asac/input_validation/sql.shtml


本篇文章發表於2002-04-25 00:00
目前尚無任何回覆
   

回覆
如要回應,請先登入.