• Web Security 10.10.2014

    Time Based Blind SQL Injection 

    ID-100142321

    這個方法指的是當 Web Server 沒有傳回任何錯誤或是 SQL 執行成功與否的訊息時,

    透過 “Blind”的方式來猜測,透過 Yes or No 的邏輯關係,來得知資料庫背後的資訊。

     

    因此,有心人士可以透過 blind SQL injection 的方式進一步取得資料庫的隱私資料,

    讓我們研究一下這樣的漏洞是怎麼形成的?

     

    最常見的方式就是 Sleep ,舉一個例子來說:

    If A = 1

    Sleep 1

    Else

    Sleep 10

    如果 a = 1 的話,就 sleep 一秒,否則就 Sleep 十秒

    因此,透過 sleep 的反應時間,可以間接知道 A 的值為何?

    套用在 SQL Server 的話,如果我們想得知該 SQL Server 的版本,

    該 Query 就會變成

     

    Select CASE WHEN substring((select version()),1,1)=5

    THEN        (sleep(1))

    ELSE

    (sleep(20)

    這樣的 SQL Injection 就稱為 “Blind & Time Based SQL injection”

     

    安全防護

    1. Input Validation

    驗證任何輸入的參數

    2. Prepare Statement or Stored procedure

    對於資料庫的操作盡量使用 Stored procedure 的方式執行

    3. Escaping 使用者的輸入值

    也就是將使用者輸入的參數進行編碼,再做SQL Query 的執行

    如果程式開發人員會考量到重新寫 Stored procedure 會影響到整個程式架構的話,

    使用 Escaping 會是比較建議的方案,但是這個方法的缺點是無法 100%避免 SQL injection

    這個方法主要用在當系統架構很大而且有很多歷史的包袱,

    無法在短時間將程式改成 Stored procedure的寫法時採用

    每一種資料庫都有提供相對應的 Encoder 的方式

    例如, SQL Server ,可以用 quotename 的函數將特定的字元編碼

    該函數可以將系統特定指令字元轉換為 “]”

    set @data = ‘ This is test ] ‘

    print quotename( @data )

    — Will print [this data needs to be escaped: ]] ]

    — 因為 ‘ 為 SQL 指令字元,所以被轉換為 ]

     

    4. 盡量避免下列字元輸入

     

    輸入字元 Transact-SQL 中的意義
    ; 查詢分隔符號。
    字元資料字串分隔符號。
    註解分隔符號。
    /* … */ 註解分隔符號。伺服器不會評估 /* 和 */ 之間的文字。
    xp_ 做為目錄擴充預存程序名稱的開頭,如 xp_cmdshell

     

    參考資料

    http://technet.microsoft.com/zh-tw/library/ms161953(v=sql.105).aspx

    http://nahamsec.com/

    Posted by Tony @ 11:48 am

    Tags: , , ,

  • Leave a Reply

    Your email address will not be published.