sqli-labs—————Less-1(字符型注入)

前言

从这一篇文章开始,我们将开始真正的讲解Sqli-libs中的各种注入,从第1阶层开始,后续的内容会陆续放出,欢迎各位大佬的关注与评论!

Less-1

首先,打开主页进入第一关:


可以看到提示,提示我们要传入一个参数,名为ID,而且是数据类型,那么我就传入该参数看看



到这里,我们可以发现后台执行的SQL语句好像是根据该传入的参数id进行了相应的查询,那么我可以从搭建的环境中来看看它的数据库到底有什么东西:

从这里我们就可以确定PHP执行的SQL语句的功能就是从数据库中查询出id为我们传入的id的那个用户,并且把得到的数据库中的用户名和密码显示出来,我们可以猜测该SQL语句的结构为:

select username,password from users where id=$_GET[id]
或者是:
select username,password from users where id="$_GET[id]"
select username,password from users where id='$_GET[id]'

这里所列的几种都是可以查询到数据的,因此如果我们要攻击这个网站的话,那么我们就需要先猜测这个页面的SQL语句是如何写的,要猜测它属于上面的哪一种情况,这样我们才可以精心构造我们的SQL语句来获取我们所想要的信息,或者对数据库进行增删改查操作、或者利用数据库软件读取或者写入服务器的文件等等。

下面我们进行一个简单的尝试

题目要求我们传入的参数id必须为整数,那么我们可以传入一个非整数来看看:


我们这里输入一个“‘  ”来做一个简单的测试


可以发现,当我们输入“ ’”的时候出现了报错,报错的内容是:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

而且从报错的内容我们可以看到它已经显示出了一部分SQL语句:

 '1'' LIMIT 0,1'

而这里的1'是我们传入的参数,那么我们就可以对刚才的猜测进行完善,可以看到我们输入的参数1’是被两个单引号括起来的,而且在后面还查询的结果进行了切片,这样查询的结果就只有一条

select username,password  from users where id='$_GET[id]' limit 0,1

那么我们刚才用畸形的参数传入之后,拼接得到的SQL语句就是

select  username,password from users where id='1'' limit 0,1

对于mysql终端来说,如果我们输入的单引号不匹配的时候,MySQL的客户端会一直去等待用户闭合这个单引号,例如:

对于SQL执行语句来说,它会认为这是一个错误的SQL语句,并且返回一个错误提示信息,那么我们再了解了这个基本的原理之后我们现在需要做的就是如何去闭合这个单引号,或者注释掉这个单引号,使得SQl语句可以正常执行。

注释语句有:

单行注释:-- 
多行注释:/**/

需要注意的是这里的单行注释是两个“-”,而且在“-”之后还有一个空格哦!

在这里我们可以想一下我们加入注释的时候sql语句的样子应该是怎样的:

select username,password from users where id='1'-- ' limit 0,1

或者

select username,password from users where id='1' # ' limit 0,1

我们做一个小测试看看:



可以从以上结果发现,语句可以正常执行,这说明后门的SQL语句都被注释掉了

注意点:

1、为什么是--+而不是--

这里字符-和字符+在URL中都是有固定的含义的 , 比如说+就在URL编码中就代表空格 , 而URL编码中-不用编码
2、为什么--+没有被URL
由于这里我们是用+代替了 , 因此不需要进行编码 , 我们也可以不用+ 而使用空格的URL编码 , 那么编码得到的URL就应该是 :
http://127.0.0.1/Less-1/?id=1%27--%20

3、#又为什么必须得编码,不编码不可以吗?

不可以 , 因为# 在URL中是有固定的含义的 , 表示页面中的锚点 , 如果不进行编码浏览器就会将其当成页面的锚点 , 而这里我们是需要将其作为数据传输给服务器的 , 因此需要进行URL编码

4、为什么不用多行注释来注释后面的语句

因为多行注释的格式是:

/*注释内容*/

在注释的前后都需要有标记,但是这里我们只能控制SQL语句的一个为止,也就是输入id的地方,所以就无法构造一个正确的多行注释,所以不可以!

接下来,我们就需要利用这个注入的将其中数据库汇总的数据一步一步的查询出来!

猜解字段长度



根据以上回显可以判读该字段的长度为3

Union联合查询概念:

这里我们将会使用到union联合查询,union联合查询的作用是将两个SQL语句进行联合。Union前后的两个SQL语句的选择列数必须相同才可以。对于union而言,如果第一个Sql查询语句为错误的话,那么它会将第二个SQL语句的查询结果作为最后的输出,这一点在我们本次的注入中十分重要。
在我们平常的使用当中,也会用到union all,它与union的区别就是增加了去重的功能。

确定回显位(从这里开始使用union)


爆数据库名

根据前面我们的推测,这里使用到的SQL查询语句提交后台应该是以下模式:

SELECT * FROM users WHERE id='-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+ LIMIT 0,1

爆数据库security中的数据表信息

此时的后台SQL语句应该为:

SELECT * FROM users WHERE id='-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+ LIMIT 0,1

爆user表中的列信息

此时后台执行的SQL语句应该为:

SELECT * FROM users WHERE id='-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+ LIMIT 0,1

爆字段数据信息

此时后台的SQL语句应该为:

SELECT * FROM users WHERE id='-1'union select 1,username,password from users where id=3--+ LIMIT 0,1

也许很多人可能会想,这里和开始有什么区别吗?只要我在开始的时候修改那个参数id的值,岂不就可以获取其他的字段信息了吗?何必如此呢?但是如果你这么想,那么你忽略了一点就是,之前的情况下,你只可以查询指定的数据库、表名、字段信息,但是现在你可以进行修改,查询其他系统的数据库的信息了!

至此,Less-1介绍结束!

总结:在less-1中主要涉及到了如何构造SQL注入语句,以及对于MySQL数据库的手工注入的流程。这里的思路非常重要!

猜你喜欢

转载自blog.csdn.net/fly_hps/article/details/80234840
今日推荐