渗透测试基础-显错注入

只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!

显错注入是什么

显错注入,咱们从字面意思分解开来看,无非就是:这种注入,会让错误显示出来,那为什么会显示出来呢,我们一步步来了解。

网站错误显示

人家一个网站好好的放在那,你不对其做出一些操作,它正常情况下,是不会出错的,毕竟有因才有果,这个因就是我们对其输入了恶意的尝试语句,导致其并没有朝着网站原本开发的思路去运作,才显现出了这个果(报错)。那现在好了, 明白了咱们来具体看看这个因是怎样让其生成这个

恶意语句的尝试

常用的恶意尝试语句有,添加不可用条件,添加单双引号

  1. 添加条件 : 比如and 1=1,and 1=2,页面发生变化,则大概率确定这个点存在sql注入(不单单只有这个,如还有基于时间的判断sleep,当然这个属于时间型注入了)
  2. 添加单双引号 : 一个网站页面,无非就是去访问那台服务器的某个文件,文件多的话,就需用GET传惨的方式,服务器来接受需要访问页面的值,这样才能正确的去显示那个文件内容。既然是接受值,语句大多是这样的select * from new where id = '1'这时,如果我们在1这个位置改变内容的话,其实全部都输入到了引号里面,这就是问题所在了,引号里面的内容,全都是字符串,是不会起到实际功能作用的,所有我们得逃逸出来。这样就用单引号先将前面的语句闭合,输入测试语句,最后在将后面的语句注释掉,这样就让语句得到了用处;select * from new where id = '1' select 1,2 -- qwe'

进入靶场看看实际情况

在这里插入图片描述

靶场的语句非常的典型,也贴心的将当前数据库所执行的语句贴了出来,方便我们的观看

在这里插入图片描述

在这值得我们注意的是,这里并没有我们前面所说的单双引号来去获得这个GET传参,所以我们也没必要在前面加上单引号或者双引号去闭合它。直接尝试一下我们另外一个测试语句,and 1=1 或者 1=2 去看页面的变化。

在这里插入图片描述
在这里插入图片描述
咱们在这明显看到了页面发生了变化,当条件为false时(and 1=2),sql语句不成立,导致页面错误的显现,条件为True时(and 1=1)条件成立,页面正常显示。那这就基本判定存在sql注入了。接下里就去找到更多的信息

进一步尝试的测试语句

既然这里确认有sql注入的存在了,那我们就一步步来获得数据,先来判断这个地方会不会存在显错地方,用select 1,2,3这样的语句可判断字段数,当输入的字段数,网站实际并没有时,网站就会报错。(当然这是需要联合查询来实现的,联合查询是union。就是去查询两个东西,将两个查询到的数据联合了显示出来,这样就会出现一个问题,前者的语句可能会导致我们的语句,显现的不明显,所以我们在前面加上and 1=2让其条件为False,不让其正常显示,以确保不影响我们的语句。但是咱这个靶场呢,不需要这样去显示条件,因为它并没有什么需要显示,前面加上了and 1=2反而会影响我们的判断)
在这里插入图片描述在这里插入图片描述

实际语句如下:select *from user where id=1 union select 1,2,3

这样就确定了当前位置为三个字段,且我们输入的1,2,3当中2和3显现了出来,说明这个就是报错点了,像这样能明显看到错误点或有明显特征的,我们统一叫其为 显错注入。既然到这了,就得引入一个新知识点了,在mysql5.0以上,存在这样一个自带库,库名叫做information_schema的库,这个库,存在mysql数据库里面所有库名与标明的对应。来实际看一下详情🔎

Mysql 自带库的巧用

在这里插入图片描述
在这里插入图片描述

这个自带库,有很多的表,我们只需要看两个表就好tables表,和columns表(如上图所示)

在图中我们发现,我自己创建的库名schoolinformation_schema库里的字段table_schema是一一对应的,也就是说,通过查询语句的条件限制,是能实现表名的查询的。

information_schema库里面的另外一个表columns,它的作用是,在得到表名之后,可用来限制条件,得到相应的库名

在这里插入图片描述
上图既然得到了数字2和数字3是显错点,那我们的需要的数据,就让他在这里显示出来,将需要知道的tables里面的table_name放在显错位的位置上

语句如下:

union select 1,2,table_name from information_schema.tables where table_schema=database()

在这里插入图片描述

这样就得到了第一个表明,但是看样子,并不是我们需要的flag。所有在末尾加上limit 0,1 ,将数据一个个遍历出来

语句如下:

union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1

在这里插入图片描述
找到了比较感兴趣的表名,将这个表名,放入information_schema.columns中,来限制条件,得到其字段名。

语句如下:

union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='error_flag' limit 0,1

在这里插入图片描述
注意图中三个框框的地方,由以前的information_schema.tables切换为了information_schema.columns,所以,我们对应的输出点,也需要改变,末尾也加上前面得到的表面,来缩小范围。接下来继续用limit 0,1去查询可疑字段名。

在这里插入图片描述

limit 2,1找到了flag字段。有了字段,有了表明,那就能直接得数据了。

语句如下:

union select 1,2,flag from error_flag limit 0,1

在这里插入图片描述
字段填入显错点的位置,让其数据显示出来,表名填入刚刚获取的,用limit再次遍历数据

在这里插入图片描述
limit 1,1中得到了我们想要的数据。

这篇文章下来,算是非常基础的sql注入内容,在实际的情况中,会比这样的复杂很多,比如前面提到的,输入的数据在引号,或者括号中。比如下面的靶场
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
他们的做法,其实也变化不大,将其前面的数据闭合就好,分别做法如下:

  1. select *from user where id=‘1’' and 1=2-- qwe
  2. select *from user where id=(‘1’)') and 1=2-- qwe
  3. select *from user where id=(’“1”)") and 1=2-- qwe

漏洞总结

大多数注入的攻击方法,防护手段也基本都差不多,那就是过滤,不让其传入特殊符号,比如上面有用到的单双引号,括号,井号这样的。-- qwe这样的可以用正则表达式将其过滤。

《最好的防御,是明白其怎么攻击》

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jinxya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值