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 ,使用者權限的設定僅限於授權的查詢