Sql注入多种注入类型剖析(三)

数据类型以及请求方法

注入之前要弄清数据类型

  • 数字
  • 字符
  • 搜索
  • JSON

简要明确请求方法

  • GET
  • POST
  • COOKIE
  • REQUEST
  • HTTP头等

这里说的请求方法不是网络上说的请求方式,而是针对注入分为的这些请求方式。

其中SQL语句的干扰符号:’ , “,%,),}等 具体看当时环境的写法

数字型

为什么要说这个,先说这个数据类型,如果传参是一个数字型,比如http://example/?id=1  他php源码处理也当作数字型处理的话,他就会直接处理这个1,不会加’,“ ,这两个符号。也就是说构造sql注入时候直接http://example/?id=-1 union select 1,2,3 他就会直接执行这个语句,造成sql注入。

数字型

可以看到这种,直接把$id当作数字来处理 我们构造id=-1 union select 1,2,3 

那么传进来执行的语句就是:

“SELECT * FROM users WHERE id=-1 union select 1,2,3  LIMIT 0,1”;

这时就是两个语句命令了 一个id=-1的查询 一个查询字段1,2,3  可以正常执行。

数字型注入

那么如果php源码把你传进来的参数当作字符处理而不是数字怎么办?如果当成字符处理:

字符型

可以看到这里多了单引号,那么如果我们还按照上面的方法进行注入,会出现什么样的问题?

字符型

构造id=-1 union select 1,2,3 

“SELECT * FROM users WHERE id=’-1 union select 1,2,3 ‘ LIMIT 0,1”;

可以看到 我们构造的语句全被当成字符数据去处理了,让数据库去查询id=-1 union select 1,2,3 的内容,那肯定报错。

字符型报错

报错

那怎么办  我们要重新构造语句,目的是让 union select 1,2,3 脱离出来id那个参数,让他被当作命令去执行。

构造:id=-1′ union select 1,2,3 –+

代入到语句里看一下:

“SELECT * FROM users WHERE id=’-1′ union select 1,2,3 –+ ‘ LIMIT 0,1”;

这个–+ 就是把后面的 ‘ LIMIT 0,1 给注释掉,以免 那个单引号报错;

执行:

字符型注入成功

上面这两个例子就是说明 注入要明确注入类型! 因为渗透测试基本都是黑盒测试,我们不知道源码,所以要耐心去进行验证。如果是字符型我们要先把他的单引号给闭合掉。

搜索型

很多网站都有搜索功能,搜索时候,他的功能就跟我们在电脑上搜索文件一样的。

搜索

我们本地搜索采用正则表达式,可以搜索带有某种字符的所有文件,采用*  

正则

我们平时搜索采用正则表达式 *

而sql上的搜索是采用%来进行的。

id=Drton1

select * from user where name like ‘ %Drton1%’

遇到这种情况 我们就要闭合%符号 不能单单只闭合单引号。

写法都不是唯一的 他有可能加单引号,括号。

这个需要自己尝试或者采用工具。

不同请求方法的注入

这里先介绍这几种注入的方式,后面介绍知道这些有什么用。

GET类型注入

上个最简单的代码:

<?php

$get=$_GET['g'];//get接受参数名g的值赋给变量get
echo $get; //输出变量g的数据

?>

Get

前面讲的都是这种Get方式提交参数,参数就在url地址里,这个不阐述了。

POST类型注入

POST是把注入写到数据包里

页面代码:

$post=$_POST['p'];//post接受参数名p的值赋给变量post
echo $post; //输出变量post的数据

POST

这种就是Post提交,把数据写到数据包里,而不是url里

Request类型提交

request类型 就是全部接受,就是你用get 还是post 还是cookie 他都能接受到数据。

更改提交方式 主要是绕过防护软件,比如说人家防护Get提交了,你用Post提交说不定就饶过了呢

页面代码:

$r=$_REQUEST['r'];
echo $r;

R3

get和post等类型的提交都可以。

Cookie注入

页面代码:

$cookie=$_COOKIE['c'];
echo $cookie;

这个就是利用请求包里Cookie里面参数来构造恶意语句,从而达到绕过一些防护的效果。

这里用bp抓包,构造Cookie,然后写入参数,返回成功。

Cookie注入

Server类型提交 

代码:

$s=$_SERVER['HTTP_USER_AGENT'];
echo $s;

这个$_SERVER 就是来获得一些系统信息,比如你的ip 你的浏览器信息,这些不需要用户输入,而是发送请求包的时候带着的,然后被他获取了。

他里面那个参数有自己的含义:

