第1關:單引號閉合
1.這是第1關的界面,讓我們以id作為參數輸入,方式為數值,這里輸入?id=1看一下。
2.顯示了id=1的用戶名和密碼。
分析:
在sql注入漏洞中,第一步是要尋找注入點,即可以輸入參數的地方,這里URL欄就是。
第二步通過輸入特殊字符串來判斷服務器的響應結果是否存在異常,如果回顯異常,則存在sql注入的可能。
第三步構造語法或者利用工具進行攻擊。
3.輸入?id=1'后,頁面回顯報錯。再輸入注釋符,頁面恢復正常。
分析:
注釋符為什么是--+而不是--,因為標準注釋符是--后面跟一個空格,在URL傳輸中會將空格編碼成+號。
這里輸入單引號報錯,注釋后正常,說明閉合方式是單引號。
4.知道閉合方式后,利用order by 判斷字段數。order by是數據庫查詢中的排序語句,它的作用是確定返回的字段數(列數),是聯合查詢注入的前提。
這里輸入 order by 3 回顯正常,order by 4 回顯錯誤,說明存在3個字段。
5.利用union聯合查詢判斷回顯位。這里id=-1的作用是讓原始查詢結果返回一個空集,確保聯合查詢的結果能夠顯示到頁面上。這里我們得出結論,第1列的數據顯示不了,第2,3列會顯示出來。
6.構造語法進一步查詢。這里我們查詢出了當前的數據庫名稱。
7. 繼續查詢,步驟為查詢數據庫,查詢表,查詢字段,查詢字段數據。
?information_schema 是mysql中內置的重要數據庫,它儲存了其他所有數據庫的元數據信息。
group_concat()函數的作用是將查詢的值合并為一個字符串,用來更完整提取信息。
-- 查詢所有數據庫
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA;
-- 查詢當前數據庫所有表SELECT TABLE_NAMEFROM information_schema.TABLESWHERE TABLE_SCHEMA = DATABASE();
查詢當前數據庫所有表:
group_concat(table_name) from information_schema.tables where table_schema=database();
?這里查詢到幾張表,猜測重要的表可能是users,這可能是一張用戶表,里面儲存了用戶的相關信息。
查詢當前表的字段:
group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users';
得到了用戶名表中的三個字段,即用戶ID,用戶名,密碼。
查詢字段數據:
group_concat(username,password) from users;
到這里就完成了。
第2關是數字型注入,第3關是')閉合,第4關是")閉合。
判斷閉合方式:第一步輸入字符串xx報錯,第二步輸入xx--+正常回顯,驗證為xx閉合。
總結:
1.尋找注入點;
2.利用特殊字符串判斷閉合方式;
3.利用order by判斷字段數;
4.利用union聯合注入判斷回顯位;
5.構造語法依此查詢數據庫,表,字段,數據。