SQLI-lab通关(1)

首先就是安装靶场环境,这个步骤很简单装过环境的同学肯定不陌生,phpstudy环境,然后sqli-lab搭建就可以了,在这里就不赘述,大家自行百度吧。

首先第一关

看到一个网站如何来验证他有没有注入漏洞,很简单利用' and 1=2这个语句来判断。

为什么呢?

很简单,SQL注入漏洞的原理就是没有对用户输入的内容进行严格的过滤和筛选导致把用户输入的内容当做是SQL语句的一部分执行,从而导致数据库被破坏,那么来判断他有没有注入漏洞就是看我们用户输入的内容会不会拼接到SQL语句然后被执行。

下面给大家列举一些常见的测试payload

1. ' and 1=1 | “ and 1=1  | and 1=1 | and 1=2 
2. ’ && 1=1 | ” && 1=1   |  && 1=1 | && 1=2
3. ‘ || 1=1 | “ || 1=1  | || 1=1 | || 1=2
4. %' and 1=1 | %” and 1=1 | %' and 1=2 | %“ and 1=2

那么如上图所示,我们拼接一个属性id

输入' and 1=2来查看返回结果,很明显有报错提示,注意这个报错一看就跟sql语句有关,那么可以肯定这里存在SQL注入。

 我们确定这里是注入点以后接下来就要猜解他的列。

利用SQL关键字order by这本身是用来排序的

order by 1表示对第一列进行排序,那么我们用这个关键字来猜列的原理就是order by n会返回正确的结果,而n+1是错误的,就表示数据库有n列。

而这里报错的payload就是-1' order by 4--+

“--+”的含义是注释意思就是注释掉后面的SQL语句。同理还有#,一般实战过程中这两个都试试,因为有的会设置防御规则,不一定就把那个符号过滤掉了。

前面为什么是单引号

 

下面这个是单引号,这里报错大概的意思就是把原本SQL语句id=' '的单引号闭合掉了,而我们输入的内容就是引号里面的东西,我们既然闭合掉前面的了,那么后面的就单着了,而我们的payload中使用--+注释掉后面的单引号了,这里注释掉的意思就是不作为SQL语句继续执行了;那么他就会执行前面的内容。 

在这里我还测试了" )等,在这里有一个小技巧就是"1" limit 0,1'

去掉两边的跟自己输入的,在这里就是去掉左边的双引号,跟最右边的单引号,就剩下中间的一个双引号而在这里我们输入的是单引号,那么payload中就是用一个单引号【这个是我自己总结出的部分经验也不知道准确率如何,目前看来是挺高的,只有无计可施的时候可以想想这个技巧】

现在我们已经猜出来数据库一共有三列了。

那么接下来就是查询

查询我们经常采用的就是联合查询union

union这个函数的要点就是必须前后列一致,利用在SQL注入当中的原理就是数据库 union select 1,2,3--+

前面是我们要查询的数据库,前面数据库有几列后面必须有几列,注意这里的1就是1列,2是一列,3是一列,因为之前利用order by 猜出来数据库三列,所以这里就设置三个数据。【其实利用order by 和union的时候如果遇到那种数据库比较大的,可以尝试暴力破解】

使用-1' union select 1,2,3--+

我们如上图可以看出来2和3的位置可以看到回显也就是数据库里面查询到的内容显示的地方。

那么我们就可以在2,3的位置输入我们想知道的东西。

在这里前面为什么是-1,而不是1呢,我们得保证前面查询出来的是错误的结果,因为前面是正确的内容会一直显示正确的东西就不会执行后面的了,因为你后面的在数据库中根本没有,你只有前面是错的了,最终才会报错。比如union select代表左右结果合并,你前面在数据库中已经有结果了,那后面是啥都不重要了。

 

我们在2的位置用database()来替换就可以查到这个数据库的名字security。

查到数据库名,接下来就是表名,列名等。

这里就需要大家熟悉SQL语句了,没有学习的同学先去学习SQL语句吧。

 

为了接下来的内容,在这里给大家做一个扩展,这里我们需要了解数据库版本信息,这是为什么呢。

1.在MYSQL5.0以上版本中存在自带数据库information_schema,他是一个存储所有数据库名,表明,列名的数据库,相当于可以通过查询此库获得相应信息。(没有的话只能靠猜,暴力破解)

2.符号“.”代表下一级:

 Information_schema.tables:

Information_schema.columns:

schemata中只有schema_name就是库名

tables中有table_name和table_schema存有库名和对应的表名信息

columns中有table_name,table_schema和columns_name

 现在其实我们渗透的大部分网站都是有information_schema这个数据库的,但是为了以防万一碰到那种很久以前的站,所以大家需要先了解一下这个知识点。

简单来说就是我们可以利用information_schema来查找数据库名,表名,列名等。

我们已然知道了库名,那么接下来就是表名,列名,哪个表里有表名呢参考上面,哎,没错tables中有表名,那么构造语句

?id=-1' union select 1,2,group_concat (table_name) from information_schema.tables where table_schema="security"

这里为什么要用group_concat呢,因为这是一个拼接函数就是把查询到的结果都显示出来,就是把information_schema.tables表中所有table_schema是security的表名都拼接起来。

知道表名接下来就是字段名,在users中查找相关内容。

 

?id=-1' union select 1,2,group_concat (column_name) from information_schema.columns where table_name="users"

以上就是第一关全部内容,刚开始废话有点多,便于理解,到后面就会削削草率了。 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值