網站為了提供會員註冊、討論區、電子商務等雙向互動功能,通常將資料儲存於資料庫,資料庫也因此成為各方駭客關注的焦點。SQL Injection通常是利用網站程式疏於檢查的弱點,嘗試輸入資料庫控制字元(meta-characters),藉以跳過網站原本設計的檢查,進而盜取、修改資料庫內容,入侵資料庫系統。舉例來說,一般網站為了提供使用者個人化設定,大都會要求使用者以帳號密碼登入。如前面所言,這些資料一般會儲存於資料庫,在使用者輸入帳號密碼後,然後用以下的程式組成SQL 命令做確認
SELECT * FROM users WHERE username=’$_POST[username]’ AND password=’$_POST[password]’;
在這個例子中,使用者輸入的資料 $_POST[username] 被原封不動地採用。如果有人惡意地在帳號的欄位輸入’OR 1=1 –-,那麼SQL指令會變成
SELECT * FROM users WHERE username=’’ OR 1=1–- AND password=’’;
由於–-之後的字串被視為註解不會執行,也因此上述指令等同於:
SELECT * FROM users WHERE username=’’ OR 1=1;
OR 1=1會造成WHERE的右半邊條件永遠成立,所以等同於
SELECT * FROM users;
由於一定會有的資料回傳,至此入侵者就通過身份驗證,進入會員專區。
跳過帳號密碼檢查的身份認證畫面,只是入侵行為的開端。接下來可以利用trail and error的方式,嘗試於網頁各個FORM輸入奇怪的數字、數值與文字,想辦法讓程式發生錯誤,進而顯示包含詳細錯誤訊息的debug畫面。透過這些寶貴資訊,可以讓駭客拼湊出資料庫table schema,瞭解每個欄位名稱屬性。最後,仿照上述的攻擊方法,將帳號欄位的輸入字串改為:
‘; INSERT INTO account(username,quota) VALUES(‘john’,’1000’);
‘; UPDATE product SET price=’100’WHERE id=’5001’;
即可恣意新增、修改資料庫內容,獲取不法利益。如果資料庫的權限設定鬆散,甚至可能允許更嚴重的破壞行為,例如:
‘; DROP TABLE users;
‘; DROP DATABASE web;
‘; SHUTDOWN;
◆ Cross Site Scripting(XSS)及安全寫作建議
如果造訪的網站是由知名企業所提供,是否就不至於發生資料遭竊或者是被植入後門程式?答案是否定的。惡意駭客善於利用人們的信賴,嘗試於正常網站插入惡意程式碼,故意讓一般使用者在不知情的狀況下,點選該連結,甚至無須點選即自動連線執行,進而竊取使用者資料。這種攻擊方式,被稱為Cross Site Scripting[5],簡稱XSS。駭客最常利用的網頁功能,包括拍賣網站、貼圖網站、新聞評論及blog的留言版。主要原因包括這些網頁具備高人氣特性,匯集眾多人潮,並且允許使用者輸入意見交流。為了提高使用者意願,鼓勵參與討論,這些留言版通常僅象徵性利用圖形辨識方法,進行簡單驗證,或者允許新註冊使用者流言,有的甚至完全不做身份驗證。如此一來,有心人士就可以在留言版大作手腳,傷害隨後造訪瀏覽的無辜使用者。