SQL Injection 的測試與防範
網站後端的資料通常會存放在資料庫中,(MySQL or MS SQL Server)
網站的程式資料查詢或是更新,將對後端資料庫進行SQL 語法的執行
因此,只要巧妙的設計輸入值,就會造成該 SQL 語法執行其他非預期的結果
舉例來說,這個 SQL 語法
Select Name from Users where password = $pwd
這個例子中,$id 為使用者輸入參數,最常見的方式為在 Where 的條件中加入 or 1 = 1 —
Select Name from Users where password = ‘a’ or 1 = 1 —Select Name from Users where password = ‘b’ or 1 = 1 —
Select Name from Users where password = ‘c’ or 1 = 1 — |
如以一來該 SQL statement 永遠成立,不論 where 條件為何都會執行
如果這種情況發生在登入密碼的檢查的話就很危險
因為不論該輸入的密碼為何,該 SQL 都會成立
SQL injection 兩種策略
1. 透過受害者網頁或是應用程式介面:
這種方式指的是,測試相關的 query or login頁面的輸入,是否有條件的限制
通常會透過上述 or 1 = 1 的方式測試
2. 透過 Email 或是其他方法讓受害使用者執行
這種方式為駭客事先準備好一定的 SQL scripts or http request,並且透過社交工常,讓受害者點擊並執行
SQL injection 五種技巧
歸類來說,SQL injection 的語法有五種技巧,分述如下:
1. Query 1 UNION Query 2:
透過 UNION 可以將兩種 query 的集合彙整起來,
第一個 query 1 為程式原本預期的,第二個 query 2為駭客加入的
2. Boolean
運用邏輯運算 true or false 來得知 SQL server 的資訊,
例如: 如何得知 Table or Column Name?
可以查詢:
請問第一個字元是否為 a ?
請問第一個字元是否為 b ? ….
請問第二個字元是否為 a ?
這種方式比較費時,當然也有自動化工具可以完成這些測試
3. Error 錯誤訊息
透過SQL Server 會在語法錯誤時,回傳錯誤訊息於網頁或是 http request 時,
可以得知進一步的訊息
例如:
SQL 版本
語法錯誤
資料型態轉換錯誤
4. HTTP request
設計 http request 將相關的 SQL 指令透過 http request 傳送
或是透過 email 讓使用者觸發該 http request
5. Sleep
當網頁或是 http response 不會回傳任何訊息、執行結果、或是錯誤訊息時,
透過資料庫 sleep 的指令,可以間接知道指令執行的狀況,例如:
“請問 Table Name 第一個字元是否為 ‘a’,是的話 sleep 10秒”
因此,透過該應用程式反應的時間,來判斷是否有執行成功.
如何測試?
這邊舉一個簡單的例子
情境:登入時的帳號密碼驗證,
使用者輸入 UserName 與 Password 之後
帳號密碼存放於資料庫,因此就會進行這樣的查詢
SELECT * FROM Users
WHERE
Username=’$username’ AND Password=’$password’
透過 or 1 = 1 的輸入讓 SQL 語法變成
SELECT * FROM Users
WHERE
Username=’1’ OR ‘1’ = ‘1’
AND
Password=’1’ OR ‘1’ = ‘1’
因此,該使用者或是密碼不管打什麼,該 SQL 皆會成立
假設該 UserName 與 Password 是透過 HTTP GET 來傳送的話,
最後傳送的 http GET request為:
http://www.SQLInjection.com/login.php?Username=’1’ OR ‘1’ = ‘1’ & Password=’1’ OR ‘1’ = ‘1’
網站安全防護?
1. prepared statements (aka parameterized queries)
將相關的參數輸入見證檢查完後,在組合出適當的 SQL statement
2. Input validation
單純透過前端網頁 JavaScript的檢查還不足夠,
還需要於後端網站程式檢查輸入的參數合法性、字元、長度等
3. 網站與資料庫回傳訊息
將 database 執行結果、錯誤訊息等回傳
讓http response 或是網頁回傳的訊息,不會包含 SQL 相關的執行結果或是錯誤
4. Firewall or IDS
Firewall 與 IDS 針對 HTTP Request 內容,可疑的 SQL injection (例如 1 = 1 )進行驗證