• Web Security 08.10.2014

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

    Posted by Tony @ 5:28 pm

    Tags: , ,

  • Leave a Reply

    Your email address will not be published.