SQL Injection 的測試與防範

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 )進行驗證

 

Leave a Reply

Your email address will not be published. Required fields are marked *