$_SERVER详解:
$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]//浏览器语言
$_SERVER[‘REMOTE_ADDR’] //当前用户 IP 。
$_SERVER[‘REMOTE_HOST’] //当前用户主机名
$_SERVER[‘REQUEST_URI’] //URL
$_SERVER[‘REMOTE_PORT’] //端口。
$_SERVER[‘SERVER_NAME’] //服务器主机的名称。
$_SERVER[‘PHP_SELF’]//正在执行脚本的文件名
$_SERVER[‘argv’] //传递给该脚本的参数。
$_SERVER[‘argc’] //传递给程序的命令行参数的个数。
$_SERVER[‘GATEWAY_INTERFACE’]//CGI 规范的版本。
$_SERVER[‘SERVER_SOFTWARE’] //服务器标识的字串
$_SERVER[‘SERVER_PROTOCOL’] //请求页面时通信协议的名称和版本
$_SERVER[‘REQUEST_METHOD’]//访问页面时的请求方法
$_SERVER[‘QUERY_STRING’] //查询(query)的字符串。
$_SERVER[‘DOCUMENT_ROOT’] //当前运行脚本所在的文档根目录
$_SERVER[‘HTTP_ACCEPT’] //当前请求的 Accept: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_CHARSET’] //当前请求的 Accept-Charset: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_ENCODING’] //当前请求的 Accept-Encoding: 头部的内容
$_SERVER[‘HTTP_CONNECTION’] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER[‘HTTP_HOST’] //当前请求的 Host: 头部的内容。
$_SERVER[‘HTTP_REFERER’] //链接到当前页面的前一页面的 URL 地址。
$_SERVER[‘HTTP_USER_AGENT’] //当前请求的 User_Agent: 头部的内容。
$_SERVER[‘HTTPS’]//如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER[‘SCRIPT_FILENAME’] #当前执行脚本的绝对路径名。
$_SERVER[‘SERVER_ADMIN’] #管理员信息
$_SERVER[‘SERVER_PORT’] #服务器所使用的端口
$_SERVER[‘SERVER_SIGNATURE’] #包含服务器版本和虚拟主机名的字符串。
$_SERVER[‘PATH_TRANSLATED’] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER[‘SCRIPT_NAME’] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER[‘PHP_AUTH_USER’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER[‘PHP_AUTH_PW’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER[‘AUTH_TYPE’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型

比如在本博客右边侧边栏:

侧边栏

这里的IP  还有Windows10 Other-Edge浏览器类型  就是用Server获得的。

那肯定是调用了这些命令:

  • $_SERVER[‘REMOTE_ADDR’] //当前用户 IP 。
  • $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]//浏览器语言 等

做个实验 访问 http://ip.tool.chinaz.com/ 这个网站

站长之家

右侧有我们的地址 浏览器指纹信息等等。

我们再次访问这个网站 进行抓包 

bp抓包修改

修改站长

这里就变成我们修改的字符了,说这个什么意思呢,就是说我们可以利用这些在这些地方构造sql语句造成注入。

http头部注入

头部注入

头部注入就是往这些参数前进行sql的注入,前提是这些参数服务器要接受并且带入到数据库中去,不然没有用。

靶场例题

字符型的上面以及说的很清楚了,不做演示了,这里演示POST和Cookie注入

POST注入

post1

随便输入一个admin admin  然后用bp进行抓包:

post2

发现他的账密是post方式提交,于是进行常规的字符型注入,发现可以登录

post3

于是进行联合查询,成功!剩下的就跟之前的一样,什么查版本 查数据库,查表什么。。

核心源码:

可以看到POST传进来,他直接带入,我们只需要闭合单引号就好。

if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname=$_POST['uname'];
	$passwd=$_POST['passwd'];

	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname);
	fwrite($fp,'Password:'.$passwd."\n");
	fclose($fp);


	// connectivity 
	@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);

Cookie注入

打开靶场发现:

20

好像跟上面一样,按照post注入试试看!

201

发现这里开启了魔术字符,对我们输入的单引号什么的进行了转移,导致注入失败。

hh,那进行Cookie注入:

把数据报内容放在cookie里面,发现可以注入。

202

于是进行常规的方式:

203

注入成功!

那么为什么会这样,POST就魔术字符检测,Cookie就不检测。看源码:

说一下整体逻辑 他两个if 判断你POST提交是不是空,如果都是空就提取Cookie里面的参数。

代码里有一个check_input 函数,这个函数的作用就是把变量放进魔术字符里进行检测,而观察代码我们发现他只检测了POST的变量参数,没有检测Cookie,所有Cookie注入就可以绕过这个防护,当然之前我们说过魔术字符随便绕,你用post方式提交换一种编码方式照样可以绕过。

<!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>Less-20 Cookie Injection- Error Based- string</title>
</head>

<body bgcolor="#000000">
<?php
//including the Mysql connect parameters.
	include("../sql-connections/sql-connect.php");
	error_reporting(0);
