前提條件:
聯合查詢注入利用的前提是頁面上有顯示位。
顯示位:在一個在一個網站的正常頁面,服務端執行SQL語句查詢數據庫中的數據,客戶端將數 據展示在頁面中,這個展示數據的位置就叫顯示位。
注意:union可合並兩個或多個select語句的結果集, 前提是兩個select必有相同列、且各列的數據類型也相同。
聯合注入的過程:
1、判斷注入點
2、判斷是整型還是字符型
3、判斷查詢列數
4、判斷顯示位
5、獲取所有數據庫名
6、獲取數據庫所有表名
7、獲取字段名
8、獲取字段中的數據
一、判斷注入點
and 1=1 / and 1=2 回顯頁面不同(整形判斷)
單引號判斷‘ 顯示數據庫錯誤信息或者頁面回顯不同(整形,字符串類型判斷)
\ (轉義符)
注:加號‘+’在URL中有特殊含義,因此在需要對其進行URL編碼為%2b。%20是空格的意思,在瀏覽器中注入回車后空格會自動轉化成%20。
二、判斷是整型還是字符型
輸入and 1=1和and 1=2后發現頁面沒有變化,判斷不是整型注入。
輸入' and 1=1 和 ' and 1=2 后發現頁面變化,判斷為字符注入 。(%27是 ' 的意思)
在數據庫中 1=1 和1=2 后面隨便輸入字符串(相當於1=1和1=2后面的查詢語句),發現select 1="1dasd"時返回1正確,1="2dasd"時返回0錯誤,即select在查詢時忽略后面的字符串,只讓1和后面第一個數字對比,如果相等就是正確,不相等返回錯誤。
三、判斷查詢列數
order by 函數是對MySQL中查詢結果按照指定字段名進行排序,除了指定字 段名還可以指定字段的欄位進行排序,第一個查詢字段為1,第二個為2,依次 類推。我們可以通過二分法來猜解列數
輸入 order by 4--+ 發現頁面錯誤,說明沒有4列
輸入 order by 3--+ 發現頁面正確,說明有3列
四、判斷顯示位
UNION的作用是將兩個select查詢結果合並,
程序在展示數據的時候通常只會取結果集的第一行數據,看一下源碼,mysql_fetch_array只被調用了一次,而mysql_fetch_array從結果集中取得一行作為關聯數組或數字數組或二者兼有,具體看第二個參數是什么。所以這里無論怎么折騰最后只會出來第一行的查詢結果。只要讓第一行查詢的結果是空集,即union左邊的select子句查詢結果為空,那么union右邊的查詢結果自然就成為了第一行,打印在網頁上了。
輸入?id=-1' 或者 1' and 1=2 后面跟上union select 1,2,3--+
可以看到將uid改為-1后第二行打印在頁面上。使union前面的語句報錯,執行后面的,爆出顯示位,2,3
五、獲取所有數據庫名
group_concat()一次性顯示:
select group_concat(schema_name) from information_schema.schemata
顯示當前數據庫: database()
六、獲取表名
把上面語句中的 schema_name 改成查表名的語句 table_name,information_schema.schemata改成information_schema.tables,后面跟上在哪查的where table_schema='庫名'。
七、獲列名
直接上payload了:select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'
八、獲取列中的信息
select group_concat(0x3a,username,password) from users
也可以用 concat_ws函數 limit 0,1 一條一條查,這里就不做演示了。