2009年10月19日 星期一

SQL Injection之解決建議措施及相關資訊彙整

漏洞說明:
SQL Injection是一種未做好輸入查驗(Input Validation)的問題,即在撰寫應用程式時,沒有對使用者的輸入做妥善的過濾與處理,便將其組合成SQL指令,傳送給SQL server執行。因而若使用者輸入之資料中含有某些對資料庫系統有特殊意義的符號或命令時,便可能讓使用者有機會對資料庫系統下達指令,而造成入侵所帶來的損失。事實上,這樣的疏漏並不是資料庫系統的錯誤,而是程式設計師或軟體開發者的疏忽所產生的。

影響平台:
使用網站系統:Apache、IIS、Domino、Netscape

使用程式碼:
ASP、PHP、JSP

攻擊破壞SQL資料庫:
包括 MS-SQL、MySQL、Oracle、Sybase、DB2 等等

SQL Injection可能造成的危害:
透過SQL Injection操作資料庫,可以新增、更動或刪除資料庫的資料,造成資料遺漏或是不正確;如果操作資料庫的使用者權限為系統管理者,那麼還有可能造成其他更嚴重的破壞,例如奪取資料庫的控制權。

SQL Injection的影響範圍:
只要有使用或連結資料庫的軟體、網路服務都有可能面臨SQL Injection的威脅。乍聽之下影響範圍似乎很大,但是大多數的商用軟體並不會有這樣的問題;比較嚴重的可能是網路服務部分,由於網站程式開發者的素質良莠不齊,或是對於資料庫的指令操作與系統管理不熟悉,所以只要有提供表單(Form)輸入介面的網站,都有可能面臨威脅。

解決之道與預防方法:
1. 對於字串的輸入加以過濾,並限制長度。例如 ' 或 " 這種單、雙引號都應該過濾掉,這樣可以避免輸入者利用 ' 或 " 這種單、雙引號截斷原本的SQL指令再插入自己的指令。過濾的方法依開發語言的不同而有不同的方法,以VB Script/ASP為例,過濾單引號的簡單方法為: SafeString = Replace(InputString, “'”, “''”)


2. 若輸入為數值資料則須確定其只輸入0~9之數字,若包含其他英文字母或符號則一律拒絕接受。

3. 對於前兩項的檢查必須寫在server端的程式上,如PHP、ASP及其他各種CGI程式,而不能將其寫於Java script或VB script等會於client端執行的程式上,因惡意使用者可將client端程式另存於本地端硬碟後,再將其修改以略過檢查。並且不要在server上留有.bak或.old檔,若有.inc檔也不要取與主.asp相同或容易猜測之檔名,因為一般網頁伺服器會允許這些檔案的下載。

4. 加強資料庫帳號與權限管理,讓網站或軟體不以系統管理者的帳號連結資料庫,而對每個資料庫設定一組個別的帳號與強健的密碼,限制這組帳號僅能對該資料庫有讀寫權限。當面臨SQL Injection的侵入時,分權管理能夠限制損害的範圍,減少因為疏忽造成的損失。

5. 做好正確錯誤處理,最理想狀態是所有使用者輸入皆在程式設計者預期之中;若萬一出現非預期的情形也要做好例外處理,勿讓使用者直接看到系統傳回的錯誤訊息,以免惡意使用者由系統錯誤訊息中獲取過多資訊。

6. 全面檢視軟體的程式碼。這在一般商用軟體或應用軟體不太可能做到,但是可以詢問軟體廠商這類問題,以確保他們有進行檢查;網站程式的部分,可以請開發的程式設計師做一次全面性的檢查。

7. 各資料庫系統安裝時通常會有一些預先定義的Table,若確定這些Table並不需要使用到,最好予以刪除,以免惡意使用者利用這些Table獲取過多資訊。

8. 做好軟體開發控管。針對每個資料欄位的Input,確實做好檢查的工作,以降低開發出面臨威脅的程式或軟體。

轉自 邦邦的部落格 http://blog.xuite.net/longine.chen/itforum/14788402?ref=rel

沒有留言:

張貼留言