2008年7月5日 星期六

SQL INJECTION

SQL 指令植入式攻擊,但我覺得滿像填字遊戲..
SQL INJECTION並不是針對資料庫或是OS本身的漏洞來攻擊,會造成SQL INJECTION的得逞主要的原因是未做好輸入驗證Input Validation,所以說會造成DB的癱瘓最主要的原因就是程式設計師或軟體開發者的疏忽所產生的!!

舉個例子:
一般最基本的網站登入的驗證SQL Statement


SELECT * FROM DBO.USER WHERE ID = 'AJAX' AND PW = '密碼'

上面的SQL Statement應該是最基本的帳號驗證程式碼,看起來程式應該沒有什麼多大的問題...

但是如果使用者將帳號的輸入欄位改成:
AJAX --->> ' OR 1=1;--
則上面的登入驗證程式會改變成

SELECT * FROM DBO.USER WHERE ID = '' OR 1=1;--' AND PW = '密碼


這樣就會是一個很大的漏洞...

更嚴重的如果登入帳號在DB上有更大權限時....
AJAX --->> ' ;TRUNCATE TABLE DBO.USER --

SELECT * FROM DBO.USER WHERE ID = '' ;TRUNCATE TABLE DBO.USER --' AND PW = '密碼


AJAX --->> ' ;DROP Database (DB Name) --

SELECT * FROM DBO.USER WHERE ID = '' ;DROP Database (DB Name) -- ' AND PW = '密碼

或是嫌DB主機礙眼
AJAX --->> ' ;SHUTDOWN --

SELECT * FROM DBO.USER WHERE ID = '' ;SHUTDOWN -- ' AND PW = '密碼


我想這樣的後果大家應該都可以想像的到..!!!OH MY GOD!!!!!
所以說不管使用ASP.JSP.PERL.PHP等等...只要後端DB是使用SQL標準語法,都會有這種SQL INJECTION的危險!!
所以回過頭來說防範SQL INJECTION最簡單的方法還是 input validation
1.過濾所有可能的字串,例如ESCAPE(\).註解(--).分隔號(;)等等....
2.限制登入者身分的最小可存取之權限
3.將檢查放在Server端,而非Client端(不要輕易相信JAVASCRIPT的檢查結果)
4.使用SQL PROCEDURE來完成SQL Statement....

SQL INJECTION的防範最主要大概就是如此...
網路上有一些SQL INJECTION的檢測工具,大家去GOOGLE找一下應該就有了..

沒有留言: