limit和not in语句的理解

sechub官方2023-07-03文章来源:SecHub网络安全社区


一、limit语句含义

常见场景

在执行报错注入或者布尔盲注时一般都会碰到

1.png

直译过来意思就是"查询返回信息超出一行",因为group_concat()函数最大长度为64位,我们插入的语句和查询的返回的所有数据库的字符加起来超过了一行最大长度64位,没法一行输出,就需要我们将查询结果一个一个输出,这里就需要用到限制语句limit了。

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。limit 1 ≈ limit 0,1

如何理解?

用游标卡尺举例:limit n,m第一个参数偏移量代表游标卡尺偏移量,第二个参数代表要获取偏移量后面的多少条数据,所以limit 0,1表示从第一行开始遍历,只取第一行的一条数据即可。limit 1,1表示从第二行开始遍历,只取第二行的一条数据即可。

limit语句和C语言数组一样都是从0开始,第一个是0,第二个是1

偏移量在这里就是从第几行开始查看数据,limit3,4就是从第四行(因为是从0开始的,0就是第一行)开始查看数据,要查看四行数据

2.png

二、limit示例

示例一

3.png

limit N表示直接查询N行数据

4.png

limit N,M 第一个参数表示从第N行数据开始查,第二个参数表示查M条数据

5.png

示例二

MySQL中所有数据库名如下:

information_schema,challenges,mysql,performance_schema,security,sys

limit 0,1得到第一个数据库名

注意:这里如果如第二个图一样返回查询数据大于一行则重复提交即可,属于语句执行问题

6.png

7.png

limit 1,1第二个数据库名

8.png

limit 2,1第三个数据库名

9.png

想一想

一共六个数据库,我们输入到5,1即可全部遍历,那么如果输入到6,1超过最大行会怎样呢?超出之后为什么会是那种情况呢?可以自行尝试一下

三、IN和NOT IN运算符

MySQL中IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。

NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不位于给出的列表中;如果不是,返回值为 1,否则返回值为 0。

四、IN、NOT IN用法

两者如下,效果完全相反,

mysql> SELECT 2 IN (1,3,5,'thks'),'thks' IN (1,3,5, 'thks');
+---------------------+---------------------------+
| 2 IN (1,3,5,'thks') | 'thks' IN (1,3,5, 'thks') |
+---------------------+---------------------------+
|          0 |             1 |
+---------------------+---------------------------+
1 row in set, 2 warnings (0.00 sec)
mysql> SELECT 2 NOT IN (1,3,5,'thks'),'thks' NOT IN (1,3,5, 'thks');
+-------------------------+-------------------------------+
| 2 NOT IN (1,3,5,'thks') | 'thks' NOT IN (1,3,5, 'thks') |
+-------------------------+-------------------------------+
|            1 |               0 |
+-------------------------+-------------------------------+
1 row in set, 2 warnings (0.00 sec)

对NULL空的处理

当 IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 1。

mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,3,NULL,'thks');
+------------------------+-------------------------+
| NULL IN (1,3,5,'thks') | 10 IN (1,3,NULL,'thks') |
+------------------------+-------------------------+
|          NULL |           NULL |
+------------------------+-------------------------+
1 row in set, 1 warning (0.00 sec)
mysql>  SELECT NULL IN (1,3,5,'thks'),10 IN (1,10,NULL,'thks');
+------------------------+--------------------------+
| NULL IN (1,3,5,'thks') | 10 IN (1,10,NULL,'thks') |
+------------------------+--------------------------+
|          NULL |             1 |
+------------------------+--------------------------+
1 row in set (0.00 sec)

NOT IN 恰好相反,当 NOT IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 0。

mysql>  SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,0,NULL,'thks');
+----------------------------+-----------------------------+
| NULL NOT IN (1,3,5,'thks') | 10 NOT IN (1,0,NULL,'thks') |
+----------------------------+-----------------------------+
|            NULL |             NULL |
+----------------------------+-----------------------------+
1 row in set, 1 warning (0.00 sec)
mysql>  SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,10,NULL,'thks');
+----------------------------+------------------------------+
| NULL NOT IN (1,3,5,'thks') | 10 NOT IN (1,10,NULL,'thks') |
+----------------------------+------------------------------+
|            NULL |               0 |
+----------------------------+------------------------------+
1 row in set (0.00 sec)

由上可得出结论:NOT IN结果集中不能有NULL,否则无法正确查询结果

五、SQL注入中的使用

in、not in其实与where、and等类似,也是一种限制条件,使用他们和使用and、not and效果一样。

可用于查询到某一个或几个数据库名、表名、列名的情况下。如下表示从users表中查询username这个列,查询范围为——username不是——Dumb和Angelina——的值。

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina'))))--+