在网上看了那些方法,总的来说,我觉得有些绕。今天练习sqli-libs的时候自己遇到了问题,自己琢磨琢磨就想到了这些方法。

废话不多说,下面开始吧!

方法一:order by法

构造payload为:id=1 order by 9999 --+

  • 如果正确返回页面,则为字符型
  • 否则,为数字型

分析:
字符型执行的sql语句为 select * from user where id='1 order by 9999 --+' ,注释符【- -】实际上在执行的时候,被当成id的一部分,也就是说,在执行sql语句的时候,条件是 id='1 order by 9999 --+'。最终只会截取前面的数字,返回 id=1 的结果。
如果是数字型的话,执行的sql语句为 select * from user where id=1 order by 9999 --+ ,在现实生活中,根本就没什么可能会存在有9999个字段的表,所以会报错。

方法二:逻辑判断法

这就很简单了,就是猜,但是也得知道一点技巧。

比如说,id这种,一般在数据库存储为int类型的,在查询时,可能是数字型,也可能是字符型。

但是,如果是name或者username之类的,按正常逻辑,一看就知道是以varchar或者char存储的,那指定就是字符型了,因为不加引号,sql语句绝对报错。

就像这样:

image-20230704122423046

如果不加引号,就会报错:

image-20230704122440609