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語句即可。