Time Based Blind SQL Injection 淺談

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/

Leave a Reply

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