2012年5月30日

Security 資訊安全 1. SQL Injection

SQL Injection是一種設計邏輯上的疏失造成的系統漏洞,不管用什麼程式語言、資料庫,都可能會中獎。
一個不小心,就足以讓整個系統門戶大開,赤裸裸的給人看光。

舉一個簡易的例子:
string selectCommand = 
@"SELECT UserName FROM UserAccount WHERE UserID='" + Request("UID") + "' AND UserPWD='" + Request("PWD") + "'";

如果輸入 UID為 ' or 1=1 --
這樣上方例子中的 SQL指令變成:
SELECT UserName FROM UserAccount WHERE UserID='' or 1=1 -- ' AND UserPWD=''";
就可以直接登入

如果管理者帳號為 admin,輸入 UID為 admin'--
SELECT UserName FROM UserAccount WHERE UserID='admin'-- ' AND UserPWD=''";

瞬間就可以以管理員權限登入,想做什麼就做什麼!!

再衍生下去則可以利用錯誤訊息獲得管理者權,停掉資料庫、刪除資料或卸除資料庫等,甚至取得伺服器主機管理權限等,不可不防。


另外,辛辛苦苦完成的網站上線後,若沒有做自訂錯誤頁面,直接暴露出所有 error、exception訊息,則使用者也可以利用錯誤訊息,摸透資料庫的內容,接著幹出一堆很邪惡很邪惡的事。
(詳細步驟可看 SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上))


重點!!
1. 過濾使用者輸入的資料。
2. 不要直接以字串串接組合出 SQL指令。
3. 不要把錯誤訊息顯示給使用者。


解決方式:
ASP .NET
  • 使用 Command物件或 SqlCommand類別,透過參數執行 SQL 語法。
  • 正式環境中,將 web.config內的 customErrors設為 "On"。
  • 在伺服器端檢查與限制輸入變數的型別與長度,過濾掉不需要的內容,不要完全信任使用者輸入的內容。
  • 登入 SQL Server的帳號不使用 sa或任何屬於 Sysadmin群組的帳號,避免有過大的權限。


參考資料:
網站
    SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上) (下)
    『資料隱碼』SQL Injection的源由與防範之道
    SQL Injection 緊急應變建議
PDF
    ASP .NET 防駭指南
    你的網站在裸奔嗎? 一個SQL Injection實例的啟示

沒有留言:

張貼留言