1. 程式人生 > >SQL 注入基礎系列3——判斷sql注入點

SQL 注入基礎系列3——判斷sql注入點

1 判斷是否存在sql注入漏洞

  • 單引號判斷法

在引數後加單引號

http://xxx/abc.php?id=1'

如果頁面返回錯誤,則存在 Sql 注入。 因為無論字元型還是整型都會因為單引號個數不匹配而報錯。 (如果未報錯,不代表不存在 Sql 注入,因為有可能頁面對單引號做了過濾,這時可以使用判斷語句進行注入)

  • 判斷語句判斷法

2 判斷sql注入漏洞的型別

Sql 注入漏洞可分為 2 種類型——數字型、字元型。

資料庫表字段的資料型別有多種,但是所有這些資料型別,都可劃分為“數字型”與“字元型”兩大類。

2-1 數字型判斷

當要輸入的引數 x 為數字型時,通常 abc.php 中 Sql 語句型別大致如下: select * from <表名> where id = x

數字型別可以使用 and 1=1 和 and 1=2 來判斷:

  • Url 地址中輸入 http://xxx/abc.php?id= x and 1=1 頁面依舊執行正常,繼續進行下一步;
  • Url 地址中繼續輸入 http://xxx/abc.php?id= x and 1=2 頁面執行錯誤,則說明此 Sql 注入為數字型注入。

原因如下:

當輸入 and 1=1時,後臺執行 Sql 語句:

select * from <表名> where id = x and 1=1 

沒有語法錯誤且邏輯判斷為真,所以返回的資料正常。

當輸入 and 1=2時,後臺執行 Sql 語句:

select * from <表名> where id = x and 1=2

沒有語法錯誤但邏輯判斷為假,所以返回的資料異常。

再使用假設法,

如果這是字元型注入的話,輸入以上語句後,應該出現如下情況:

select * from <表名> where id = 'x and 1=1' 
select * from <表名> where id = 'x and 1=2' 

2條查詢語句將 and 語句全部轉換為了字串,並沒有進行 and 的邏輯判斷,所以不會出現and 1=1時返回的資訊正確,and 1=2時返回的資訊錯誤的情況,故假設是不成立的。

2-2 字元型判斷

當要輸入的引數 x 為字元型時,通常 abc.php 中 SQL 語句型別大致如下: select * from <表名> where id = 'x'

字元類可以使用 and '1'='1 和 and '1'='2來判斷:

  • Url 地址中輸入 http://xxx/abc.php?id= x' and '1'='1 頁面執行正常,繼續進行下一步。
  • Url 地址中繼續輸入 http://xxx/abc.php?id= x' and '1'='2 頁面執行錯誤,則說明此 Sql 注入為字元型注入。

原因如下:

當輸入 and '1'='1 時,後臺執行 Sql 語句:

select * from <表名> where id = 'x' and '1'='1'

沒有語法錯誤且邏輯判斷為真,所以返回的資料正常。

當輸入 and '1'='2 時,後臺執行 Sql 語句:

select * from <表名> where id = 'x' and '1'='2'

沒有語法錯誤但邏輯判斷為假,所以返回的資料異常。

再使用假設法,

如果這是數字型注入的話,輸入以上語句後,應該出現如下情況:

select * from <表名> where id = x and '1'='1
select * from <表名> where id = x and '1'='2

2條查詢語句進行 and 的邏輯判斷時語法錯誤,所以不會出現and '1'='1時返回的資訊正確,and '1'='2時返回的資訊錯誤的情況,故假設是不成立的。

 

參考資料——實驗樓《sql注入基礎原理介紹》