基於dvwa環境下級別為low的SQL手工注入教程


基於dvwa環境下級別為low的SQL手工注入教程
首先是進入已搭建好的dvwa環境中去(一定要搭建好dvwa環境才能進行下面的操作),這可能會是一些初學者所面臨的的第一個問題,比如我,曾為了尋找這個入口,浪費了不少的時間,所以在這里就提一下,最好是能夠記住,忘了的話可以隨時過來看一下: http://127.0.0.1/DVWA/setup.php
按照提示點擊最下面的按鈕創建數據庫,創建成功就會直接進入登錄頁面進行登錄,然后就可以直接訪問http://127.0.0.1/DVWA/login.php得到如下登錄頁面:
初始狀態下username和password分別為admin和password
接下來我們login,成功登錄
可以看到我們已經成功登錄,其中紅色箭頭所指就是我們SQL注入的地方了,而下面藍色箭頭指向的DVWA Security是設置難度等級的地方,初始狀態下,難度一般為impossible,對我們初學者而言,並不適合,我們需要設置為low,再打開紅色箭頭所指的地方,SQL Injection,得到如下圖所示的界面:
這便是一個表單,是用戶交互式的地方,也是常見SQL注入漏洞存在的地方。
第1步:我們測試是否存在注入點,先輸入“1”(雙引號括起來的內容即為要輸入的,下同),返回結果:
接下來,輸入特殊字符“1'”(1和英文單引號),得到如下結果:
”You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1“翻譯為中文便是”SQL語法有錯誤;檢查與MySQL服務器版本相對應的手冊,以獲得在第1行“1”附近使用的正確語法“看到這個結果,我們幾乎可以確定這個表單存在SQL注入漏洞。
 
第2步:測試信息的列數 使用 order by+數字的形式。例如我們可以輸入"1' order by * -- "(*代表具體的數字),要注意的是--后面有空格)隨着*數字從1逐漸變大,當*為3時,終於瀏覽器不再返回正常值,得到了“Unknown column '3' in 'order clause'”表明這里有兩個表。這是為什么呢?order by
在SQL語句中是排序的意思,如果這里只有兩個表(那么我們使用聯合查詢union select時一次可以查詢兩個數據),輸入排序三個的指令肯定會犯錯,便是這個原因。
 
接下來我們用聯合查詢,union select,嘗試輸入“1' and 1=1 union select 1,2 --  ”得到如下結果:
從而,我們可以得出First name處顯示結果為查詢結果第一列的值,surname處顯示結果為查詢結果第二列的值。(簡單點說,就是First name一行顯示第一個命令的值,Surname一行顯示第二個命令的值,便是一次聯合查詢可以得到的兩個數據)
 
接下來呢?好像離我們的目標還很遙遠(突然想插一句,我們的目標是什么?當然是拿到所有的用戶名和密碼呀)
 
第3步:獲取當前數據庫和當前用戶名。介紹幾個內置函數user()、database()、version(),@@version_compile_os,user()將會返回進行當前查詢的用戶名,database()將會返回當前網站所使用的數據庫名字,version() 獲取當前數據庫版本,@@version_compile_os獲取當前操作系統.。通過輸入“1' union select database(),user() -- ”我們得到如下頁面,可以看到,綠色箭頭一前一后分別代表當前數據庫名字和當前進行查詢的用戶名。藍色箭頭便是兩條命令得到的數據。即當前數據庫為dvwa,當前用戶名為“root@localhost”。可以用上文提到的類似的指令獲取當前數據庫版本和當前的操作系統信息。
通過以上查詢我們知道當前數據庫名為dvwa,然而好像……並沒有什么卵用……不要慌,問題不大,我們繼續。
 
第4步:測試連接數據庫權限。可以輸入“1' and ord(mid(user(),1,1))=114 -- ”
如圖所示,返回正常,表明為root(即最高權限,你可以得到你想要的)。
 
第5步:獲取當前用戶的表(看不懂沒關系,問題不大,往下看就好了)事實上,我們目前的有效信息只有當前的數據庫為dvwa,其實MySQL中存在一個百科全書似的數據庫叫 information_schema我么可以利用它查到dvwa數據庫目錄下的表,那么構造查詢語句“1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa' -- ”(這里用到了SQL查詢的語法以后我會陸續介紹,“SELECT 字段名 FROM 數據表名稱 WHERE 搜索子句”)其中在information_schema(就是那個幾乎包含所有的那個庫)里,有一個表為tables,table_name是表名,table_schema表示的是某個表所在的數據庫,所以看懂了吧,聯合搜索union select后面的table name便是我們的目的——獲取表的名稱,from后面便是information_schema這個“庫”,where相當於添加了一個條件,就是說在dvwa這個表所在的數據庫中…………有沒有很亂?我也覺得很亂,筆者也沒有接觸過什么理論,所以邏輯有點混亂,但大可不必擔心,筆者也是看着前輩們的教程,在實踐中積累經驗,我相信你看了演示,也一定能明白。
好了,可以看到,我們弄出來了兩個表,guestbook和users,不假思索,肯定要搞users了!於是輸入命令“1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users' -- ”(注意看命令,感受它的格式,體會它的含義,這點很重要!)
 
看!password!終於等到你,還好我沒放棄,接下來問題變得簡單,“1' union select user,password from users -- ”可以試着理解它的意思,搜索用戶(user)、密碼(password)在users這個表中。
便得到了我們想要的,但是乍一看,這………………這怪模怪樣的東西是密碼?
對,這就是加密過的MD5密碼,想要破解也很容易,直接百度搜索md5密碼在線破解就OK了,筆者用的是這個站點 https://www.cmd5.com/
怎么來驗證一下呢?
來到這里,“暴力破解”的地方,拿着我們注入得到的用戶名和密碼感受一下成功的喜悅吧。
 
PS:需要說明的是,本文只是很淺的一部分,事實上,SQL手工注入的其他命令還很多(會有后續文章漸漸補充),也可以用工具注入(以后筆者也會慢慢更新)筆者也是初學者,花費了很長時間才體會到一點點,走了很多很多彎路,在工具注入成功的一剎那,也曾激動地落淚,因為每個人所付出的,只有自己明白吧。寫給那些像我一樣迷茫的人,再堅持一下,絕對會成功的。歡迎大牛批評斧正,筆者水平有限,還有不懂得小伙伴可以發私信給我。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM