闖關之前我們需要搭建所需環境SQL-Libs
SQL-Libs是一個專業的SQL注入練習平台,該平台包含了以下在測試場景中常見的注入類型:
1.報錯注入(聯合查詢)
1)字符型
2)數字型
2.報錯注入(基於二次注入)
3.盲注
1)基於布爾值
2)基於時間
4.UPDATE型注入練習
5.INSERT型注入練習
6.HTTP頭部注入
1)基於Referer
2)基於UserAgent
3)基於Cookie
7.二次排序注入練習
對於學習SQL注入來說是一個優秀的平台。
環境搭建
1.准備工作:我們在虛擬機中安裝phpstudy集成環境即可
2. 安裝過程
2.1 下載並解壓
從網上下載sqli-libs,解壓到phpstudy的www文件夾目錄下
2.2 修改配置文件
進入網站目錄,在sql-connections
文件夾下找到db-creds.inc
文件,修改文件內容,將用戶名和密碼改成本地MySQL數據庫的用戶名和密碼
(初始用戶名和密碼都為root)
2.3 安裝
打開瀏覽器,輸入http://192.168.31.246/Sqli_Edited_Version-master
進入SQL-Libs測試平台
(我的ip為192.168.31.246,www文件夾下文件名為Sqli_Edited_Version-master
)
點擊Setup/reset Database for labs
進行安裝,出現以下界面則表示安裝成功
闖關之前,請把這兩行代碼添加到每一關php文件中,
第一行是對sql語句進行輸出,第二行是換行(這兩行代碼只是讓我們更好的理解每關)
闖關之前寫幾句mysql基本用法,我們闖關常用的,盡量自己打直到熟悉
查庫: select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema='security'
查列:select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users
好,那么開始闖關吧。
第一關
首先我們輸入?id=1
如圖,根據sql語句我們知道users表中id=1的一組用戶名密碼,(LIMIT 0,1表示從第0行開始提取一個數據) 我們也可以將1變成其他數字,會提取出其他id用戶名密碼
接下來我們輸入的1‘,出現問題,說明存在的注入(從sql語句可以看出‘1’后多了一個單引號)
我們在后面加上--+進行一下閉合,(--+就是注釋符號,注釋了后面的語句),回顯正常,輸入語句"?id=1 and 1=2"也回顯正常,說明是單引號字符型注入
接下來我們用order by 語句來判斷表有幾列數據,發現他有3列數據(為4時出錯,為3時正常)
知道是單引號字符型注入,有3個列數據后我們將id改成一個不存在的數字,如“666”。(如果數字存在會爆出相應id內容,所以我們讓它報錯,注釋掉它)判斷頁面有幾個顯示位,使用聯合查詢語句union select 發現只有兩個顯示位
接下來我們爆破數據庫的數據庫名,表名,列名,字段信息
首先我們獲得有多少個數據庫(我直接用的group_concat全部爆出,也可以用limit一個一個爆)
查詢我們的數據庫的版本和名字,看來是security
我們接下來查詢security數據庫的表名,發現有四個表 分別是emails,referers,uagents,users 很明顯我們最后的目標是users表
接下來我們看看user表中都有哪些列,發現有user和password列(因為版本不一樣,可能列名不一樣,但是一定會有用戶名和密碼兩列)
接下來我們要獲得用戶名和密碼的字段
我們發現一次只能取用戶名密碼中的一個不方便查看,所以我再告訴大家一個函數concat_ws('~',A,B)
如圖,相應用戶名和密碼都用~清晰列出
當然~轉換成十六進制是0x7e,推薦大家使用,不包含單引號
闖關結束
第二關
發現第二關和第一關的區別在於他不是字符型注入了,是數字型注入了(1=1正確,1=2錯誤 )
接下來就是獲取表有多少列,發現是3列,之后就是獲取數據庫名,表名,列名,字段名,和第一關一模一樣
第三關
首先繼續?id=1
我們通過sql語句發現1被(’‘)包裹,和第一關差不多,第一關1被’‘包裹,注釋掉單引號,所以這關注釋掉’)即可
我們也可以給他加一個單引號試試,
通過報錯語句發現除了)外1后還多一個單引號,所以添加‘)注釋即可
測一下多少列,3列
那么我們開始爆庫,爆表,爆列,爆字段
第四關
老規矩,先輸入?id=1看看情況
根據sql語句我們發現只是把第三關單引號變成了雙引號,(如果你沒有添加我開頭那兩行代碼,不顯示sql語句,那就先加單引號不報錯,再加雙引號報錯,根據報錯類型進行分析)
3列
爆庫爆表爆列爆字段,
第五關
首先,輸入?id=1嘗試
我們發現沒有任何數據爆出,顯示you are in, 那么我們再把id換成一個不存在的數據試試
我們發現you are in 消失了,這就是典型的布爾盲注,正確顯示you are in 正在進入,錯誤不顯示任何信息
我們再輸入1‘試試
報錯顯示一后面多了一個單引號,所以它存在注入漏洞,可以進行sql注入(只有加單引號報錯)
我們測試一下它有幾列,發現是3列
那我們現在開始爆東西吧,這關跟前幾關不一樣,你輸入查詢語句返回的都是you are in,
再給大家推薦一個函數left,我測試數據庫名第一個字母是否為s,通過返回“you are in"我們知道是正確的
當然, 不要直接一個字母一個字母試,可以先用二分法
數據庫第一個字符小於t有回顯
數據庫第一個字符大於t無回顯, 一點一點嘗試,最終確定的庫名為security
接下來確定表名,第一個字母得出是r,其他的步驟還是一樣,修改limit x,1和left中的位數限定數字,第一張表是emails,爆破到第二張表為referer,終於在第四張表爆破到user表,名為users。
接下來爆列,得出第二列是用戶名,第三列是密碼
最后一步爆用戶名和密碼(只截圖了第一個用戶名和密碼,並且大小寫不知道)
當然還可以concat聚合函數
參考資料:http://www.2cto.com/article/201303/192718.html
簡單的說,使用聚合函數進行雙注入查詢時,會在錯誤信息中顯示一部分錯誤信息。
比如count函數后面如果使用分組語句就會把查詢的一部分以錯誤的形式顯示出來。
payload即我們要輸入的sql查詢語句,下面展示payload在concat()中構造
爆庫payload
爆用戶
爆表名
爆列名
爆用戶名密碼
這關還可以用burpsuite進行暴力破解,可以直接破譯出相關字母數據
第六關
和第五關一樣差不多,只是報錯由單引號變成了雙引號
按照第五關思路來就行,我直接給用戶名密碼了
第七關
首先判斷是字符型還是數字型,發現是字符型,並且出現了一個我們從來沒見過的東西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連接語句,順藤摸瓜,找到數據庫管理員信息
找到了管理員信息(其中,,用戶、密碼和主機之后,填寫數據庫管理的配置時 ,要用,)
再次右擊剛才的地址,,點擊數據庫管理,點擊配置,根據上圖輸入以下信息:
提交,就可以管理數據庫啦,單擊和雙擊只能選擇那一項,需要點擊執行,才能顯示
第八關
發現是字符型注入,並且通過回顯的信息可以看出是布爾盲注
那就一步一步來吧,和less5一樣的,根據回顯判斷,可以通過 > < 比較字符大小加速爆破
暴庫payload
你也可以用向第五關的方法時間注入啊,二分法猜測啊在這都可以用
第九關
上來先判斷是字符型注入,並且是延遲型注入(咋判斷是不是延遲型,當你用二分法時不管左邊還是右邊都是對的,說明二分法就做不了了)
時間注入在第五關做了詳細的描述,在這里不再過多的贅述
數據庫名長度為8
獲得數據庫名,剩下的按照第五關的操作走就行
獲得密碼
第十關
第十關就是把第九關的單引號‘換成雙引號“就可以啦
獲得用戶名密碼
1--10關就闖關完成了。