天天看點

SQL 注入詳解 SQL 注入詳解

SQL 注入原理

SQL注入攻擊指的是通過建構特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL文法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,緻使非法資料侵入系統。

SQL 注入分類

1. 數字型注入

當輸入的參數為整型時,則有可能存在數字型注入漏洞。

假設存在一條 URL 為:HTTP://www.aaa.com/test.php?id=1

可以對背景的 SQL 語句猜測為:

SELECT * FROM table WHERE id=1

判斷數字型漏洞的 SQL 注入點:

① 先在輸入框中輸入一個單引号 '

這樣的 SQL 語句就會變為:

SELECT * FROM table WHERE id=1',

不符合文法,是以該語句肯定會出錯,導緻腳本程式無法從資料庫擷取資料,進而使原來的頁面出現異常。

② 在輸入框中輸入 and 1 = 1

SQL語句變為:

SELECT * FROM table WHERE id=1 and 1 = 1

語句正确,執行正常,傳回的資料與原始請求無任何差異。

③ 在資料庫中輸入 and 1 = 2

SQL 語句變為:

SELECT * FROM table WHERE id=1 and 1 = 2

雖然文法正确,語句執行正常,但是邏輯錯誤,因為 1 = 2 為永假,是以傳回資料與原始請求有差異。

如果以上三個步驟全部滿足,則程式就可能存在數字型 SQL 注入漏洞。

2. 字元型注入

當輸入參數為字元串時,則可能存在字元型注入漏洞。數字型與字元型注入最大的差別在于:數字型不需要單引号閉合,而字元型一般需要使用單引号來閉合。

字元型注入最關鍵的是如何閉合 SQL 語句以及注釋多餘的代碼。

假設背景的 SQL 語句如下:

SELECT * FROM table WHERE username = 'admin'

判斷字元型漏洞的 SQL 注入點:

① 還是先輸入單引号 admin' 來測試

這樣的 SQL 語句就會變為:

SELECT * FROM table WHERE username = 'admin''。

頁面異常。

② 輸入:admin' and 1 = 1 --

注意:在 admin 後有一個單引号 ',用于字元串閉合,最後還有一個注釋符 --(兩條杠後面還有一個空格!!!)。

SQL 語句變為:

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

頁面顯示正确。

③ 輸入:admin' and 1 = 2 --

SQL 語句變為:

SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

頁面錯誤。

滿足上面三個步驟則有可能存在字元型 SQL 注入。

3. 其他類型

其它類型比如Cookie 注入、POST 注入、延時注入等。