sqli-labs-第一關(讓你過,還讓你知道為什么這么做,寶貝)
總里來說就是就是五步操作讓你深刻理解SQL注入的簡單操作
一、找漏洞(暫時我就知道用 and 1=1/1=2判斷整形類型,加單引號判斷字符串和整形類型)
這題就是?id=1(數字隨便輸)輸入?id=1 and 1=1 以及輸入 ?id=1 and 1=2發現並有什么什么變化
這時試試加單引號判斷是不是字符型 id=1' 發現有變化了
這說明了啥,由一個正常界面通過單引號注入跳到了一個報錯界面,這是個單引號注入漏洞
好的,找到了,接下來
二、猜解字段數(我覺得字段數就是一個sql數據庫里的存在的變量個數,比如(id,name,age,qq號這一行過去的變量))
就是下圖這玩意
為什么要猜解這玩意呢,你要確定一下數據庫里存在多少個變量咯,你才可能你想要的東西,當然這不重要
重要的是這是為下一步鋪墊的,你只有知道了准確的字段數才可以用union來進行操作獲取你想要的東西
因為union select ...后面的字段必須與數據庫的字段相對應,就是假設你數據庫里有3個字段,但是你輸入union select 1,2(你可以去試試)
你會發現會報錯在這題中,必須對應三個數字 union select 1,2,3才能夠成功執行,所以這才需要order by 來知道字段數從而使用
union 來搞事情。
三、獲取數據庫名字
那接下來就是講如何用union操作來獲取數據庫名字,數據表名字,字段名以及字段名對應的數據信息
那么你就要知道怎么用union了吧
這里會先使id=-1',為什么呢,我覺得其實就是你前面已經找了SQL注入漏洞出現報錯,那么你先要讓其存在一個合理的報錯形式 讓后把后面的SQL語句也帶進SQL里進行執行操作,從而獲取信息
所以就是得讓union 前面的為正確的報錯行為,在id=1'添加符號,id默認為從0開始所以這是錯的吧 或者直接在后面加個and 1=2也是錯的吧,
and 1=1就不可以了,因為這是正確語句不會報錯對吧。這樣的話union語句就可以正確執行進去了
接下來用union select 1,2,3--+語句
為什么后面還要加個--+呢這是個注釋語句,就是把后面的給注釋掉,你會發現這里后面還有東西,但你用不上,把它注釋掉就好吧
然后回車就發現顯示了2,3,這意味着2,3字段是可以回顯到頁面的,可以進行操作,那我直接更改3這個位置代碼
進入下面的操作前,先介紹幾個函數:
(1)version():查看數據庫版本
(2)user():查看當前用戶
(3)database():查看使用的數據庫
(4) limit :limit
子句來分批獲取所有數據
(5)group_concat():
一次性獲取數據庫信息。
查看數據庫,版本,當前用戶
輸入union select 1,2,user()--+看了下用戶名
輸入union select 1,2,database(0--+看了下使用得數據庫(重點)
輸入union select 1,2,version()--+看了下數據庫版本
四、查表
知道了數據庫了名字了吧,為什么要它呢?
你要想得到用戶名和密碼首先得知道數據庫吧
知道了就好辦了,就可以查表了
輸入 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='sercurity'--+
當然這里可以直接用union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
因為我們這里只有一個數據庫(如果有其他數據庫的話就會顯示所有數據庫的表名,對吧,寶貝)
這里忘記解釋一個東西了,你會發現面這個圖我用第一條紅線標出的一串黃色代碼其實就包我從URL里輸入的代碼,這是我在自己本地里less-1的index_php加了一段echo "$sql<br>";
方便回顯到頁面來查看我輸入的代碼,可以看下面這張圖接着的第二張圖
好,接着搞
我對這句代碼理解認為 group_concat(table_name)這個就是合並到一起來顯示表名,from information_shchema.tables這是固定的,字面理解就是來自信息圖表數據庫的存在的表單,對吧,然后 where 限制語句 where table_schema='sercurity'只需要查找數據庫名為sercurity
找到了顯示出所有表單,發現了有users表單,這里就應該會有我們想要的用戶密碼
五、查字段名以及字段數值
接着輸入 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
當然這里也可以直接union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()--+
原理一樣,就這一個數據庫,表單也不多直接從數據庫搜就好了
然后就獲取了users表單里的字段名 發現了有username 和 password
嘿嘿,下面是不是就可以查出來這兩字段的每個值
輸入 union select 1,2,group_concat(username,0x3a,password) from users--+
就可以得到每個用戶名對應的密碼 (0x3a是字符冒號':'對應的16進制的ASCII碼)
ok,成功搞定
總結:
二步:
發現SQL注入漏洞
利用漏洞獲取相關信息
所了解的代碼:
發現SQL注入漏洞的代碼 (整形,字符型,bool類型以及# ,--+注釋等)
order by查找數字段代碼
union的使用獲取數據庫名,表名,字段名以及數據值的相關代碼
更有趣點的的就是sqlmap.py來搞了,這里就不詳細講了,等我自己去好好琢磨