请教一下limit 0,1为什么会影响回显

今天打sqlilab的时候发现limit0,1会影响到回显,注释掉回显正常,不注释就不正常,而且不注释会影响到之后回显的查询。想请教一下是什么原理。

这是保留limit 0.1情况,回显出现了不正常的1

img

这是不保留情况,回显也是正常的2,3

img

而且在保留情况下,后续查询也会出错,比如:
http://localhost/sqli-labs-master/Less-28a/?id=0%27) unionunion select select 333,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 and ('1'='1
结果如下:

img

想请教下这是怎么回事?

在SQLi中使用limit语句时,limit 0,1 表示只返回第一行结果。如果在某些情况下没有任何结果,这意味着该查询不会返回任何结果,因此也不会有回显。

更具体地说,在SQLi中,目标检测通常是通过布尔盲注来实现的。当我们尝试使用 limit 0,1 限制结果集时,如果查询不返回任何数据,则无法执行有效的布尔盲注攻击,因此无法获得回显。

至于为什么在保留 limit 0,1 的情况下后续查询会出错,可能是由于查询结果被限制为一行。如果查询的结果集超过限制,可能会导致SQLi引擎出错,从而影响后续操作。

建议您在使用SQLi时,根据情况选择是否使用 limit 0,1,以及如何使用它。同时,对于查询结果集的大小有限制的情况,可以逐步增加限制,以避免出现错误。

  • 这篇博客: 常用SQL语句的优化建议中的 2.如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 假设现在有employee员工表,要找出一个名字叫jay的人.

    CREATE TABLE `employee` (
    `id` INT ( 11 ) NOT NULL,
    `name` VARCHAR ( 255 ) DEFAULT NULL,
    `age` INT ( 11 ) DEFAULT NULL,
    `date` datetime DEFAULT NULL,
    `sex` INT ( 1 ) DEFAULT NULL,
    PRIMARY KEY ( `id` ) 
    ) ENGINE = INNODB DEFAULT CHARSET = utf8;
    

    反例:

    SELECT
    	id, NAME 
    FROM
    	employee 
    WHERE
    	NAME = 'jay'
    

    正例

    SELECT
    	id, NAME 
    FROM
    	employee 
    WHERE
    	NAME = 'jay' 
    	LIMIT 1;
    

    理由:

    • 加上limit 1后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。
    • 当然,如果name是唯一索引的话,是不必要加上limit 1了,因为limit的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有limit ,性能的差别并不大。