天天看點

SQL注入:union注入學習筆記整理結構第一步:判斷類型接下來的步驟均假設注入類型為字元型,開始union注入的幾大步驟:第二步:判斷字段數第三步:判斷回顯點第四步:獲得資料庫庫名第五步:獲得表名第六步:獲得字段名最後:查資料

union注入即為用union聯合查詢來查詢指定的資料,需要根據每一步的傳回結果來判斷和進行下一步操作。此僅為個人的學習筆記。

結構

聯合查詢的語句結構基本為:

union會一次顯示兩個查詢結果,使第一個查詢語句作為正常内容,第二個作為查詢語句來進行構造。

第一步:判斷類型

數字型判斷

共分3步判斷步驟:

1.加單引号,如輸入id=1’,對應的sql為:select * from table where id=1’ 這時sql語句出錯,程式無法正常從資料庫中查詢出資料,就會抛出異常。

2.加and 1=1,如輸入id=1 and 1=1,對應的sql:select * from table where id=1’ and 1=1 沒有文法錯誤且邏輯判斷為正确,是以傳回正常。

3.加and 1=2,如輸入id=1 and 1=2,對應的sql:select * from table where id=1 and 1=2 沒有文法錯誤但是邏輯判斷為假,是以傳回錯誤。

若滿足上述步驟,則注入類型為數字型。

字元型判斷

也分3步。

1.加單引号,對應的sql語句由于加單引号後變成三個單引号,則無法執行,程式會報錯;

2.輸入id=‘x’ and ‘1’='1,對應的Sql 語句:select * from table where id = ‘x’ and ‘1’=‘1’,文法正确,邏輯判斷正确,是以傳回正确。

3.輸入id='x’and ‘1’='2,對應的Sql 語句:select * from where id = ‘x’ and ‘1’=‘2’,

文法正确,但邏輯判斷錯誤,是以傳回正确。

若滿足上述步驟,則注入類型為字元型。

接下來的步驟均假設注入類型為字元型,開始union注入的幾大步驟:

第二步:判斷字段數

1.union有嚴格的限制條件,必須保證字段數一緻,即兩個查詢結果有相同的列數,是以我們要對字段數進行判斷。

2.可以使用order by number ,其作用為輸出第number列。如:

3.一直增加number的數值直到報錯,則前一位數字即為字段數。

第三步:判斷回顯點

1.判斷回顯點即為判斷在哪個字段出會輸出有效資訊,可以輸入如

id=1' union select 1,2,3,...... limit 1,1 --+
id=-1' union select 1,2,3,...... --+

           

聯合查詢的輸出是嚴格按照順序進行的,是以當id=1存在時會在第0行輸出第一個sql語句查詢到的結果,是以我們輸入的數字就到了下一行。

其中:

第一種方法中 limit n,m 的作用為從第n行開始顯示m行内容;

第二種方法使id=-1直接使查詢結果為空,這樣,就不會占用第0行。

2.找到回顯字段後,就可以把SQL語句寫在該位置,相應的結果也會輸出。

第四步:獲得資料庫庫名

1.在可以回顯的位置輸入database()可獲得目前資料庫名。假設2位置為回顯的位置,如:

2.可以使用group_concat() 将所有内容寫入一行并輸出。

第五步:獲得表名

假設是在2為=位置回顯,則使用語句:

其中:information_schema是mysql自帶的庫,記錄了該資料庫所有的表名和字段名,該句的含義為:查找資料庫中xxx庫下的所有表名,group_concat() 将所有内容寫入一行并輸出。

第六步:獲得字段名

同上,隻需要一條語句:

> id=-1’ union select 1,group_concat(column_name),… from
information_schema.columns where table_schema=‘xxx’ and
table_name=‘xxx’ --+
           

即為查詢資料庫xxx下表xxx中的所有字段.

其中:Column_name 為字段/列名稱。

最後:查資料

經過上述六步,獲得了庫名,表名,字段名後,在可以回顯的位置輸入SQL語句即可。

繼續閱讀