首先得在虛擬機中搭建sqli-labs的環境
搭建完成后創建數據庫
接下來開始闖關
不管是第幾關,我們的最終目的是獲取用戶和密碼,從而獲取最高權限!
如果你的sqli-labs搭建在了本虛擬機,直接將ip的地方改成127.0.0.1或者localhost就行,當然也可以直接換成對應虛擬機的ip地址
第一關(單引號型注入,格式:id=1')
首先我們確定他是什么類型的注入方式,輸入1=2 --+ 頁面回顯正常,說明不是字符型注入
輸入帶引號的1‘,出現問題,說明可能存在字符型的注入
我們在后面加上--+進行一下閉合,(--+就是注釋符號,注釋了后面的語句),,回顯正常,說明是單引號字符型注入
接下來用order by 來判斷表有幾列數據,發現他有3列數據(為4時出錯,為3時正常)
我們將id改成一個不存在的數字,如“417”。判斷頁面有幾個顯示位,使用聯合查詢語句union select 發現只有兩個顯示位
接下來我們爆破數據庫的數據庫名,表名,列名,字段信息
首先我們獲得有多少個數據庫
查詢我們的數據庫的版本和名字,看來是security
我們接下來查詢security數據庫的表名,發現有四個表 分別是emails,referers,uagents,users 很明顯我們最后的目標是users表
接下來我們看看user表中都有哪些列,發現有user和password列(因為版本不一樣,可能列名不一樣,但是一定會有用戶名和密碼兩列)
我們來獲得用戶名和密碼的字段
0x3a: 0x是十六進制標志,3a是十進制的58,是ascii
中的 ':' ,用以分割username和pasword的,
該賬號密碼使用,,隔開 ,,之中是一組
第一關結束,
第二關(數字型注入,格式:id=1)
發現第二關和第一關的區別在於他不是字符型注入了,是數字型注入了(數字注入的話就沒有1后面的‘號了)
接下來就是獲取表有個顯示位,發現是3個,之后就是獲取數據庫名,表名,列名,字段名,和第一關一模一樣
對於第一關和第二關的另外一種解法,
獲取當前數據庫的表名
獲取user表的列名
沒顯示全,我們再使用看看其他的列名
獲得user和password的字段值
同樣使用not in顯示其他的值
第三關(基於錯誤的GET單引號變形字符型注入,格式:id=1') )
這一關使用‘)進行閉合 這關是基於錯誤的GET單引號變形字符型注入
第四關(基於錯誤的GET雙引號變形字符型注入,格式:id=1") )
這關是基於錯誤的GET雙引號變形字符型注入
1-4關其實除啦需要閉合的sql語句不同,其他都一樣,總結:
基本步驟:
1. http://127.0.0.1/sqli-labs-master/Less-4/?id=1"查看是否有注入,注意:其中綠色部分是ip和搭建sqli-labs當時命名的文件夾,,Less-4可以換為相應的(1,2,3,4)
2. http://127.0.0.1/sqli-labs-master//Less-4/?id=1”) order by 3--+查看有多少列
3. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(schema_name) from information_schema.schemata --+查看所有數據庫
4. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+查看所有的表
5. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+查看所有的列信息
6. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users --+直接可以得到所有的賬號和密碼,並且使用~符號進行分割。
第五關
看這關是不是和之前關卡不太一樣了,沒有顯示位了,遇到這個情況有三種結果:布爾盲注,報錯型注入,時間延遲注入(就是通過給你顯示延遲表示你輸入的對不對的一種形式)
測試一下發現是時間延遲注入,並且還是單引號字符型注入
時間延遲注入算是一種盲注,因為它沒有回顯的信息
時間延遲型手工注入,正確會延遲,錯誤沒有延遲。id無所謂,不看回顯,可以通過瀏覽器的刷新提示觀察延遲情況,但是id正確的時候的回顯有利於觀察。
我們來看一下數據庫的名字是幾個字符,如果是8個字符,則延遲2秒,發現延遲,則證明是8個字符 ?id=1' and if(報錯型核心部分,sleep(3),1)--+
我們看看第一個字符是什么,因為是盲注,所以需要一個一個試,很麻煩,我們知道咱的數據庫的名字,所以從s開始試, 一個一個試最終爆破得到left(database(),8)='security'
得到數據庫名字之后我們來獲取表名,爆破到第二張表為referer,下圖是爆的第一個字母,因為有點類似盲注,所以特別慢。
終於在第三張表爆破到user表,名為users。limit 后面跟的兩個數字是從幾到幾,1,1就是第二張表的意思
2,1就是第三張表的意思 最后面那個1是對應的left ,從左數共幾位(為1時),后面我們就放一個字母
爆完表名,爆列名
首先嘗試定向爆破,以提高手工注入速度,修改limit x,1 中的x查詢password是否存在表中,lucky的是limit 3,1的時候查到了password列,同樣的方法查詢username ,又一個lucky,接下來爆破字段的值。
爆完列名,爆字段名 爆破到第一個用戶的名字dumb,密碼dumb,需要注意的是,mysql對大小寫不敏感,所以你不知道是Dumb 還是dumb。
我們用其他軟件查看下爆的數據庫,確認下。我這里用的Navicat
這種時間延遲盲注很繁瑣,,得反復嘗試,,還有別的注入方法,
布爾型手工注入,正確會回顯,錯誤不回顯
數據庫第一個字符小於r無回顯
數據庫第一個字符小於t有回顯,,一點一點嘗試,最終獲得庫名為security
接下來確定表名,第一個字母得出是r,其他的步驟還是一樣,修改limit x,1和left中的位數限定數字,第一張表是emails,爆破到第二張表為referer,終於在第四張表爆破到user表,名為users。
接下來爆列,得出第二列是用戶名,第三列是密碼(雖然我只截圖了兩張,但是里面的每個字母都是通過二分法,大於小於,這樣的方式測試出來的)
最后一步爆用戶名和密碼(只截圖了第一個用戶名和密碼,並且大小寫不知道)
還有第三種方法,報錯注入,
簡單說就是通過反饋的錯誤信息,在反饋信息中顯示出你想知道的信息
首先介紹三種報錯注入常用的語句:
(1). 通過floor報錯
select count(*), concat((select version()), floor(rand()*2))as a from information_schema.tables group by a;
其中payload為你要插入的SQL語句
需要注意的是該語句將 輸出字符長度限制為64個字符
(2). 通過updatexml報錯
and updatexml(1,payload,1)
同樣該語句對輸出的字符長度也做了限制,其最長輸出32位
並且該語句對payload的反悔類型也做了限制,只有在payload返回的不是xml格式才會生效
(3). 通過ExtractValue報錯
and extractvalue(1, payload)
輸出字符有長度限制,最長32位。
payload即我們要輸入的sql查詢語句,這里面的concat是聚合函數,使用聚合函數進行雙注入查詢時,會在錯誤信息中顯示一部分錯誤信息。
下面我們使用floot報錯進行演示,爆數據庫
爆用戶
爆表名
爆列名
爆用戶和密碼
這里爆的是第二個的 密碼和用戶,,
第六關
和第五關一樣,不再贅述,只是將1' ----->(換成了)1"
還是用報錯注入簡單,不像時間延遲注入和布爾型手工注入那樣一個一個試
第七關(注入格式:id=1')) )
首先判斷是字符型還是數字型,發現是字符型,並且出現了一個我們從來沒見過的東西use outfile
可能會有很多小白和我一樣,對數據庫file權限和 into outfile這個命令比較陌生,所以在這里科普一下file權限和into outfile這個函數。
數據庫的file權限規定了數據庫用戶是否有權限向操作系統內寫入和讀取已存在的權限
into outfile命令是filefile系列函數來進行讀取敏感文件或者寫入webshell
字符型的話就要在1后面加'或"號,所以我們來試試
需要多次嘗試1‘ 1“ 1’) 1”) 1‘)) 最后我們發現是1‘))
這關我們主要就是往服務器上寫入文件,比如一句話木馬啥的,我們首先要有一個存儲文件的路徑,也可以手動去查看
找到路徑之后,我們往這個路徑下寫入一個文件名為escwq的php文件,主要這里的路徑要用雙反斜杠\\,否則建立出來的文件名會加前綴
圖中標記1是雙反斜杠,,標記2是單反斜杠,,路徑名加到了文件名前
雖然他回顯告訴我們錯誤,但是確實建成功了,並且在這里有一個安全措施,就是不允許覆蓋,你建立了longshisan的php文件,就不能重復建立了
下圖是建立的escwq.php中的內容
如果寫到WWW文件下就可以直接用localhost前綴啦
我們這次在WWW文件夾下
新建一個yahu.php並一句話木馬( [" "]中的字符,是自己設置的密碼,,等用中國菜刀連接的時候會用到 ),到時候我們就可以通過這個文件進入數據庫
這時就可以用中國菜刀獲得這個文件夾的結構啦,
圖中標記部分,,地址是當時.php文件的位置,,
小方塊中是在加入一句話木馬時設置的密碼,,划橫線部分,菜刀會幫你自動選擇的不用管
之后右擊,選擇文件管理
找到index.php文件,尋找其中sql連接語句,順藤摸瓜,找到數據庫管理員信息
找到了管理員信息(其中,,用戶、密碼和主機之后,填寫數據庫管理的配置時 ,要用,)
再次右擊剛才的地址,,點擊數據庫管理,點擊配置,根據上圖輸入以下信息:
提交,就可以管理數據庫啦,單擊和雙擊只能選擇那一項,需要點擊執行,才能顯示
第八關(注入格式id=1' )
發現是字符型注入,並且通過回顯的信息可以看出是布爾盲注
首先看看有沒有file權限,發現有,說明和第七關相同,,只是注入的閉合符合不同
也可以用像第五關的時間注入和二分法猜測
第九關
上來先判斷是字符型注入,並且是延遲型注入(如何判斷是不是延遲型,當你用二分法時不管左邊還是右邊都是對的,說明二分法就做不了了)
時間注入在第五關已有詳細的描述,在這里不再過多的贅述
數據庫名長度為8
獲得數據庫名,剩下的按照第五關的操作走就行
獲得用戶
密碼
第十關(注入格式:id=1")
和第九關相同,,只是把單引號 ' 還成雙引號 "
獲得用戶密碼