首先要問:sql注入是什么?
sql注入就是利用錯誤的sql語句(錯誤的sql語句,就是跟網(wǎng)站開放人員設(shè)定的代碼不一樣)進行獲取數(shù)據(jù)庫里面的內(nèi)容(我們一般都學(xué)過了mysql,mysql里要建庫、建表、建字段、建值,這是mysql的四大板塊 庫、表、列、值),
像我們經(jīng)常進入的網(wǎng)站、用戶賬號、密碼、頭像,還有管理員的賬號、密碼什么的都保存在數(shù)據(jù)庫里,(通過設(shè)置數(shù)據(jù)庫與網(wǎng)站的設(shè)置,使得網(wǎng)站有建立自己的數(shù)據(jù)庫,)
如何判別是否可以進行sql注入
(這里我借用一下掌控安全的封神臺靶場,
鏈接:[封神臺 - 掌控安全在線演練靶場,是一個在線黑客攻防演練平臺。 (zkaq.cn)](https://hack.zkaq.cn/battle/target?id=c0c45746e7d351bc )
我們一開始進入一個網(wǎng)站頁面,是正常頁面,然后我們在id=1后面輸入了一個'(單引號)發(fā)現(xiàn)頁面不一樣了,這時候我們就可以判斷這里存在sql注入

將id改為2,這時我們就可以得到id=2的用戶的信息

and 進行判斷
?id=1 and 1=1 (mysql也是有and語句的 就是前面和后面都正確則輸出,id=1正確,1=1也正確)
?id=1 and 1=2(?id=1正確,1=2錯誤 不正確)
1=1 和1=2 兩個頁面不一樣則可以判斷存在sql注入(圖片上的%20是網(wǎng)頁自動將空格轉(zhuǎn)換為%20了,無影響)


單引號進行判斷
同樣也是沒有單引號的頁面 和添加了單引號的頁面不一樣,則說明存在sql注入
以下圖片是添加了單引號后的界面,這說明他將'(單引號)也在sql語句中執(zhí)行了

至此,我們已經(jīng)知道了該網(wǎng)頁存在sql注入漏洞,那么我們就可以進行第二步了
找到該表中是有幾列
order by (order by 本身是一個排序函數(shù),但我們可以通關(guān)order by 來猜出該表中有多少列
如:select * from users order by 5
我們在使用sql語句的時候,必須要與該表中所設(shè)定的列數(shù)相等,不相等的話,sql語句則不能執(zhí)行

已知 該 users表中 列為5列 分別為 Id、username、mobile、password、crate_time,我們可以使用union select (聯(lián)合查詢)來繼續(xù)輸出后面的

這次我們輸出一下數(shù)據(jù)庫名

但是如果我們union select 1,2,3,4的話,與原本的列數(shù)不照應(yīng),那么就不能運行sql語句,所以我們才需要先使用order by 語句來進行判別該表有幾列

在回到我們這個靶場,使用order by 3頁面是正常的,說明至少有3列,然后order by 4發(fā)現(xiàn)頁面不正常了,說明沒有第4列,這樣我們就知道了該表有3列


我們已經(jīng)知道該表有3列,那么我們就可以進入第三步,使用union select 1,2,3來找到顯示位
那么有人疑惑了,什么叫做顯示位?
顯示位就是 該表中有3列,但是,在該網(wǎng)頁他只輸出了幾列,并沒有把每一列的數(shù)據(jù)都輸出在頁面上,我們將輸出到頁面上對應(yīng)的列的內(nèi)容叫做顯示位

?id=1 and 1=2 union select 1,2.3
為什么不是直接 ?id=1 union select 1,2,3呢,為什么要 and 1=2?
因為一個網(wǎng)頁在這個輸出的位置,他只有一個,他只會輸出test和mima(id=1的用戶名和密碼)我們想要他輸出的2,3被覆蓋掉了(可以查詢到,但是該頁面只能輸出一個,所以2,3可以被查到,但是不能被輸出),and 1=2 利用了and 語句 1=2 是錯誤的,所以 id=1 and 1=2 不會被執(zhí)行,這樣就只會執(zhí)行 union select 1,2,3.這樣就可以知道顯示位是在哪里
COLLATION_CHARACTER_SET_APPLICABILITY
知道了顯示位,那么我們就可以進入第四步。進行爆庫、爆表、爆列名、爆數(shù)據(jù)
我們已經(jīng)知道第2列和第3列是顯示位,那么我們就可以使用這兩者任意一列,這里我選擇了第3列,也就是密碼處
爆庫(得出:error)
?id=1 and 1=2 union select 1,2,database()

爆表(error_flag,user)
?id=1 and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
?id=1 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database()

現(xiàn)在大多mysql(版本在5.幾的一般都包含information_shema)若沒有這個information_schema就會難搞,現(xiàn)在的基本上都有
information_schema包含了所有的數(shù)據(jù)庫
information_schema.tables包含了所有的數(shù)據(jù)表
information_schema.columns包含了所有的字段名
所有我們就可以使用from infromation什么的進行,在這個大范圍里面進行查找使用
group_concat()
沒有使用group_concat(),只獲取了一個值,而使用了group_concat()可以獲取所有的值
(原理:一個空只能輸出一個,而group_concat()將不同的值用,’逗號‘隔開,組成了一個新的值,這個值包含了所有,所有滿足一個空輸出所有的值)

爆字段名(Id,flag)
很明顯,erroe_flag,這明眼人基本就知道了flag在這個里面,那么我們就開始爆字段名(爆列名),若不明顯的話,就需要我們一個一個實驗
id=1 and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='error_flag'

爆值(zKaQ-Nf,zKaQ-BJY,zKaQ-XiaoFang,zKaq-98K)
id=1 and 1=2 union select 1,2,group_concat(flag) from error_flag

就這樣flag的值就出來了
這么多值,我們就需要一個一個去提交試試
如flag{zKaQ-Nf}
總結(jié):
第一步,找注入點,判斷是否存在sql注入
第二步,判斷該網(wǎng)頁中的表是由幾列
第三步,找顯示位
第四步,進行爆庫、爆表、爆列名、爆值
最后在提示一點,上面的代碼,爆庫爆表什么的代碼,都是套路,學(xué)會復(fù)制粘貼,修改關(guān)鍵值就可以使用
若 列不同,就就在增添一個
若表名不同 就修改表名就行
就可以運行sql語句
就可以先收集這,等使用的時候就可以直接粘貼修改