sqli-labs Basic Challenges Less-1

Sqli-labs是一个练习sql注入非常nice的一个靶场,几乎涵盖了所有的注入类型。我们从今天就开始以这个靶场为基础学习sql注入吧。

靶场的安装十分简单,这里就不再过多阐述了。安装完成靶场的界面如下:

可以看到总共有4种不同难度的划分,先点击Basic Challengs看看最基础的。

基础注入一共有22关,让我们开心的学习起来吧。

Less-1 GET - Error based - Single quotes - String

从名字就能够了解到第一关应该是基于报错的,单引号的字符型注入(get方式)。

打开链接提示我们需要输入一个数字型的id参数。

我们构造id=1再进行访问

中间的执行语句是我自己添加的只是为了更加直观的看到带入数据库中执行语句的结构。

针对于注入,首先就是判断是否是注入点,是什么类型的注入

先在参数后面加单引号’

http://www.bj.com/sqli-labs/Less-1/index.php?id=1'

可以看到报错了,而且返回的错误信息是

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

注意最后的''1'' LIMIT 0,1'

最外层两个引号只是起到将错误信息括起来的作用,所以实际错误是'1'' LIMIT 0,1

这里可以清楚看到引号是不成对的,其中一个引号是我们自行输入的,那么外面的两个引号就必然是程序中自带的。那么结合页面的执行语句也就清楚了什么是单引号的字符型注入了。

当正常访问时带入数据库执行的语句如下:

SELECT * FROM users WHERE id='1' LIMIT 0,1

可以看到id参数的值被单引号包含起来了,那么我们再在id参数后添加单引号自然就变成了

SELECT * FROM users WHERE id='1'' LIMIT 0,1

很明显引号不成对出现,数据库执行不了出错也是理所应当的。

知道了是单引号类型的字符型注入,我们肯定要思考如何将引号闭合再添加我们想要执行的语句了。

前面的引号很容易闭合,直接在参数后面加一个单引号即可,但是后面的单引号如何处理才能不影响我们执行sql语句呐?

这里就要用到注释了。在mysql数据库中,单行注释有#和--(空格),在实际操作中#号一般用%23来表示。而-- 则用--+来表示。因为在URL中,如果在最后加上-- ,浏览器在发送请求的时候会把URL末尾的空格舍去,而用--+代替-- ,此处的+在URL被URL编码后会变成空格。

所以我们先尝试一下将前后引号处理了再构造其他语句。

可以看到前面的引号被闭合,后面的引号被注释掉了。页面完成了正常的sql查询。

知道了注入点是字符型之后,我们就需要知道此刻查询的表有多少字段(列)了。

此处应构造order by来查询该表的字段数。order by的原理是对查询的结果进行排序。order by 1就是按该表第一个字段的顺序对整个查询结果排序,当后面跟的数字大于了表中字段总数了肯定就会出错。

我们先访问

http://www.bj.com/sqli-labs/Less-1/index.php?id=1'  order by 3 --+

可以看到页面正常,此处执行的语句意思就是查询users表中id=1的所有结果,并对结果集按照第三个字段的顺序来排列。

再次查询order by 4的时候却报错了。说明该表中只有三个字段,想要把结果集按照第四列的顺序来排列当然就出错了。

确定了当前查询的表的字段数之后,我们接下来要确定的是回显到页面上的哪几个字段的内容。

这里就要用到union联合查询了。

union联合查询将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。

这么说可能不太好理解,我先举个例子

从这个页面的执行语句来说,前面一个select查询的是users表中id=1的所有结果,union后面的一个select则是查询了1,2,3

union联合查询时,必须多个查询的字段数是一样的,因为如果前一个有3列而后一个有5列的话,查询所得的结果集无法合并显示。只有两个的列数一样,最后返回来的结果集的列数才是一样的,才能够联合到一起。

还有一个点就是UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同。另一个Select语句的结果集列名将被忽略。当前一个查询为空的时候后面查询的内容自然就显示在了最前面了。

这里构造的语句也是一样的,给了id参数为-1,正常的话肯定不会用负数来作为id值,所以前面一个语句肯定是无法查询到内容的,自然返回的结果集就是后面一个查询,也就是1,2,3

程序针对于查询的结果肯定是会选择哪一列的值显示在页面的什么位置。此处页面明显显示了2,3。意思就是针对结果集选择了第2列和第3列的内容来显示到页面的对应位置。

知道了页面回显的是哪个位置的内容之后,我们就可以有针对性的构造查询语句了。

一般的我们会查询当前连接数据库的用户,当前数据库名,以及数据库的版本信息等。

查询用户名和数据库名

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,user(),database() --+

可以看到当前连接数据库的用户是root,使用的数据库是security。

查询数据库版本

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,2,version() --+

可以看到数据库版本为5.7.26。为什么要查询数据库的版本呐?

因为在mysql5.0版本之后产生了一个名为information_schema的数据库,该数据库类似于“数据字典”,提供了访问数据库元数据的方式,即数据的数据。在该数据库中保存着如所有数据库名或表名,列名,访问权限等数据。利用这个数据库我们的注入过程会更加容易。

先来了解一下information_schema数据库的结构

该数据库中最重要的就是三个表:shemata、tables、columns

  1. schemata表中的schema_name字段存放着所有的数据库名
  2. tables表中的table_schema存放着数据库名,table_name则是对应的表名
  3. columns表中的table_schema存放着数据库名,table_name存放着表名,而column_name则存放着所有对应的字段名了。

 

注入攻击主要就是要非授权的访问数据库中的敏感信息,尤其是存储用户名和密码的表中的信息,因此上述几个表在注入过程中是非常有用的。

前面我们已经知道了当前数据库名、用户名、字段数。接下来我们迫切需要知道的肯定就是存放用户名和密码的表名、字段名和内容啦。

先看看数据库服务器中到底有哪些数据库吧

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,2,group_concat(schema_name)  from information_schema.schemata --+

 

此处列出来的就是我本地mysql中的所有数据库名了。可以看到其中就有之前通过database()查询出来的当前所使用的数据库security。

知道数据库名了,接下来就要查询数据库中有哪些表。

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,2,group_concat(table_name)  from information_schema.tables where table_schema='security'--+

可以看到security数据库中一共有四个表,分别为:emails、referers、uagents、users。

通常用户名和密码肯定是存储在users表中的。确定了表名,接下来就是看其中的字段有哪些了。

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,2,group_concat(column_name)  from information_schema.columns where table_name='users' and table_schema='security'--+

可以看到返回了三个字段,跟开始判断的字段数也是吻合的,并且这里返回的字段名中有很明显的username和password。这就是存储用户名和密码的字段无疑了。

既然字段名也知道了,那么肯定是要查询其中的数据了。

http://www.bj.com/sqli-labs/Less-1/index.php?id=-1'  union select 1,group_concat(username,':',password),3 from security.users--+

可以看到用户名和密码都被列出来了。

因为是第一关,很多知识点又需要穿插进来所以篇幅较长,后面的文章中对于前面提到过的知识点将不再赘述。希望通过我的文章能够使读者明白sql注入到底一种什么样的攻击方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值