此文章僅供學習使用,請勿用作違法行為,
目錄
注入的前提條件
基本思路
1.判斷是否存在注入點,以及注入的型別(字符型/數字型)
2.猜解SQL查詢陳述句中的欄位數和欄位順序
3.確定回顯點
4.獲取當前資料庫
5.獲取資料庫中的表
6.獲取表中欄位名
7.獲取欄位中的資料(此時已可以成功獲取資料庫內容)
注入的前提條件:
- 引數用戶可控:用戶可以控制前端傳入后端的引數內容
- 引數可帶入資料庫進行查詢:用戶傳入的引數可以直接拼接到資料庫的SQL陳述句,且帶入資料庫查詢,
基本思路:
1.判斷是否存在注入點,以及注入的型別(字符型/數字型)
要判斷是否存在SQL注入,最經典的是單引號判斷法(在引數后面加上一個單引號),如果頁面回傳報錯,就是說明存在SQL注入,(原理:無論是字符型還是數字型,都會因為單引號個數不匹配而報錯,因為單引號都是成對出現的)
輸入1',發現報錯,說明存在SQL注入

然后判斷一下注入的型別:(通常SQL注入分為兩種型別)
- 數字型:引數
- 字符型:'引數'
輸入1 and 1=1 和1 and 1=2 ,發現執行結果一樣,很明顯這個and(and之前的陳述句執行成功才會繼續執行后面的陳述句,or代表前面的執行不成功再去執行后面的,個人感覺判斷的時候or沒有and靠譜)不執行,說明這個為非數字型的,輸入'1' and '1'='1'驗證一下這個是否為字符型的,發現報錯,即這個是字符型別,


也可以直接拿1' or '1'='1查看是否回傳資料,輸入后發現回傳資料,確定這個為字符型
(這個為萬能陳述句,原理:因為這個為字符型,所以默認格式為:'變數' ,萬能是因為這個里面的1被當作變數,意思是變數' or '變數'='變數,即查出所有符合這個條件的結果)

2.猜解SQL查詢陳述句中的欄位數和欄位順序
選擇order by 是因為order by 從 1 開始計數,0 列不存在,大于查詢結果列數會報錯,且order by默認降序
使用1' order by 1#查詢此SQL中的欄位數,order by 遞增到3發現報錯,說明此欄位為2.(#代表注釋掉后面的內容,原理同上面說到的萬能陳述句一樣,就是讓資料庫執行的命令從'1' order by 1'變為'1' order by 1)


3.確定回顯點
由第二步可以確定此資料庫有兩個欄位,于是判斷一下這個資料庫的回顯點是哪個欄位,輸入1' union select 1,2#,查看回顯點,
然后發現這倆欄位都是回顯點,

4.獲取當前資料庫
然后查一下這個當前的資料庫名字順便查一下版本(因為是兩個欄位,只查一個不顯示)
1' union select database(),version()#
(版本和資料庫名可以換位置,只需要滿足是兩個欄位即可)
(拓展:也可以查當前作業系統( @@version_compile_os )和當前用戶名( user() ),別忘了最后加#號)

5.獲取資料庫中的表
第四步中查出來了當前資料庫名,接著我們查這個資料庫中的表,使用下面這個語法,查出來guestbook和users這兩個表
1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
語法原理:MySQL自帶information_schema表 ,這個表保存了 Mysql 服務器所有資料庫的資訊,如資料庫名,資料庫的表,表欄的資料型別與訪問權限等,該資料庫擁有一個名為 tables 的資料表,該表包含兩個欄位 table_name 和 table_schema,分別記錄 DBMS (資料庫管理系統)中的存盤的表名和表名所在的資料庫,這個查詢陳述句的意思是從資料庫dvwa的information_schema.tables表中查出table_name和table_schema這兩個欄位的內容,剛好之前第二步查出只有兩個欄位,查出來顯示兩張表,

也可以用下面這個陳述句直接查出資料庫的所有表:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

6.獲取表中欄位名
盲猜一波用戶名等資訊存于user表中,然后查user表中的欄位,查詢語法如下:
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
語法原理:group_concat()是一個函式型別,作用是回傳一個字串結果,該結果由分組中的元素連接組合而成,concat()是一個函式型別的陳述句,作用是將多個字串連接成一個字串,其他參考第五步中的語法原理,這個查詢陳述句的意思是從 information_schema.columns表中查出表名為users的欄位值并組合拼接在一起,

7.獲取欄位中的資料(此時已可以成功獲取資料庫內容)
根據第六步中獲取的欄位名查詢user和password
1' union select user,password from users#
語法原理:union表示聯合查詢顯示

出現以上結果,代表成功獲取,
再次強調,此文章僅供學習參考,請勿用作違法行為!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350820.html
標籤:其他
