sqli-labs(11-20)

如果要说11-20和1-10有什么不同的,我觉得最大的不同就是1-10都是GET型注入,而从11开始便是以POST注入为主以及其它几种注入点(referercookie等等)为辅了。

Less-11

考点:POST型注入、字符型注入(单引号)、联合注入

判断为单引号闭合

 用与GET型的联合注入相同的方法。

这个数据表的列只有两个与之前的三个有点不同

 随便在哪个点注入即可,利用之前讲过的查库、查表、查列、查字段。

Less-12

考点:POST型注入、字符型注入(双引号+小括号)、联合注入

用双引号测出错误,看到应该是双引号和小括号的闭合,我们构造闭合再注释之前的闭合。

 成功了,老方法,用order by 判断列数,用联合注入查库、查表、查列、查字段

 后面的操作和之前的一样。

Less-13

 考点:报错注入、POST型注入、字符型注入(单引号+小括号)

可以看到,是使用的单引号小括号闭合数据的,但是正确的输入没有回显,尝试使用报错注入,

有回显,我们利用这个查库、查表、查列、查字段。 

 查表时因为有多个表,如果没有用group_concat()我们需要用limit 限制数量查询。

Less-14

考点:报错注入、POST型注入、字符型注入(双引号)

用双引号把报错信息回显出来,我们看到应该是双引号闭合,测试一下报错注入能不能用

好吧,正常使用,那就和上一题的解法思路一模一样了。 

Less-15

考点:布尔盲注、POST型注入、字符型注入(单引号)

看看源码,正确和错误的sql语句回显的图片不同,而mysql_error()被注释了,所以这里无法使用报错注入,我们能利用到的就是盲注,因为正确和错误的回显不同,所以我们使用布尔盲注

可以看到sql语句是用单引号闭合的,

 果然,回显不同。我们使用之前做过的布尔盲注的方法,跑burp或者写脚本,也可以手注,还有一种方法就是跑sqlmap。我演示手注查库,

先用Length()确定库的大致长度

确定了库的长度为8,我们就查库的ASCII码,从第一位到第八位查出来,

 先用大于小于号确定大体范围,再用等于号判断是否等于,

所以ASCII码115为字符s,再查一个,

经过测试得到ASCII码为101对应的字符为e,以此类推,我们的库就可以查出,表、列、字段也可如此。

Less-16

 考点:布尔盲注、POST型注入、字符型注入(双引号+小括号)

 

 除了闭合与上一题不同,其解法和上一题一模一样,就不细说了。

Less-17

考点:POST型注入、报错注入、字符型注入(单引号)、代码审计

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,15);
		}

		// Stripslashes if magic quotes enabled
		if (get_magic_quotes_gpc())
			{
			$value = stripslashes($value);
			}

		// Quote if not a number
		if (!ctype_digit($value))
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
		
	else
		{
		$value = intval($value);
		}
	return $value;
	}

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);  

$passwd=$_POST['passwd'];


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


// connectivity 
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
	if($row)
	{
  		//echo '<font color= "#0000ff">';	
		$row1 = $row['username'];  	
		//echo 'Your Login name:'. $row1;
		$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
		mysql_query($update);
  		echo "<br>";
	
	
	
		if (mysql_error())
		{
			echo '<font color= "#FFFF00" font size = 3 >';
			print_r(mysql_error());
			echo "</br></br>";
			echo "</font>";
		}
		else
		{
			echo '<font color= "#FFFF00" font size = 3 >';
			//echo " You password has been successfully updated " ;		
			echo "<br>";
			echo "</font>";
		}
	
		echo '<img src="../images/flag1.jpg"   />';	
		//echo 'Your Password:' .$row['password'];
  		echo "</font>";
	


  	}
	else  
	{
		echo '<font size="4.5" color="#FFFF00">';
		//echo "Bug off you Silly Dumb hacker";
		echo "</br>";
		echo '<img src="../images/slap1.jpg"   />';
	
		echo "</font>";  
	}
}

?>

 这个题目盲做很难受,所以我们在这里需要分析源代码,源代码我们挑几个点看就好了,get_magic_quotes_gpc()函数是为后面会出现的宽字节注入做铺垫的,我们可以看到uname参数被传入了check_input()函数中做了检验,当然passwd,并没有,如果想从uname下手很麻烦

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,15);
		}

		// Stripslashes if magic quotes enabled
		if (get_magic_quotes_gpc())
			{
			$value = stripslashes($value);
			}

		// Quote if not a number
		if (!ctype_digit($value))
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
		
	else
		{
		$value = intval($value);
		}
	return $value;
	}

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);  

$passwd=$_POST['passwd'];

相比于uname,我们的passwd就是一个没有限制的变量,我们对它下手,而且根据代码审计我们发现报错注入应该是可以使用的,

if (mysql_error())
		{
			echo '<font color= "#FFFF00" font size = 3 >';
			print_r(mysql_error());
			echo "</br></br>";
			echo "</font>";
		}

可以看到,在passwd注入成功,我们就可以用查表查列查字段执行了。但是你们可以在uname试一下,肯定不可能成功。 

Less-18

考点:User-Agent注入、报错注入、巧用闭合

看过源码,发现passwduname这波都被过滤的很严重,所以基本不能使用了,

	$uname = check_input($_POST['uname']);
	$passwd = check_input($_POST['passwd']);

但是有个东西很关键,

$uagent = $_SERVER['HTTP_USER_AGENT'];

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

print_r(mysql_error());

这三行代码,很关键,第一行uagent没有限制,我们可以通过在http头部控制User-Agent控制HTTP_USER_AGENT这个全局变量。

第二行把uagen传入到数据库中去,而且第三行开启了报错,所以我们可以通过利用报错注入对User-Agent大胆的注入使其实现报错注入,但是因为限制了三个参数,后面两个我们管不着,所以我们想办法让第一个参数自然闭合,怎么做呢?看下面我的payload就会明白了。

然后就实现了报错注入,后面的查表、查列、查字段就不演示了。 

Less-19

考点:referer注入、字符型注入、报错注入

	$uagent = $_SERVER['HTTP_REFERER'];
	$IP = $_SERVER['REMOTE_ADDR'];

全局变量HTTP_REFERER来自referer字段,我们只需要改变http请求的referer值即可控制uagent变量,则又回到了上一题的方法了,与上一题的解法也只是大同小异罢了。

注意看我注入点在哪,后面的操作还是一样,简单的查表、查列、查字段

Less-20

考点:cookie注入、联合注入、字符型注入

这个cookie的删除就提示我们了,他把账号和密码存在cookie中,我们可以尝试修改cookie的值来达到注入的目的,先看看cookie的值,

 cookie果然有,所以我们在这里修改cookie的值,修改完后刷新一下界面即可执行cookie值。

单引号闭合,

有账号密码的回显,猜测多半是联合注入了。

中间省略了用order by查列数量,自行操作,后面的就是常规的查库、查表、查列、查字段。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

errorr0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值