sql-lib闖關1-10關


闖關之前我們需要搭建所需環境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

 

注入的分類
     注入的分類:數字型和字符型。攻擊者目的只有一點,那就是繞過程序的限制,使用戶輸入的數據帶入數據庫執行,利用數據庫的特殊性獲取更多的信息或者更大的權限。
1、數字型注入
當輸入的參數為整形時,如果存在注入漏洞,可以認為是數字型注入。
測試步驟:
(1) 加單引號,URL:www.text.com/text.php?id=3’
對應的sql:select * from table where id=3’ 這時sql語句出錯,程序無法正常從數據庫中查詢出數據,就會拋出異常;
(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1
對應的sql:select * from table where id=3’ and 1=1 語句執行正常,與原始頁面如任何差異;
(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2
對應的sql:select * from table where id=3 and 1=2 語句可以正常執行,但是無法查詢出結果,所以返回數據與原始網頁存在差異
如果滿足以上三點,則可以判斷該URL存在數字型注入。
 
2、字符型注入
當輸入的參數為字符串時,稱為字符型。字符型和數字型最大的一個區別在於,數字型不需要單引號來閉合,而字符串一般需要通過單引號來閉合的。
例如數字型語句:select * from table where id =3
則字符型如下:select * from table where name=’admin’
因此,在構造payload時通過閉合單引號可以成功執行語句:
測試步驟:
(1) 加單引號:select * from table where name=’admin’’
由於加單引號后變成三個單引號,則無法執行,程序會報錯;
(2) 加 ’and 1=1 此時sql 語句為:select * from table where name=’admin’ and 1=1’ ,也無法進行注入,還需要通過注釋符號將其繞過;
Mysql 有三種常用注釋符:
-- 注意,這種注釋符后邊有一個空格
# 通過#進行注釋
/* */ 注釋掉符號內的內容
因此,構造語句為:select * from table where name =’admin’ and 1=1—’ 可成功執行返回結果正確;
(3) 加and 1=2— 此時sql語句為:select * from table where name=’admin’ and 1=2 –’則會報錯
如果滿足以上三點,可以判斷該url為字符型注入。
 
Sql注入分類可以按照參數類型分為數字型和字符型。還有一些常見的注入分類,例如:
(1)POST:注入字段位於POST數據中;
(2)Cookie:注入字段位於Cookie數據中;
(3)延時注入:根據數據庫延時特性的注入
(4)搜索注入:注入字段在搜索的位置;
(5)base64注入:注入字符經過base64編碼后注入;
(7)錯誤注入:基於數據庫錯誤信息的響應注入;
等等…

那么開始闖關吧。

 

第一關

首先我們輸入?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

 

 

庫名長度可使用?id=1' and length(database())=8--+ 判斷,同理表名字,段名等。
最后得到庫名?id=1' and left((select database()),8)='security'--+
爆表,爆字段,爆值,流水操作

 你也可以用向第五關的方法時間注入啊,二分法猜測啊在這都可以用

 

 第九關

上來先判斷是字符型注入,並且是延遲型注入(咋判斷是不是延遲型,當你用二分法時不管左邊還是右邊都是對的,說明二分法就做不了了)

 

 

 

 

 

 時間注入在第五關做了詳細的描述,在這里不再過多的贅述

數據庫名長度為8

 

 

 

 

 獲得數據庫名,剩下的按照第五關的操作走就行

 

 

 

 

 獲得密碼

 

 

 

 

 

 

 

 

 

第十關

第十關就是把第九關的單引號‘換成雙引號“就可以啦

 

 

 

 

 獲得用戶名密碼

 

 

 

 

 

 

 1--10關就闖關完成了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM