2008年5月20日 星期二

SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)

SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)

剪接語法

利用任何已知的使用者名稱登入1:例如在網咖偷偷地觀察某個使用者用什麼樣的帳號登入到哪個網站等等,或著先試試一般管理人員可能建立的使用者名稱,如:admin、administrator、supervisor、sa 等等。

在需要輸入使用者名稱的地方鍵入以下的內容2
Admin’--
而密碼欄位隨便亂輸入,對於會被執行的整句 SQL 沒有什麼關係。示意圖如圖 1

圖 1:利用已知的會員名稱登入,讓程式碼跳過密碼檢查。

你可以試著將輸入使用者名稱的內容與程式碼列表 2 的 SQL 語法做個整理,將會發現實際傳給 SQL Server 的語法如下

SELECT * FROM tblUser WHERE UserName='admin'--' AND Password='asdf'

關鍵就是原先的 AND 子句被 “--" 標示成說明,也就是 SQL Server 僅僅執行

SELECT * FROM tblUser WHERE UserName='admin'

自然,若有該使用者存在,則這個 SQL 查詢語法就傳回該記錄的所有欄位內容。再按照程式碼列表 2 的判斷方式:傳回的 Recordset 是否有記錄,若有就算登入驗證成功。則駭客就可以輕易地以該使用者的身分進入了。
用未知的使用者名稱登入:若沒有已知的帳號,也可以用以下的方式輸入到使用者名稱欄位,便能大大方方地侵入:

‘ or 1=1--

SQL Server 所接收的整個語法變成:

SELECT * FROM tblUser WHERE UserName='' or 1=1--' AND Password='asdf'

因為加上的 or 1=1,則不管之前的條件為合,只要某個條件為真,整個判斷式就都為真,因此回傳的 Recordset 物件包含了全部的會員記錄。也導致程式碼列表 2 中的 Recordset 物件 EOF 屬性為 False。

沒有留言: