数字型注入和字符型注入原理

vFREE
2021-03-31 / 0 评论 / 200 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月01日,已超过543天没有更新,若内容或图片失效,请留言反馈。

我喜欢你,从满心欢喜到满目疮疾

---网抑云热评


SQL注入简单来说就是后端对用户传入的数据没有进行一个合法性的审查,导致用户构造一个恶意的语句传入后端拼接原有SQL查询语句继续查询,从而得到用户想要得到的数据信息


SQL注入在几年内,从没有落榜于OWASP top 1中,可见,SQL注入在网络中危害性

目前流行的注入大致有

  • 字符型注入
  • 数字型注入
  • 联合注入
  • 布尔盲注
  • 时间盲注
  • 堆叠注入
  • 报错注入
  • 宽字节注入

......


数字型注入原型查询语句:

select * from xxx where id=.$_GET[id]

检测方法

url/auth.php?a=-1 or 1=1# //正常

url/auth.php?a=-1 or 1=2#  //错误

为什么是-1呢?因为-1很明显是没有这个页面的,用什么数值都行,但是要输出不出来内容的数值,比如是1000000000或者-1000000,一个服务器如果是用数值去调取页面的话,完全可以构造一些不存在的数值去引发错误,然后再接上or 1=1输出正确,or 1=1永远为真,即使前面的是错误的,依然可以通过or 1=1输出一个正常的页面,因此-1是啥也不返回,然后如果再搭配or 1=1就可以确定是否有注入

or就是或者,即使前面的数据为假,后面也会执行,a后面的内容会带到数据库中去查询,所以完整的查询语句就是:

select * from xxx where id=-1 or 1=1;

or 1=1在数据库中会输出全部数据,1永远等于1,所以会输出全部数据

通过or 1=1可以判断出来是否有注入,除此之外,还有and

and是与,只能前面是真的,后面才会执行,比如说1 and 1=1

url/auth.php?a=1 and 1=1# //正常

url/auth.php?a=1 and 1=2#  //错误

也是同样的道理,如果前面为真,才会执行后面的,1永远等于1,但是不会等于2,所以根据这个特征可以判断出是数值型注入还是字符型注入


字符型注入原型查询语句

select * from xxx where id=."'$_GET[id]'"

相比数字型注入多了个引号

字符型注入和数字型注入的用法其实也算是大同小异的,但是在拼接语句的适合,要加一个单引号,比如这样子:

url/auth.php?a=-1' or 1=1# //正常

此时的sql查询语句就是  select * from xxx where id='-1' or 1=1;

如果不加单引号的话,就会变成  select * from xxx where id='-1 or 1=1';

看起来好像没啥区别,实际上区别很大,一个是查询-1,一个是查询-1 or 1=1,如果查询-1 or 1=1肯定查不出什么东西,因此我们要闭合掉原有的引号,然后才可以正确执行

有人会问,那闭合掉前面的引号的话,原本的引号怎么办呢?

注意看前面出现的#号,#相当于一个结束符号,也就是说#后面的语句是不会执行的,所以#号后面的单引号也就是不会执行,所以不会报错


除此之外,在MySQL中,有一个特性和php很像,就是强制类型转换,如果等于号两边的类型不相等,字符会强制转换成数值,人菜话不多,如图所示

 

注:部分图片源自于网络,如有侵权,请联系删除!!!谢谢

0

评论 (0)

取消