if(!isset($_COOKIE['uname']))
	{
	//including the Mysql connect parameters.
	include("../sql-connections/sql-connect.php");

	echo "<div style=' margin-top:20px;color:#FFF; font-size:24px; text-align:center'> Welcome&nbsp;&nbsp;&nbsp;<font color='#FF0000'> Dhakkan </font><br></div>";
	echo "<div  align='center' style='margin:20px 0px 0px 510px;border:20px; background-color:#0CF; text-align:center;width:400px; height:150px;'>";
	echo "<div style='padding-top:10px; font-size:15px;'>";
 

	echo "<!--Form to post the contents -->";
	echo '<form action=" " name="form1" method="post">';

	echo ' <div style="margin-top:15px; height:30px;">Username : &nbsp;&nbsp;&nbsp;';
	echo '   <input type="text"  name="uname" value=""/>  </div>';
  
	echo ' <div> Password : &nbsp; &nbsp; &nbsp;';
	echo '   <input type="text" name="passwd" value=""/></div></br>';	
	echo '   <div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="submit" value="Submit" /></div>';

	echo '</form>';
	echo '</div>';
	echo '</div>';
	echo '<div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">';
	echo '<font size="3" color="#FFFF00">';
	echo '<center><br><br><br>';
	echo '<img src="../images/Less-20.jpg" />';
	echo '</center>';




	
function check_input($value)
	{
	if(!empty($value))
		{
		$value = substr($value,0,20); // truncation (see comments)
		}
		if (get_magic_quotes_gpc())  // Stripslashes if magic quotes enabled
			{
			$value = stripslashes($value);
			}
		if (!ctype_digit($value))   	// Quote if not a number
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
	else
		{
		$value = intval($value);
		}
	return $value;
	}


	
	echo "<br>";
	echo "<br>";
	
	if(isset($_POST['uname']) && isset($_POST['passwd']))
		{
	
		$uname = check_input($_POST['uname']);
		$passwd = check_input($_POST['passwd']);
		
	

		
		$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
		echo $sql;
		$result1 = mysql_query($sql);
		$row1 = mysql_fetch_array($result1);
		$cookee = $row1['username'];
			if($row1)
				{
				echo '<font color= "#FFFF00" font size = 3 >';
				setcookie('uname', $cookee, time()+3600);	
				header ('Location: index.php');
				echo "I LOVE YOU COOKIES";
				echo "</font>";
				echo '<font color= "#0000ff" font size = 3 >';			
				//echo 'Your Cookie is: ' .$cookee;
				echo "</font>";
				echo "<br>";
				print_r(mysql_error());			
				echo "<br><br>";
				echo '<img src="../images/flag.jpg" />';
				echo "<br>";
				}
			else
				{
				echo '<font color= "#0000ff" font size="3">';
				//echo "Try again looser";
				print_r(mysql_error());
				echo "</br>";			
				echo "</br>";
				echo '<img src="../images/slap.jpg" />';	
				echo "</font>";  
				}
			}
		
			echo "</font>";  
	echo '</font>';
	echo '</div>';

}
else
{



	if(!isset($_POST['submit']))
		{
			
			$cookee = $_COOKIE['uname'];
			$format = 'D d M Y - H:i:s';
			$timestamp = time() + 3600;
			echo "<center>";
			echo '<br><br><br>';
			echo '<img src="../images/Less-20.jpg" />';
			echo "<br><br><b>";
			echo '<br><font color= "red" font size="4">';	
			echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
			echo "</font><br>";	
			echo '<font color= "cyan" font size="4">';	
			echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];			
			echo "</font><br>";			
			echo '<font color= "#FFFF00" font size = 4 >';
			echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";
			echo '<font color= "orange" font size = 5 >';			
			echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
			
			
			echo "<br></font>";
			$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
			$result=mysql_query($sql);
			if (!$result)
  				{
  				die('Issue with your mysql: ' . mysql_error());
  				}
			$row = mysql_fetch_array($result);
			if($row)
				{
			  	echo '<font color= "pink" font size="5">';	
			  	echo 'Your Login name:'. $row['username'];
			  	echo "<br>";
				echo '<font color= "grey" font size="5">';  	
				echo 'Your Password:' .$row['password'];
			  	echo "</font></b>";
				echo "<br>";
				echo 'Your ID:' .$row['id'];
			  	}
			else	
				{
				echo "<center>";
				echo '<br><br><br>';
				echo '<img src="../images/slap1.jpg" />';
				echo "<br><br><b>";
				//echo '<img src="../images/Less-20.jpg" />';
				}
			echo '<center>';
			echo '<form action="" method="post">';
			echo '<input  type="submit" name="submit" value="Delete Your Cookie!" />';
			echo '</form>';
			echo '</center>';
		}	
	else
		{
		echo '<center>';
		echo "<br>";
		echo "<br>";
		echo "<br>";
		echo "<br>";
		echo "<br>";
		echo "<br>";
		echo '<font color= "#FFFF00" font size = 6 >';
		echo " Your Cookie is deleted";
				setcookie('uname', $row1['username'], time()-3600);
				header ('Location: index.php');
		echo '</font></center></br>';
		
		}		


			echo "<br>";
			echo "<br>";
			//header ('Location: main.php');
			echo "<br>";
			echo "<br>";
			
			//echo '<img src="../images/slap.jpg" /></center>';
			//logging the connection parameters to a file for analysis.	
		$fp=fopen('result.txt','a');
		fwrite($fp,'Cookie:'.$cookee."\n");
	
		fclose($fp);
	
}
?>

</body>
</html>

HTTP头部注入

这个就是对数据包中别的字段进行注入,前提是这个页面要有这个字段信息你才能注入,具体看上面。

JSON注入

json就是个结构体 以这种形式去提交数据。

注入方式是一样的,不过形式有点改变,没啥复杂的。

JON

 

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论