SQL Injection — Boolean Exploitation Technique

SQL Injection — Boolean Exploitation Technique

我們知道大部分的網站存取資料都是透過資料庫,

不外乎使用 MySQL 因為為 opensource,或是 SQL Server 微軟 IIS 等的 solution

因此,駭客利用輸入的弱點,輸入特定指令讓該 SQL query 語法執行出非預期的結果

這次主要要介紹的是 Boolean Exploitation

Boolean Exploitation 

主要是利用特定條件式的 query 讓 SQL Server 來告訴駭客 Yes or No

這種主要用在當相關 SQL Server 回傳的訊息或是錯誤訊息都沒有或是比較少的情況下,

駭客會使用的一種技巧,

例如:該 table 名稱第一位字元是不是 A ? 第二位字元是不是 B? 等等

如此只要時間與嘗試的次數夠多,還是可以知道 Table Name、內容等

 

舉例來說,正常的 query 如下

http://www.example.com/index.php?Product_id=1

通常測試沒有 SQL injection 的可能性,會輸入一個非法字元造成該 SQL Query syntax error

例如:

http://www.example.com/index.php?Product_id=1′

接著,透過一些函數的幫忙,可以得知更進一步的訊息,

例如:欄位名稱、或是 password 的值

因此,駭客就會輸入下列字串

1’ AND ASCII(SubString(password,1,1))=97 AND ‘1’=’1

該 query 的主要用意就是問 SQL Server

請問 password 第一個字元ASCII 字碼是否 97

整個SQL Query 執行指令就變成

 

SELECT username, password FROM Users WHERE Id=’1’ AND
ASCII(SUBSTRING(username,1,1))=97 AND ‘1’=’1

如果不是 的話,就試 ASCII = 98 , 99, 100 ……

 

如何知道分辨SQL Server 回傳 Yes or No 的結果?

可以輸入下列兩組指令,一組一定會為 Yes. 另一組一定為 No

因此,看 SQL Server 回傳到 Web Server , HTTP response 的內容可以判斷

1’ AND ‘1’ = ‘2

1′ and ‘1’ =’1

 

另外一種方法為,利用 Sleep ,刻意延遲 SQL server 回應的時間,

例如:

若第一個字碼的ASCII = 97,就延遲 10 秒,不然就回傳 False

    1′ AND If(SUBSTRING(username,1,1))=97, sleep(10), ‘false’))  —

當然,可以輸入兩組,一組一定為 yes,另一組一定為 no,

看看網站延遲反應的狀況,

透過這樣的方式即使沒有任行的 http response message,也能夠進行 SQL injection

1′ AND If( 1 = 1, sleep(10), ‘false’))  —

1′ AND If( 2 = 1, sleep(10), ‘false’))  —

 

安全防護建議

1. Input validation 不僅在 client 端做檢查,更要在 Web Server 端做檢查

2. SQL prepared statement 或是用 Store procedure 來執行接收到的參數,並免直接執行該 SQL statement

3. Firewall / IDS

4. 輸入字元的合法性與長度檢查

5. SQL error 訊息的設定隱藏,不回傳於 Web Server

6. Database Least privileged ,使用者權限的設定僅限於授權的查詢

Leave a Reply

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